dmitry          Wed Oct  1 13:13:34 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src    NEWS 
    /php-src/ext/soap   php_http.c 
  Log:
  Added ability to send user defined HTTP headers with SOAP request.
  
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.336&r2=1.2027.2.547.2.965.2.337&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.336 
php-src/NEWS:1.2027.2.547.2.965.2.337
--- php-src/NEWS:1.2027.2.547.2.965.2.336       Wed Oct  1 07:30:30 2008
+++ php-src/NEWS        Wed Oct  1 13:13:34 2008
@@ -8,6 +8,9 @@
 
 - Changed openssl info to show the shared library version number. (Scott)
 
+- Added ability to send user defined HTTP headers with SOAP request.
+  (Brain J.France, Dmitry)
+
 - Fixed bug causing the algorithm parameter of mhash() to be modified. (Scott)
 
 - Fixed bug #46205 (Closure - Memory leaks when ReflectionException is thrown).
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_http.c?r1=1.77.2.11.2.12.2.5&r2=1.77.2.11.2.12.2.6&diff_format=u
Index: php-src/ext/soap/php_http.c
diff -u php-src/ext/soap/php_http.c:1.77.2.11.2.12.2.5 
php-src/ext/soap/php_http.c:1.77.2.11.2.12.2.6
--- php-src/ext/soap/php_http.c:1.77.2.11.2.12.2.5      Fri Apr  4 13:02:48 2008
+++ php-src/ext/soap/php_http.c Wed Oct  1 13:13:34 2008
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_http.c,v 1.77.2.11.2.12.2.5 2008/04/04 13:02:48 jorton Exp $ */
+/* $Id: php_http.c,v 1.77.2.11.2.12.2.6 2008/10/01 13:13:34 dmitry Exp $ */
 
 #include "php_soap.h"
 #include "ext/standard/base64.h"
@@ -106,12 +106,11 @@
        }
 }
 
