/* +----------------------------------------------------------------------+ | PHP version 4.0 | +----------------------------------------------------------------------+ | Copyright (c) 1997, 1998, 1999 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 2.0 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available at through the world-wide-web at | | http://www.php.net/license/2_0.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | +----------------------------------------------------------------------+ */ #include "php.h" #include "ext/standard/head.h" #include "ext/session/php_session.h" #include "SAPI.h" /* output functions */ PHPAPI int (*php_body_write)(const char *str, uint str_length); /* string output */ PHPAPI int (*php_header_write)(const char *str, uint str_length); /* unbuffer string output */ static int php_ub_body_write(const char *str, uint str_length); static int php_ub_body_write_no_header(const char *str, uint str_length); static int php_b_body_write(const char *str, uint str_length); /* output buffering */ static char *ob_buffer; static uint ob_buffer_size; static uint ob_block_size; static uint ob_text_length; static void php_ob_init(uint initial_size, uint block_size); static void php_ob_destroy(); static void php_ob_append(const char *text, uint text_length); static void php_ob_prepend(const char *text, uint text_length); static inline void php_ob_send(); /* * Main */ /* Start output layer */ PHPAPI void php_output_startup() { ob_buffer = NULL; php_body_write = php_ub_body_write; php_header_write = sapi_module.ub_write; } /* Start output buffering */ void php_start_ob_buffering() { php_ob_init(4096, 1024); php_body_write = php_b_body_write; } /* End output buffering */ void php_end_ob_buffering(int send_buffer) { SLS_FETCH(); if (!ob_buffer) { return; } if (SG(headers_sent) && !SG(request_info).headers_only) { php_body_write = php_ub_body_write_no_header; } else { php_body_write = php_ub_body_write; } if (send_buffer) { php_ob_send(); } php_ob_destroy(); } /* * Output buffering - implementation */ static inline void php_ob_allocate() { if (ob_buffer_size=start) { p[text_length] = *p; } memcpy(ob_buffer, text, text_length); ob_buffer[ob_text_length]=0; } static inline void php_ob_send() { /* header_write is a simple, unbuffered output function */ php_body_write(ob_buffer, ob_text_length); } /* Return the current output buffer */ int php_ob_get_buffer(pval *p) { if (!ob_buffer) { return FAILURE; } p->type = IS_STRING; p->value.str.val = estrndup(ob_buffer, ob_text_length); p->value.str.len = ob_text_length; return SUCCESS; } /* * Wrapper functions - implementation */ /* buffered output function */ static int php_b_body_write(const char *str, uint str_length) { php_ob_append(str, str_length); return str_length; } static int php_ub_body_write_no_header(const char *str, uint str_length) { char *newstr = NULL; uint new_length=0; int result; session_adapt_uris(str, str_length, &newstr, &new_length); if (newstr) { str = newstr; str_length = new_length; } result = php_header_write(str, str_length); if (newstr) { free(newstr); } return result; } static int php_ub_body_write(const char *str, uint str_length) { int result = 0; SLS_FETCH(); if (SG(request_info).headers_only) { zend_bailout(); } if (php3_header()) { php_body_write = php_ub_body_write_no_header; result = php_ub_body_write_no_header(str, str_length); } return result; } /* * HEAD support */ void set_header_request(int value) { /* deprecated */ }