cvs: php4 /ext/zlib php_zlib.h zlib.c /main SAPI.c

From: Date: Sun, 28 Jul 2002 14:08:08 +0000
Subject: cvs: php4 /ext/zlib php_zlib.h zlib.c /main SAPI.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-13013@lists.php.net to get a copy of this message
sr Sun Jul 28 10:08:08 2002 EDT Modified files: /php4/ext/zlib php_zlib.h zlib.c /php4/main SAPI.c Log: Commit patch as discussed on LinuxTag and posted to php-dev in June. Disables zlib.output_compression for scripts with image/ content-type header (fixes bug #16109) and makes it possible to switch zlib.output_compression during script execution before the headers are sent. @- zlib.output_compression is disabled for "image/" content-type @ headers and can be changed during script execution. (Stefan) Index: php4/ext/zlib/php_zlib.h diff -u php4/ext/zlib/php_zlib.h:1.30 php4/ext/zlib/php_zlib.h:1.31 --- php4/ext/zlib/php_zlib.h:1.30 Wed Apr 10 18:42:24 2002 +++ php4/ext/zlib/php_zlib.h Sun Jul 28 10:08:07 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_zlib.h,v 1.30 2002/04/10 22:42:24 wez Exp $ */ +/* $Id: php_zlib.h,v 1.31 2002/07/28 14:08:07 sr Exp $ */ #ifndef PHP_ZLIB_H #define PHP_ZLIB_H @@ -65,6 +65,9 @@ #endif #define phpext_zlib_ptr zlib_module_ptr + +#define CODING_GZIP 1 +#define CODING_DEFLATE 2 #endif /* PHP_ZLIB_H */ Index: php4/ext/zlib/zlib.c diff -u php4/ext/zlib/zlib.c:1.136 php4/ext/zlib/zlib.c:1.137 --- php4/ext/zlib/zlib.c:1.136 Tue Jun 18 06:09:41 2002 +++ php4/ext/zlib/zlib.c Sun Jul 28 10:08:07 2002 @@ -18,7 +18,7 @@ | Jade Nicoletti <nicoletti@nns.ch> | +----------------------------------------------------------------------+ */ -/* $Id: zlib.c,v 1.136 2002/06/18 10:09:41 derick Exp $ */ +/* $Id: zlib.c,v 1.137 2002/07/28 14:08:07 sr Exp $ */ #define IS_EXT_MODULE #ifdef HAVE_CONFIG_H @@ -74,8 +74,6 @@ #endif #define OS_CODE 0x03 /* FIXME */ -#define CODING_GZIP 1 -#define CODING_DEFLATE 2 #define GZIP_HEADER_LENGTH 10 #define GZIP_FOOTER_LENGTH 8 @@ -144,6 +142,26 @@ return FAILURE; } + if(new_value == NULL) + return FAILURE; + + if(!strncasecmp(new_value, "off", sizeof("off"))) { + new_value = "0"; + new_value_length = sizeof("0"); + } else if(!strncasecmp(new_value, "on", sizeof("on"))) { + new_value = "4096"; + new_value_length = sizeof("4096"); + } else if(stage == PHP_INI_STAGE_RUNTIME && + strncmp(new_value, "0", sizeof("0")) && strncmp(new_value, "1", sizeof("1"))) { + php_error(E_WARNING, "Cannot change zlib.output_compression buffer size during script execution"); + return FAILURE; + } + + if (stage == PHP_INI_STAGE_RUNTIME && SG(headers_sent) && !SG(request_info).no_headers) { + php_error(E_WARNING, "Cannot change zlib.output_compression - headers already sent"); + return FAILURE; + } + OnUpdateInt(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); return SUCCESS; @@ -161,7 +179,7 @@ PHP_INI_BEGIN() - STD_PHP_INI_BOOLEAN("zlib.output_compression", "0", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdate_zlib_output_compression, output_compression, zend_zlib_globals, zlib_globals) + STD_PHP_INI_BOOLEAN("zlib.output_compression", "0", PHP_INI_ALL, OnUpdate_zlib_output_compression, output_compression, zend_zlib_globals, zlib_globals) STD_PHP_INI_ENTRY("zlib.output_compression_level", "-1", PHP_INI_ALL, OnUpdate_zlib_output_compression_level, output_compression_level, zend_zlib_globals, zlib_globals) PHP_INI_END() @@ -197,6 +215,7 @@ PHP_RINIT_FUNCTION(zlib) { ZLIBG(ob_gzhandler_status) = 0; + ZLIBG(ob_gzip_coding) = 0; switch (ZLIBG(output_compression)) { case 0: break; @@ -947,11 +966,15 @@ { zend_bool do_start, do_end; - do_start = (mode & PHP_OUTPUT_HANDLER_START ? 1 : 0); - do_end = (mode & PHP_OUTPUT_HANDLER_END ? 1 : 0); - if (php_deflate_string(output, output_len, handled_output, handled_output_len, ZLIBG(ob_gzip_coding), do_start, do_end, ZLIBG(output_compression_level) TSRMLS_CC)!=SUCCESS) { - zend_error(E_ERROR, "Compression failed"); - } + if (!ZLIBG(output_compression)) { + *handled_output = NULL; + } else { + do_start = (mode & PHP_OUTPUT_HANDLER_START ? 1 : 0); + do_end = (mode & PHP_OUTPUT_HANDLER_END ? 1 : 0); + if (php_deflate_string(output, output_len, handled_output, handled_output_len, ZLIBG(ob_gzip_coding), do_start, do_end, ZLIBG(output_compression_level) TSRMLS_CC)!=SUCCESS) { + zend_error(E_ERROR, "Compression failed"); + } + } } /* }}} */ @@ -968,20 +991,8 @@ } convert_to_string_ex(a_encoding); if (php_memnstr(Z_STRVAL_PP(a_encoding), "gzip", 4, Z_STRVAL_PP(a_encoding) + Z_STRLEN_PP(a_encoding))) { - if (sapi_add_header("Content-Encoding: gzip", sizeof("Content-Encoding: gzip") - 1, 1)==FAILURE) { - return FAILURE; - } - if (sapi_add_header("Vary: Accept-Encoding", sizeof("Vary: Accept-Encoding") - 1, 1)==FAILURE) { - return FAILURE; - } ZLIBG(ob_gzip_coding) = CODING_GZIP; } else if(php_memnstr(Z_STRVAL_PP(a_encoding), "deflate", 7, Z_STRVAL_PP(a_encoding) + Z_STRLEN_PP(a_encoding))) { - if (sapi_add_header("Content-Encoding: deflate", sizeof("Content-Encoding: deflate") - 1, 1)==FAILURE) { - return FAILURE; - } - if (sapi_add_header("Vary: Accept-Encoding", sizeof("Vary: Accept-Encoding") - 1, 1)==FAILURE) { - return FAILURE; - } ZLIBG(ob_gzip_coding) = CODING_DEFLATE; } else { return FAILURE; Index: php4/main/SAPI.c diff -u php4/main/SAPI.c:1.137 php4/main/SAPI.c:1.138 --- php4/main/SAPI.c:1.137 Sat Jul 27 09:58:16 2002 +++ php4/main/SAPI.c Sun Jul 28 10:08:08 2002 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: SAPI.c,v 1.137 2002/07/27 13:58:16 hirokawa Exp $ */ +/* $Id: SAPI.c,v 1.138 2002/07/28 14:08:08 sr Exp $ */ #include <ctype.h> #include <sys/stat.h> @@ -30,6 +30,10 @@ #if (HAVE_PCRE || HAVE_BUNDLED_PCRE) && !defined(COMPILE_DL_PCRE) #include "ext/pcre/php_pcre.h" #endif +#if HAVE_ZLIB +#include "ext/zlib/php_zlib.h" +ZEND_EXTERN_MODULE_GLOBALS(zlib) +#endif #ifdef ZTS #include "TSRM.h" #endif @@ -485,6 +489,11 @@ if (!STRCASECMP(header_line, "Content-Type")) { char *ptr = colon_offset+1, *mimetype = NULL, *newheader; size_t len = header_line_len - (ptr - header_line), newlen; +#if HAVE_ZLIB + if(strncmp(ptr, "image/", sizeof("image/"))) { + ZLIBG(output_compression) = 0; + } +#endif while (*ptr == ' ' && *ptr != '\0') { ptr++; } @@ -632,6 +641,31 @@ if (SG(headers_sent) || SG(request_info).no_headers) { return SUCCESS; } + +#if HAVE_ZLIB + /* Add output compression headers at this late stage in order to make + it possible to switch it off inside the script. */ + if (ZLIBG(output_compression)) { + switch (ZLIBG(ob_gzip_coding)) { + case CODING_GZIP: + if (sapi_add_header("Content-Encoding: gzip", sizeof("Content-Encoding: gzip") - 1, 1)==FAILURE) { + return FAILURE; + } + if (sapi_add_header("Vary: Accept-Encoding", sizeof("Vary: Accept-Encoding") - 1, 1)==FAILURE) { + return FAILURE; + } + break; + case CODING_DEFLATE: + if (sapi_add_header("Content-Encoding: deflate", sizeof("Content-Encoding: deflate") - 1, 1)==FAILURE) { + return FAILURE; + } + if (sapi_add_header("Vary: Accept-Encoding", sizeof("Vary: Accept-Encoding") - 1, 1)==FAILURE) { + return FAILURE; + } + break; + } + } +#endif /* Success-oriented. We set headers_sent to 1 here to avoid an infinite loop * in case of an error situation.

« previous php.cvs (#13013) next »