X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=8690d9b54d309be5fe7875bb7e056c87797c8dbd;hp=238dd5a1a2b565eb39f0369a87cf434e166268f2;hb=838a50c68e93e551f6d2b981cfb9bef4e65fbbb2;hpb=0d215d4f181f34af40fad377570919dc978ff563 diff --git a/http_api.c b/http_api.c index 238dd5a..8690d9b 100644 --- a/http_api.c +++ b/http_api.c @@ -844,6 +844,7 @@ static STATUS http_ob_stack_get(php_ob_buffer *o, php_ob_buffer **s) 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->text_length = o->text_length; b->chunk_size = o->chunk_size; b->erase = o->erase; s[i++] = b; @@ -1112,39 +1113,40 @@ PHP_HTTP_API void _http_ob_etaghandler(char *output, uint output_len, /* }}} */ /* {{{ 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, +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); + if (count = OG(ob_nesting_level)) { + stack = ecalloc(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); - + + php_ob_set_internal_handler(handler_func, chunk_size, handler_name, 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); + if (strcmp(s->handler_name, "default output handler")) { + 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; + + return SUCCESS; } /* }}} */