dmitry Tue Nov 9 03:13:36 2004 EDT Modified files: /php-src/ext/libxml libxml.c php_libxml.h /php-src/ext/soap php_sdl.c php_sdl.h soap.c Log: Fixed bug #29211 (SoapClient doesn't request wsdl through proxy). (Rob)
http://cvs.php.net/diff.php/php-src/ext/libxml/libxml.c?r1=1.23&r2=1.24&ty=u Index: php-src/ext/libxml/libxml.c diff -u php-src/ext/libxml/libxml.c:1.23 php-src/ext/libxml/libxml.c:1.24 --- php-src/ext/libxml/libxml.c:1.23 Wed Sep 8 06:15:41 2004 +++ php-src/ext/libxml/libxml.c Tue Nov 9 03:13:35 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: libxml.c,v 1.23 2004/09/08 10:15:41 rrichards Exp $ */ +/* $Id: libxml.c,v 1.24 2004/11/09 08:13:35 dmitry Exp $ */ #define IS_EXT_MODULE @@ -243,10 +243,18 @@ 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 @@ 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 @@ 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 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 @@ } /* }}} */ - /* {{{ Common functions shared by extensions */ int php_libxml_xmlCheckUTF8(const unsigned char *s) { http://cvs.php.net/diff.php/php-src/ext/libxml/php_libxml.h?r1=1.10&r2=1.11&ty=u Index: php-src/ext/libxml/php_libxml.h diff -u php-src/ext/libxml/php_libxml.h:1.10 php-src/ext/libxml/php_libxml.h:1.11 --- php-src/ext/libxml/php_libxml.h:1.10 Wed Sep 8 06:15:41 2004 +++ php-src/ext/libxml/php_libxml.h Tue Nov 9 03:13:35 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_libxml.h,v 1.10 2004/09/08 10:15:41 rrichards Exp $ */ +/* $Id: php_libxml.h,v 1.11 2004/11/09 08:13:35 dmitry Exp $ */ #ifndef PHP_LIBXML_H #define PHP_LIBXML_H @@ -67,6 +67,7 @@ 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 @@ 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 */ http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.c?r1=1.75&r2=1.76&ty=u Index: php-src/ext/soap/php_sdl.c diff -u php-src/ext/soap/php_sdl.c:1.75 php-src/ext/soap/php_sdl.c:1.76 --- php-src/ext/soap/php_sdl.c:1.75 Sun Sep 26 17:45:17 2004 +++ php-src/ext/soap/php_sdl.c Tue Nov 9 03:13:35 2004 @@ -17,9 +17,10 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_sdl.c,v 1.75 2004/09/26 21:45:17 helly Exp $ */ +/* $Id: php_sdl.c,v 1.76 2004/11/09 08:13:35 dmitry Exp $ */ #include "php_soap.h" +#include "ext/libxml/php_libxml.h" #include "libxml/uri.h" #include "ext/standard/md5.h" @@ -194,18 +195,51 @@ 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); @@ -264,7 +298,7 @@ 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); } @@ -557,7 +591,7 @@ return parameters; } -static sdlPtr load_wsdl(char *struri) +static sdlPtr load_wsdl(zval *this_ptr, char *struri TSRMLS_DC) { sdlCtx ctx; int i,n; @@ -574,7 +608,7 @@ 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); @@ -2163,7 +2197,7 @@ 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); @@ -2177,7 +2211,7 @@ 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; @@ -2198,7 +2232,7 @@ 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); } @@ -2206,7 +2240,7 @@ efree(key); } } else { - sdl = load_wsdl(uri); + sdl = load_wsdl(this_ptr, uri TSRMLS_CC); } SOAP_GLOBAL(error_code) = old_error_code; return sdl; http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.h?r1=1.32&r2=1.33&ty=u Index: php-src/ext/soap/php_sdl.h diff -u php-src/ext/soap/php_sdl.h:1.32 php-src/ext/soap/php_sdl.h:1.33 --- php-src/ext/soap/php_sdl.h:1.32 Thu Aug 26 14:40:10 2004 +++ php-src/ext/soap/php_sdl.h Tue Nov 9 03:13:35 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_sdl.h,v 1.32 2004/08/26 18:40:10 dmitry Exp $ */ +/* $Id: php_sdl.h,v 1.33 2004/11/09 08:13:35 dmitry Exp $ */ #ifndef PHP_SDL_H #define PHP_SDL_H @@ -249,7 +249,7 @@ 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); http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.123&r2=1.124&ty=u Index: php-src/ext/soap/soap.c diff -u php-src/ext/soap/soap.c:1.123 php-src/ext/soap/soap.c:1.124 --- php-src/ext/soap/soap.c:1.123 Thu Nov 4 10:30:28 2004 +++ php-src/ext/soap/soap.c Tue Nov 9 03:13:35 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: soap.c,v 1.123 2004/11/04 15:30:28 dmitry Exp $ */ +/* $Id: soap.c,v 1.124 2004/11/09 08:13:35 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -877,7 +877,7 @@ 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 @@ 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);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php