mike Wed Aug 30 14:42:26 2006 UTC Modified files: /php-src/ext/zlib zlib.c Log: - allow (de)activation with ini_set() http://cvs.php.net/viewvc.cgi/php-src/ext/zlib/zlib.c?r1=1.206&r2=1.207&diff_format=u Index: php-src/ext/zlib/zlib.c diff -u php-src/ext/zlib/zlib.c:1.206 php-src/ext/zlib/zlib.c:1.207 --- php-src/ext/zlib/zlib.c:1.206 Wed Aug 30 12:07:04 2006 +++ php-src/ext/zlib/zlib.c Wed Aug 30 14:42:26 2006 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zlib.c,v 1.206 2006/08/30 12:07:04 mike Exp $ */ +/* $Id: zlib.c,v 1.207 2006/08/30 14:42:26 mike Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -70,6 +70,34 @@ } /* }}} */ +/* {{{ php_zlib_output_compression_start() */ +void php_zlib_output_compression_start(TSRMLS_D) +{ + zval *zoh, *tmp; + php_output_handler *h; + + switch (ZLIBG(output_compression)) { + case 0: + break; + case 1: + ZLIBG(output_compression) = PHP_OUTPUT_HANDLER_DEFAULT_SIZE; + default: + MAKE_STD_ZVAL(tmp); + ZVAL_ASCII_STRING(tmp, PHP_ZLIB_OUTPUT_HANDLER_NAME, ZSTR_DUPLICATE); + if ((h = php_zlib_output_handler_init(tmp TSRMLS_CC)) && (SUCCESS == php_output_handler_start(h TSRMLS_CC))) { + if (ZLIBG(output_handler) && *ZLIBG(output_handler)) { + MAKE_STD_ZVAL(zoh); + ZVAL_ASCII_STRING(zoh, ZLIBG(output_handler), ZSTR_DUPLICATE); + php_output_start_user(zoh, ZLIBG(output_compression), PHP_OUTPUT_HANDLER_STDFLAGS TSRMLS_CC); + zval_ptr_dtor(&zoh); + } + } + zval_ptr_dtor(&tmp); + break; + } +} +/* }}} */ + /* {{{ php_zlib_output_handler_init() */ php_output_handler *php_zlib_output_handler_init(zval *handler_name TSRMLS_DC) { @@ -172,7 +200,7 @@ php_output_handler_hook(PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS, &flags TSRMLS_CC); if (!(flags & PHP_OUTPUT_HANDLER_STARTED)) { - if (SG(headers_sent)) { + if (SG(headers_sent) || !ZLIBG(output_compression)) { deflateEnd(&ctx->Z); return FAILURE; } @@ -603,6 +631,7 @@ /* {{{ OnUpdate_zlib_output_compression */ static PHP_INI_MH(OnUpdate_zlib_output_compression) { + int status, int_value; char *ini_value; if (new_value == NULL) { @@ -616,26 +645,47 @@ new_value = "1"; new_value_length = sizeof("1"); } - + + int_value = zend_atoi(new_value, new_value_length); ini_value = zend_ini_string("output_handler", sizeof("output_handler"), 0); - if (ini_value != NULL && strlen(ini_value) != 0 && zend_atoi(new_value, new_value_length) != 0) { + + if (ini_value && *ini_value && int_value) { php_error_docref("ref.outcontrol" TSRMLS_CC, E_CORE_ERROR, "Cannot use both zlib.output_compression and output_handler together!!"); return FAILURE; } - if (stage == PHP_INI_STAGE_RUNTIME && SG(headers_sent) && !SG(request_info).no_headers) { - php_error_docref("ref.outcontrol" TSRMLS_CC, E_WARNING, "Cannot change zlib.output_compression - headers already sent"); - return FAILURE; + status = php_output_get_status(TSRMLS_C); + if (stage == PHP_INI_STAGE_RUNTIME) { + if (status & PHP_OUTPUT_SENT) { + php_error_docref("ref.outcontrol" TSRMLS_CC, E_WARNING, "Cannot change zlib.output_compression - headers already sent"); + return FAILURE; + } else if ((status & PHP_OUTPUT_WRITTEN) && int_value) { + php_error_docref("ref.outcontrol" TSRMLS_CC, E_WARNING, "Cannot enable zlib.output_compression - there has already been output"); + return FAILURE; + } } - - return OnUpdateLong(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); + + status = OnUpdateLong(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); + + if (stage == PHP_INI_STAGE_RUNTIME && int_value) { + zval tmp; + + INIT_PZVAL(&tmp); + ZVAL_ASCII_STRING(&tmp, PHP_ZLIB_OUTPUT_HANDLER_NAME, ZSTR_DUPLICATE); + if (!php_output_handler_started(&tmp TSRMLS_CC)) { + php_zlib_output_compression_start(TSRMLS_C); + } + zval_dtor(&tmp); + } + + return status; } /* }}} */ /* {{{ OnUpdate_zlib_output_handler */ static PHP_INI_MH(OnUpdate_zlib_output_handler) { - if (stage == PHP_INI_STAGE_RUNTIME && SG(headers_sent) && !SG(request_info).no_headers) { + if (stage == PHP_INI_STAGE_RUNTIME && (php_output_get_status(TSRMLS_C) & PHP_OUTPUT_SENT)) { php_error_docref("ref.outcontrol" TSRMLS_CC, E_WARNING, "Cannot change zlib.output_handler - headers already sent"); return FAILURE; } @@ -687,30 +737,10 @@ /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(zlib) { - zval *zoh, *tmp; - php_output_handler *h; - ZLIBG(compression_coding) = 0; - switch (ZLIBG(output_compression)) { - case 0: - break; - case 1: - ZLIBG(output_compression) = PHP_OUTPUT_HANDLER_DEFAULT_SIZE; - default: - MAKE_STD_ZVAL(tmp); - ZVAL_ASCII_STRING(tmp, PHP_ZLIB_OUTPUT_HANDLER_NAME, ZSTR_DUPLICATE); - if ((h = php_zlib_output_handler_init(tmp TSRMLS_CC)) && (SUCCESS == php_output_handler_start(h TSRMLS_CC))) { - if (ZLIBG(output_handler) && *ZLIBG(output_handler)) { - MAKE_STD_ZVAL(zoh); - ZVAL_ASCII_STRING(zoh, ZLIBG(output_handler), ZSTR_DUPLICATE); - php_output_start_user(zoh, ZLIBG(output_compression), PHP_OUTPUT_HANDLER_STDFLAGS TSRMLS_CC); - zval_ptr_dtor(&zoh); - } - } - zval_ptr_dtor(&tmp); - break; - } + php_zlib_output_compression_start(TSRMLS_C); + return SUCCESS; } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php