From: Dmitry Stogov Date: Tue, 9 Nov 2004 08:13:04 +0000 (+0000) Subject: Fixed bug #29211 (SoapClient doesn't request wsdl through proxy). (Rob) X-Git-Tag: php-5.0.3RC1~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=50a4e4003a9964be9568ef808f6d97503839b886;p=php Fixed bug #29211 (SoapClient doesn't request wsdl through proxy). (Rob) --- diff --git a/NEWS b/NEWS index 8bee5bd775..2e1fc36c68 100644 --- a/NEWS +++ b/NEWS @@ -45,6 +45,7 @@ PHP NEWS (cfield at affinitysolutions dot com) - Fixed bug #29418 (double free when openssl_csr_new fails). (Kamesh Jayachandran). +- Fixed bug #29211 (SoapClient doesn't request wsdl through proxy). (Rob) - Fixed bug #28220 (mb_strwidth() returns wrong width values for some hangul characters). (Moriyoshi) - Fixed bug #27798 (private / protected variables not exposed by diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c index 72bef55ad9..fcdd54c8b5 100644 --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -243,10 +243,18 @@ static void php_libxml_init_globals(php_libxml_globals *libxml_globals_p TSRMLS_ int php_libxml_streams_IO_match_wrapper(const char *filename) { + char *resolved_path; + int retval; + TSRMLS_FETCH(); if (zend_is_executing(TSRMLS_C)) { - return php_stream_locate_url_wrapper(filename, NULL, 0 TSRMLS_CC) ? 1 : 0; + resolved_path = xmlURIUnescapeString(filename, 0, NULL); + retval = php_stream_locate_url_wrapper(resolved_path, NULL, 0 TSRMLS_CC) ? 1 : 0; + if (resolved_path) { + xmlFree(resolved_path); + } + return retval; } return 0; } @@ -274,7 +282,7 @@ void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode, in xml processing (eg. DTD files) */ wrapper = php_stream_locate_url_wrapper(resolved_path, &path_to_open, ENFORCE_SAFE_MODE TSRMLS_CC); if (wrapper && read_only && wrapper->wops->url_stat) { - if (wrapper->wops->url_stat(wrapper, path_to_open, 0, &ssbuf, NULL TSRMLS_CC) == -1) { + if (wrapper->wops->url_stat(wrapper, path_to_open, PHP_STREAM_URL_STAT_QUIET, &ssbuf, NULL TSRMLS_CC) == -1) { xmlFree(resolved_path); return NULL; } @@ -282,11 +290,9 @@ void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode, if (LIBXML(stream_context)) { context = zend_fetch_resource(&LIBXML(stream_context) TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context()); - ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL, context); - xmlFree(resolved_path); - return ret_val; } - ret_val = php_stream_open_wrapper(path_to_open, (char *)mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL); + + ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL, context); xmlFree(resolved_path); return ret_val; } @@ -432,6 +438,15 @@ PHP_LIBXML_API void php_libxml_shutdown() { } } +PHP_LIBXML_API zval *php_libxml_switch_context(zval *context TSRMLS_DC) { + zval *oldcontext; + + oldcontext = LIBXML(stream_context); + LIBXML(stream_context) = context; + return oldcontext; + +} + PHP_MINIT_FUNCTION(libxml) { php_libxml_initialize(); @@ -503,7 +518,6 @@ PHP_FUNCTION(libxml_set_streams_context) } /* }}} */ - /* {{{ Common functions shared by extensions */ int php_libxml_xmlCheckUTF8(const unsigned char *s) { diff --git a/ext/libxml/php_libxml.h b/ext/libxml/php_libxml.h index 9f7c96f2ed..a4643809e3 100644 --- a/ext/libxml/php_libxml.h +++ b/ext/libxml/php_libxml.h @@ -67,6 +67,7 @@ typedef struct _php_libxml_node_object { typedef void * (*php_libxml_export_node) (zval *object TSRMLS_DC); PHP_FUNCTION(libxml_set_streams_context); + int php_libxml_increment_node_ptr(php_libxml_node_object *object, xmlNodePtr node, void *private_data TSRMLS_DC); int php_libxml_decrement_node_ptr(php_libxml_node_object *object TSRMLS_DC); int php_libxml_increment_doc_ref(php_libxml_node_object *object, xmlDocPtr docp TSRMLS_DC); @@ -81,6 +82,7 @@ PHP_LIBXML_API void php_libxml_error_handler(void *ctx, const char *msg, ...); void php_libxml_ctx_warning(void *ctx, const char *msg, ...); void php_libxml_ctx_error(void *ctx, const char *msg, ...); PHP_LIBXML_API int php_libxml_xmlCheckUTF8(const unsigned char *s); +PHP_LIBXML_API zval *php_libxml_switch_context(zval *context TSRMLS_DC); #endif /* HAVE_LIBXML */ diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 0d4695f357..3d21103ebc 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -20,6 +20,7 @@ /* $Id$ */ #include "php_soap.h" +#include "ext/libxml/php_libxml.h" #include "libxml/uri.h" #include "ext/standard/md5.h" @@ -195,18 +196,51 @@ static int is_wsdl_element(xmlNodePtr node) return 1; } -static void load_wsdl_ex(char *struri, sdlCtx *ctx, int include) +static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include TSRMLS_DC) { sdlPtr tmpsdl = ctx->sdl; xmlDocPtr wsdl; xmlNodePtr root, definitions, trav; xmlAttrPtr targetNamespace; + php_stream_context *context=NULL; + zval **proxy_host, **proxy_port, *orig_context, *new_context; if (zend_hash_exists(&ctx->docs, struri, strlen(struri)+1)) { return; } + if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_host", sizeof("_proxy_host"), (void **) &proxy_host) == SUCCESS && + Z_TYPE_PP(proxy_host) == IS_STRING && + zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_port", sizeof("_proxy_port"), (void **) &proxy_port) == SUCCESS && + Z_TYPE_PP(proxy_port) == IS_LONG) { + zval str_port, *str_proxy; + smart_str proxy = {0}; + str_port = **proxy_port; + zval_copy_ctor(&str_port); + convert_to_string(&str_port); + smart_str_appends(&proxy,"tcp://"); + smart_str_appends(&proxy,Z_STRVAL_PP(proxy_host)); + smart_str_appends(&proxy,":"); + smart_str_appends(&proxy,Z_STRVAL(str_port)); + zval_dtor(&str_port); + MAKE_STD_ZVAL(str_proxy); + ZVAL_STRING(str_proxy, proxy.c, 1); + smart_str_free(&proxy); + + context = php_stream_context_alloc(); + php_stream_context_set_option(context, "http", "proxy", str_proxy); + zval_ptr_dtor(&str_proxy); + MAKE_STD_ZVAL(new_context); + php_stream_context_to_zval(context, new_context); + orig_context = php_libxml_switch_context(new_context TSRMLS_CC); + } + wsdl = soap_xmlParseFile(struri); + + if (context) { + php_libxml_switch_context(orig_context TSRMLS_CC); + zval_ptr_dtor(&new_context); + } if (!wsdl) { soap_error1(E_ERROR, "Parsing WSDL: Couldn't load from '%s'", struri); @@ -265,7 +299,7 @@ static void load_wsdl_ex(char *struri, sdlCtx *ctx, int include) uri = xmlBuildURI(tmp->children->content, base); xmlFree(base); } - load_wsdl_ex(uri, ctx, 1); + load_wsdl_ex(this_ptr, uri, ctx, 1 TSRMLS_CC); xmlFree(uri); } @@ -558,7 +592,7 @@ static HashTable* wsdl_message(sdlCtx *ctx, char* message_name) return parameters; } -static sdlPtr load_wsdl(char *struri) +static sdlPtr load_wsdl(zval *this_ptr, char *struri TSRMLS_DC) { sdlCtx ctx; int i,n; @@ -575,7 +609,7 @@ static sdlPtr load_wsdl(char *struri) zend_hash_init(&ctx.portTypes, 0, NULL, NULL, 0); zend_hash_init(&ctx.services, 0, NULL, NULL, 0); - load_wsdl_ex(struri,&ctx, 0); + load_wsdl_ex(this_ptr, struri,&ctx, 0 TSRMLS_CC); schema_pass2(&ctx); n = zend_hash_num_elements(&ctx.services); @@ -2164,7 +2198,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s zend_hash_destroy(&tmp_types); } -sdlPtr get_sdl(char *uri TSRMLS_DC) +sdlPtr get_sdl(zval *this_ptr, char *uri TSRMLS_DC) { sdlPtr sdl = NULL; char* old_error_code = SOAP_GLOBAL(error_code); @@ -2178,7 +2212,7 @@ sdlPtr get_sdl(char *uri TSRMLS_DC) if (strchr(uri,':') != NULL || IS_ABSOLUTE_PATH(uri, uri_len)) { strcpy(fn, uri); } else if (VCWD_REALPATH(uri, fn) == NULL) { - sdl = load_wsdl(uri); + sdl = load_wsdl(this_ptr, uri TSRMLS_CC); } if (sdl == NULL) { char* key; @@ -2199,7 +2233,7 @@ sdlPtr get_sdl(char *uri TSRMLS_DC) memcpy(key+len+sizeof("/wsdl-")-1,md5str,sizeof(md5str)); if ((sdl = get_sdl_from_cache(key, fn, t-SOAP_GLOBAL(cache_ttl))) == NULL) { - sdl = load_wsdl(fn); + sdl = load_wsdl(this_ptr, fn TSRMLS_CC); if (sdl != NULL) { add_sdl_to_cache(key, fn, t, sdl); } @@ -2207,7 +2241,7 @@ sdlPtr get_sdl(char *uri TSRMLS_DC) efree(key); } } else { - sdl = load_wsdl(uri); + sdl = load_wsdl(this_ptr, uri TSRMLS_CC); } SOAP_GLOBAL(error_code) = old_error_code; return sdl; diff --git a/ext/soap/php_sdl.h b/ext/soap/php_sdl.h index 77bb8d2b29..e2c4542604 100644 --- a/ext/soap/php_sdl.h +++ b/ext/soap/php_sdl.h @@ -249,7 +249,7 @@ struct _sdlAttribute { encodePtr encode; }; -sdlPtr get_sdl(char *uri TSRMLS_DC); +sdlPtr get_sdl(zval *this_ptr, char *uri TSRMLS_DC); encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr data, const char *type); encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type); diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 5038f9da18..80591c643d 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -877,7 +877,7 @@ PHP_METHOD(SoapServer, SoapServer) zend_hash_init(service->soap_functions.ft, 0, NULL, ZVAL_PTR_DTOR, 0); if (wsdl) { - service->sdl = get_sdl(Z_STRVAL_P(wsdl) TSRMLS_CC); + service->sdl = get_sdl(this_ptr, Z_STRVAL_P(wsdl) TSRMLS_CC); if (service->uri == NULL) { if (service->sdl->target_ns) { service->uri = estrdup(service->sdl->target_ns); @@ -2000,7 +2000,7 @@ PHP_METHOD(SoapClient, SoapClient) old_soap_version = SOAP_GLOBAL(soap_version); SOAP_GLOBAL(soap_version) = soap_version; - sdl = get_sdl(Z_STRVAL_P(wsdl) TSRMLS_CC); + sdl = get_sdl(this_ptr, Z_STRVAL_P(wsdl) TSRMLS_CC); ret = zend_list_insert(sdl, le_sdl); add_property_resource(this_ptr, "sdl", ret);