summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2001-08-31 15:56:48 +0000
committerZeev Suraski <zeev@php.net>2001-08-31 15:56:48 +0000
commit357dfd5f1455dacb0112cd91349826023e357b1a (patch)
tree28c83bbfe85cdda16e2b92e1baea95d288ea2fa7
parentb2b50ab52565bafe84cdc85778addda30d89c280 (diff)
downloadphp-git-357dfd5f1455dacb0112cd91349826023e357b1a.tar.gz
Support multiple chunked output buffering layers
-rw-r--r--main/output.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/main/output.c b/main/output.c
index df325a9cd4..09722815ae 100644
--- a/main/output.c
+++ b/main/output.c
@@ -135,6 +135,8 @@ PHPAPI void php_end_ob_buffer(zend_bool send_buffer, zend_bool just_flush TSRMLS
char *to_be_destroyed_buffer;
char *to_be_destroyed_handled_output[2] = { 0, 0 };
int status;
+ php_ob_buffer *prev_ob_buffer_p=NULL;
+ php_ob_buffer orig_ob_buffer;
if (OG(ob_nesting_level)==0) {
return;
@@ -209,23 +211,30 @@ PHPAPI void php_end_ob_buffer(zend_bool send_buffer, zend_bool just_flush TSRMLS
if (OG(active_ob_buffer).internal_output_handler) {
to_be_destroyed_handled_output[1] = OG(active_ob_buffer).internal_output_handler_buffer;
}
- if (OG(ob_nesting_level)>1) { /* restore previous buffer */
- php_ob_buffer *ob_buffer_p;
-
- zend_stack_top(&OG(ob_buffers), (void **) &ob_buffer_p);
- OG(active_ob_buffer) = *ob_buffer_p;
- zend_stack_del_top(&OG(ob_buffers));
- if (OG(ob_nesting_level)==2) { /* destroy the stack */
- zend_stack_destroy(&OG(ob_buffers));
- }
+ }
+ if (OG(ob_nesting_level)>1) { /* restore previous buffer */
+ zend_stack_top(&OG(ob_buffers), (void **) &prev_ob_buffer_p);
+ orig_ob_buffer = OG(active_ob_buffer);
+ OG(active_ob_buffer) = *prev_ob_buffer_p;
+ zend_stack_del_top(&OG(ob_buffers));
+ if (!just_flush && OG(ob_nesting_level)==2) { /* destroy the stack */
+ zend_stack_destroy(&OG(ob_buffers));
}
- OG(ob_nesting_level)--;
}
+ OG(ob_nesting_level)--;
if (send_buffer) {
OG(php_body_write)(final_buffer, final_buffer_length TSRMLS_CC);
}
+ if (just_flush) { /* we restored the previous ob, return to the current */
+ if (prev_ob_buffer_p) {
+ zend_stack_push(&OG(ob_buffers), &OG(active_ob_buffer), sizeof(php_ob_buffer));
+ OG(active_ob_buffer) = orig_ob_buffer;
+ }
+ OG(ob_nesting_level)++;
+ }
+
if (alternate_buffer) {
zval_ptr_dtor(&alternate_buffer);
}