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