/* $Id$ */
+#define _WINSOCKAPI_
#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
#ifdef HAVE_CONFIG_H
static char *pretty_key(char *key, int key_len, int uctitle, int xhyphen);
+static int http_ob_stack_get(php_ob_buffer *, php_ob_buffer **);
+
/* {{{ HAVE_CURL */
#ifdef HTTP_HAVE_CURL
#define http_curl_initbuf(m) _http_curl_initbuf((m) TSRMLS_CC)
static inline char *_http_etag(char **new_etag, const void *data_ptr,
const size_t data_len, const http_send_mode data_mode TSRMLS_DC)
{
- char ssb_buf[127], digest[16];
+ char ssb_buf[127];
+ unsigned char digest[16];
PHP_MD5_CTX ctx;
PHP_MD5Init(&ctx);
break;
case SEND_DATA:
- return len == php_body_write(
- Z_STRVAL_P((zval *) data) + begin, len TSRMLS_CC)
+ return len == php_body_write(((char *)data) + begin, len TSRMLS_CC)
? SUCCESS : FAILURE;
break;
}
/* }}} */
+/* {{{ static STATUS http_ob_stack_get(php_ob_buffer *, php_ob_buffer **) */
+static STATUS http_ob_stack_get(php_ob_buffer *o, php_ob_buffer **s)
+{
+ static int i = 0;
+ php_ob_buffer *b = emalloc(sizeof(php_ob_buffer));
+ b->handler_name = estrdup(o->handler_name);
+ b->buffer = estrndup(o->buffer, o->text_length);
+ b->chunk_size = o->chunk_size;
+ b->erase = o->erase;
+ s[i++] = b;
+ return SUCCESS;
+}
+/* }}} */
+
/* }}} internals */
/* {{{ public API */
}
/* }}} */
+/* {{{ STATUS http_start_ob_handler(php_output_handler_func_t, char *, uint, zend_bool) */
+PHP_HTTP_API STATUS _http_start_ob_handler(php_output_handler_func_t handler_func,
+ char *handler_name, uint chunk_size, zend_bool erase TSRMLS_DC)
+{
+ php_ob_buffer **stack;
+ int count, i;
+ STATUS result;
+
+ count = OG(ob_nesting_level);
+ stack = emalloc(sizeof(php_ob_buffer *) * count);
+
+ if (count > 1) {
+ zend_stack_apply_with_argument(&OG(ob_buffers), ZEND_STACK_APPLY_BOTTOMUP,
+ (int (*)(void *elem, void *)) http_ob_stack_get, stack);
+ }
+
+ if (count > 0) {
+ http_ob_stack_get(&OG(active_ob_buffer), stack);
+ }
+
+ while (OG(ob_nesting_level)) {
+ php_end_ob_buffer(0, 0 TSRMLS_CC);
+ }
+
+ php_ob_set_internal_handler(handler_func, 0, handler_name, 0 TSRMLS_CC);
+ result = php_start_ob_buffer_named(handler_name, chunk_size, erase TSRMLS_CC);
+
+ for (i = 0; i < count; i++) {
+ php_ob_buffer *s = stack[i];
+ php_start_ob_buffer_named(s->handler_name, s->chunk_size, s->erase TSRMLS_CC);
+ php_body_write(s->buffer, s->text_length TSRMLS_CC);
+ }
+
+ return result;
+}
+/* }}} */
+
/* {{{ int http_modified_match(char *, int) */
PHP_HTTP_API int _http_modified_match(const char *entry, const time_t t TSRMLS_DC)
{
ret = http_send_header(etag_header);
efree(etag_header);
+ if (!etag_len){
+ php_error_docref(NULL TSRMLS_CC,E_ERROR,
+ "Sending empty Etag (previous: %s)\n", HTTP_G(etag));
+ return FAILURE;
+ }
/* remember */
if (HTTP_G(etag)) {
efree(HTTP_G(etag));
PHP_HTTP_API STATUS _http_send(const void *data_ptr, const size_t data_size,
const http_send_mode data_mode TSRMLS_DC)
{
- char *new_etag = NULL;
int is_range_request = http_is_range_request();
if (!data_ptr) {
/* etag handling */
if (HTTP_G(etag_started)) {
- new_etag = (char *) emalloc(33);
-
- /* never ever use the output to compute the ETag if http_send() is used */
+ char *etag = ecalloc(33, 1);
+ /* interrupt */
HTTP_G(etag_started) = 0;
+ /* never ever use the output to compute the ETag if http_send() is used */
php_end_ob_buffer(0, 0 TSRMLS_CC);
- if (NULL == http_etag(&new_etag, data_ptr, data_size, data_mode)) {
- efree(new_etag);
+ if (NULL == http_etag(&etag, data_ptr, data_size, data_mode)) {
+ efree(etag);
return FAILURE;
}
/* send 304 Not Modified if etag matches */
- if ((!is_range_request) && http_etag_match("HTTP_IF_NONE_MATCH", new_etag)) {
- efree(new_etag);
+ if ((!is_range_request) && http_etag_match("HTTP_IF_NONE_MATCH", etag)) {
+ efree(etag);
return http_send_status(304);
}
- http_send_etag(new_etag, 32);
- efree(new_etag);
+ http_send_etag(etag, 32);
+ efree(etag);
}
/* send 304 Not Modified if last-modified matches*/
return FAILURE;
}
- return http_send(zdata, Z_STRLEN_P(zdata), SEND_DATA);
+ return http_send(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), SEND_DATA);
}
/* }}} */