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

Reply via email to