diff options
Diffstat (limited to 'ext/soap/soap.c')
-rw-r--r-- | ext/soap/soap.c | 102 |
1 files changed, 76 insertions, 26 deletions
diff --git a/ext/soap/soap.c b/ext/soap/soap.c index bd351a0a2f..ff430cabd5 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1650,7 +1650,7 @@ PHP_METHOD(SoapServer, handle) ALLOC_INIT_ZVAL(retval); - if (php_output_start_default(TSRMLS_C) != SUCCESS) { + if (php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC) != SUCCESS) { php_error_docref(NULL TSRMLS_CC, E_ERROR,"ob_start failed"); } @@ -1737,7 +1737,7 @@ PHP_METHOD(SoapServer, handle) #ifdef ZEND_ENGINE_2 if (EG(exception)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (Z_TYPE_P(EG(exception)) == IS_OBJECT && instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) { soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); @@ -1791,7 +1791,7 @@ PHP_METHOD(SoapServer, handle) php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error calling constructor"); } if (EG(exception)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (Z_TYPE_P(EG(exception)) == IS_OBJECT && instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) { soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); @@ -1823,7 +1823,7 @@ PHP_METHOD(SoapServer, handle) } #ifdef ZEND_ENGINE_2 if (EG(exception)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (Z_TYPE_P(EG(exception)) == IS_OBJECT && instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) { soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); @@ -1902,14 +1902,14 @@ PHP_METHOD(SoapServer, handle) Z_TYPE_PP(tmp) != IS_NULL) { headerfault = *tmp; } - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); soap_server_fault_ex(function, &h->retval, h TSRMLS_CC); efree(fn_name); if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(&soap_obj);} goto fail; #ifdef ZEND_ENGINE_2 } else if (EG(exception)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (Z_TYPE_P(EG(exception)) == IS_OBJECT && instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) { zval *headerfault = NULL, **tmp; @@ -1959,7 +1959,7 @@ PHP_METHOD(SoapServer, handle) #ifdef ZEND_ENGINE_2 if (EG(exception)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (Z_TYPE_P(EG(exception)) == IS_OBJECT && instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) { soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); @@ -1981,7 +1981,7 @@ PHP_METHOD(SoapServer, handle) if (Z_TYPE_P(retval) == IS_OBJECT && instanceof_function(Z_OBJCE_P(retval), soap_fault_class_entry TSRMLS_CC)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); soap_server_fault_ex(function, retval, NULL TSRMLS_CC); goto fail; } @@ -2002,7 +2002,7 @@ PHP_METHOD(SoapServer, handle) #ifdef ZEND_ENGINE_2 if (EG(exception)) { - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (Z_TYPE_P(EG(exception)) == IS_OBJECT && instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) { soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); @@ -2021,7 +2021,7 @@ PHP_METHOD(SoapServer, handle) #endif /* Flush buffer */ - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); if (doc_return) { /* xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8); */ @@ -2039,14 +2039,39 @@ PHP_METHOD(SoapServer, handle) xmlFreeDoc(doc_return); - if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0)) { - sapi_add_header("Connection: close", sizeof("Connection: close")-1, 1); - } else { + 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); + INIT_PZVAL(&str); + ZVAL_STRINGL(&str, (char*)buf, size, 0); + params[0] = &str; + INIT_PZVAL(&mode); + 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); } - 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); @@ -2185,22 +2210,47 @@ static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeade if (use_http_error_status) { sapi_add_header("HTTP/1.1 500 Internal Service Error", sizeof("HTTP/1.1 500 Internal Service Error")-1, 1); } - if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0)) { - sapi_add_header("Connection: close", sizeof("Connection: close")-1, 1); - } else { - 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 { sapi_add_header("Content-Type: text/xml; charset=utf-8", sizeof("Content-Type: text/xml; charset=utf-8")-1, 1); } - php_write(buf, size TSRMLS_CC); + 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); + INIT_PZVAL(&str); + ZVAL_STRINGL(&str, (char*)buf, size, 0); + params[0] = &str; + INIT_PZVAL(&mode); + 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); + } xmlFreeDoc(doc_return); - xmlFree(buf); zend_clear_exception(TSRMLS_C); } @@ -2363,11 +2413,11 @@ static void soap_error_handler(int error_num, const char *error_filename, const } /* Get output buffer and send as fault detials */ - if (php_output_get_length(&outbuflen TSRMLS_CC) != FAILURE && Z_LVAL(outbuflen) != 0) { + if (php_ob_get_length(&outbuflen TSRMLS_CC) != FAILURE && Z_LVAL(outbuflen) != 0) { ALLOC_INIT_ZVAL(outbuf); - php_output_get_contents(outbuf TSRMLS_CC); + php_ob_get_buffer(outbuf TSRMLS_CC); } - php_output_discard(TSRMLS_C); + php_end_ob_buffer(0, 0 TSRMLS_CC); } INIT_ZVAL(fault_obj); |