]> granicus.if.org Git - php/commitdiff
Fixed bug #41635 (SoapServer and zlib.output_compression with FastCGI result in major...
authorDmitry Stogov <dmitry@php.net>
Fri, 13 Jul 2007 14:00:05 +0000 (14:00 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 13 Jul 2007 14:00:05 +0000 (14:00 +0000)
NEWS
ext/soap/soap.c

diff --git a/NEWS b/NEWS
index dd6dbe323c72f89743e300fe9bbe46677b784afd..326f41a72bdc8538e0c878e49dcbb601efec55ef 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -108,6 +108,8 @@ PHP                                                                        NEWS
 - Fixed bug #41655 (open_basedir bypass via glob()). (Ilia)
 - Fixed bug #41640 (get_class_vars produces error on class constants).
   (Johannes)
+- Fixed bug #41635 (SoapServer and zlib.output_compression with FastCGI result
+  in major slowdown). (Dmitry)
 - Fixed bug #41633 (Crash instantiating classes with self-referencing
   constants). (Dmitry)
 - Fixed bug #41630 (segfault when an invalid color index is present in
index 4017711ceb4ccfa1306c99a328b62a6b795e4922..e3584b134c9d47192c77e8e644e63123ca0981b4 100644 (file)
@@ -1848,8 +1848,6 @@ PHP_METHOD(SoapServer, handle)
                        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Dump memory failed");
                }       
 
-               snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
-               sapi_add_header(cont_len, strlen(cont_len), 1);
                if (soap_version == SOAP_1_2) {
                        sapi_add_header("Content-Type: application/soap+xml; charset=utf-8", sizeof("Content-Type: application/soap+xml; charset=utf-8")-1, 1);
                } else {
@@ -1857,8 +1855,38 @@ PHP_METHOD(SoapServer, handle)
                }
 
                xmlFreeDoc(doc_return);
-               php_write(buf, size TSRMLS_CC);
-               xmlFree(buf);
+
+               if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0) &&                           
+                   zend_hash_exists(EG(function_table), "ob_gzhandler", sizeof("ob_gzhandler"))) {
+                       zval nm_ob_gzhandler;
+                       zval str;
+                       zval mode;
+                       zval result;
+                       zval *params[2];
+
+                       INIT_ZVAL(result);
+                       ZVAL_STRINGL(&nm_ob_gzhandler, "ob_gzhandler", sizeof("ob_gzhandler") - 1, 0);
+                       ZVAL_STRINGL(&str, (char*)buf, size, 0);
+                       params[0] = &str;
+                       ZVAL_LONG(&mode, PHP_OUTPUT_HANDLER_START | PHP_OUTPUT_HANDLER_END);
+                       params[1] = &mode;
+                       if (call_user_function(CG(function_table), NULL, &nm_ob_gzhandler, &result, 2, params TSRMLS_CC) != FAILURE &&
+                           Z_TYPE(result) == IS_STRING &&
+                               zend_alter_ini_entry("zlib.output_compression", sizeof("zlib.output_compression"), "0", sizeof("0")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME) == SUCCESS) {
+                               xmlFree(buf);
+                               buf = NULL;
+                               snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", Z_STRLEN(result));
+                               sapi_add_header(cont_len, strlen(cont_len), 1);
+                               php_write(Z_STRVAL(result), Z_STRLEN(result) TSRMLS_CC);
+                       }
+                       zval_dtor(&result);
+               }
+               if (buf) {
+                       snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
+                       sapi_add_header(cont_len, strlen(cont_len), 1);
+                       php_write(buf, size TSRMLS_CC);
+                       xmlFree(buf);
+               }
        } else {
                sapi_add_header("HTTP/1.1 202 Accepted", sizeof("HTTP/1.1 202 Accepted")-1, 1);
                sapi_add_header("Content-Length: 0", sizeof("Content-Length: 0")-1, 1);