-static php_stream* http_connect(zval* this_ptr, php_url *phpurl, int use_ssl, 
int *use_proxy TSRMLS_DC)
+static php_stream* http_connect(zval* this_ptr, php_url *phpurl, int use_ssl, 
php_stream_context *context, int *use_proxy TSRMLS_DC)
 {
        php_stream *stream;
        zval **proxy_host, **proxy_port, **tmp;
        char *host;
-       php_stream_context *context = NULL;
        char *name;
        long namelen;
        int port;
@@ -140,11 +139,6 @@
        old_error_reporting = EG(error_reporting);
        EG(error_reporting) &= 
~(E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE);
 
-       if (SUCCESS == zend_hash_find(Z_OBJPROP_P(this_ptr),
-                       "_stream_context", sizeof("_stream_context"), 
(void**)&tmp)) {
-               context = php_stream_context_from_zval(*tmp, 0);
-       }
-
        namelen = spprintf(&name, 0, "%s://%s:%d", (use_ssl && !*use_proxy)? 
"ssl" : "tcp", host, port);
 
        stream = php_stream_xport_create(name, namelen,
@@ -240,6 +234,7 @@
        char *content_encoding;
        char *http_msg = NULL;
        zend_bool old_allow_url_fopen;
+       php_stream_context *context = NULL;
 
        if (this_ptr == NULL || Z_TYPE_P(this_ptr) != IS_OBJECT) {
                return FALSE;
@@ -307,6 +302,11 @@
                phpurl = php_url_parse(location);
        }
 
+       if (SUCCESS == zend_hash_find(Z_OBJPROP_P(this_ptr),
+                       "_stream_context", sizeof("_stream_context"), 
(void**)&tmp)) {
+               context = php_stream_context_from_zval(*tmp, 0);
+       }
+
 try_again:
        if (phpurl == NULL || phpurl->host == NULL) {
          if (phpurl != NULL) {php_url_free(phpurl);}
@@ -374,7 +374,7 @@
        }
 
        if (!stream) {
-               stream = http_connect(this_ptr, phpurl, use_ssl, &use_proxy 
TSRMLS_CC);
+               stream = http_connect(this_ptr, phpurl, use_ssl, context, 
&use_proxy TSRMLS_CC);
                if (stream) {
                        php_stream_auto_cleanup(stream);
                        add_property_resource(this_ptr, "httpsocket", 
php_stream_get_resource_id(stream));
@@ -438,6 +438,14 @@
                                smart_str_appendl(&soap_headers, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
                                smart_str_append_const(&soap_headers, "\r\n");
                        }
+               } else if (context && 
+                          php_stream_context_get_option(context, "http", 
"user_agent", &tmp) == SUCCESS &&
+                          Z_TYPE_PP(tmp) == IS_STRING) {
+                       if (Z_STRLEN_PP(tmp) > 0) {
+                               smart_str_append_const(&soap_headers, 
"User-Agent: ");
+                               smart_str_appendl(&soap_headers, 
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+                               smart_str_append_const(&soap_headers, "\r\n");
+                       }
                } else{
                        smart_str_append_const(&soap_headers, "User-Agent: 
PHP-SOAP/"PHP_VERSION"\r\n");
                }
@@ -675,6 +683,64 @@
                                smart_str_append_const(&soap_headers, "\r\n");
                        }
                }
+
+               if (context &&
+                       php_stream_context_get_option(context, "http", 
"header", &tmp) == SUCCESS &&
+                       Z_TYPE_PP(tmp) == IS_STRING && Z_STRLEN_PP(tmp)) {
+                       char *s = Z_STRVAL_PP(tmp);
+                       char *p;
+                       int name_len;
+
+                       while (*s) {
+                               /* skip leading newlines and spaces */
+                               while (*s == ' ' || *s == '\t' || *s == '\r' || 
*s == '\n') {
+                                       s++;
+                               }
+                               /* extract header name */
+                               p = s;
+                               name_len = -1;
+                               while (*p) {
+                                       if (*p == ':') {
+                                               if (name_len < 0) name_len = p 
- s;
+                                               break;
+                                       } else if (*p == ' ' || *p == '\t') {
+                                               if (name_len < 0) name_len = p 
- s;
+                                       } else if (*p == '\r' || *p == '\n') {
+                                               break;
+                                       }
+                                       p++;
+                               }
+                               if (*p == ':') {
+                                       /* extract header value */
+                                       while (*p && *p != '\r' && *p != '\n') {
+                                               p++;
+                                       }
+                                       /* skip some predefined headers */
+                                       if ((name_len != sizeof("host")-1 ||
+                                            strncasecmp(s, "host", 
sizeof("host")-1) != 0) &&
+                                           (name_len != sizeof("connection")-1 
||
+                                            strncasecmp(s, "connection", 
sizeof("connection")-1) != 0) &&
+                                           (name_len != sizeof("user-agent")-1 
||
+                                            strncasecmp(s, "user-agent", 
sizeof("user-agent")-1) != 0) &&
+                                           (name_len != 
sizeof("content-length")-1 ||
+                                            strncasecmp(s, "content-length", 
sizeof("content-length")-1) != 0) &&
+                                           (name_len != 
sizeof("content-type")-1 ||
+                                            strncasecmp(s, "content-type", 
sizeof("content-type")-1) != 0) &&
+                                           (name_len != sizeof("cookie")-1 ||
+                                            strncasecmp(s, "cookie", 
sizeof("cookie")-1) != 0) &&
+                                           (name_len != 
sizeof("authorization")-1 ||
+                                            strncasecmp(s, "authorization", 
sizeof("authorization")-1) != 0) &&
+                                           (name_len != 
sizeof("proxy-authorization")-1 ||
+                                            strncasecmp(s, 
"proxy-authorization", sizeof("proxy-authorization")-1) != 0)) {
+                                           /* add header */
+                                               
smart_str_appendl(&soap_headers, s, p-s);
+                                               
smart_str_append_const(&soap_headers, "\r\n");
+                                       }
+                               }
+                               s = (*p) ? (p + 1) : p;
+                       }
+               }
+
                smart_str_append_const(&soap_headers, "\r\n");
                smart_str_0(&soap_headers);
                if (zend_hash_find(Z_OBJPROP_P(this_ptr), "trace", 
sizeof("trace"), (void **) &trace) == SUCCESS &&



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to