]> granicus.if.org Git - php/commitdiff
Support multiple chunked output buffering layers
authorZeev Suraski <zeev@php.net>
Fri, 31 Aug 2001 15:56:48 +0000 (15:56 +0000)
committerZeev Suraski <zeev@php.net>
Fri, 31 Aug 2001 15:56:48 +0000 (15:56 +0000)
main/output.c

index df325a9cd4f36fcc5650bad2f9036aee6f5d7b1d..09722815aee523004391afbcea092b965f480cfe 100644 (file)
@@ -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);
        }