summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--ext/soap/php_http.c141
-rw-r--r--ext/soap/php_http.h9
-rw-r--r--ext/soap/php_sdl.c10
4 files changed, 94 insertions, 68 deletions
diff --git a/NEWS b/NEWS
index af4f4c9287..ed26589ad7 100644
--- a/NEWS
+++ b/NEWS
@@ -73,6 +73,8 @@ PHP NEWS
User-Agent header). (carloschilazo at gmail dot com)
. Fixed bug #60842, #51775 (Chunked response parsing error when
chunksize length line is > 10 bytes). (Ilia)
+ . Fixed bug #49853 (Soap Client stream context header option ignored).
+ (Dmitry)
- PDO
. Fixed bug #61292 (Segfault while calling a method on an overloaded PDO
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index 2933576ed8..a15648808d 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -32,7 +32,7 @@ static int get_http_headers(php_stream *socketd,char **response, int *out_size T
smart_str_appendl(str,const,sizeof(const)-1)
/* Proxy HTTP Authentication */
-void proxy_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC)
+int proxy_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC)
{
zval **login, **password;
@@ -53,11 +53,13 @@ void proxy_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC)
smart_str_append_const(soap_headers, "\r\n");
efree(buf);
smart_str_free(&auth);
+ return 1;
}
+ return 0;
}
/* HTTP Authentication */
-void basic_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC)
+int basic_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC)
{
zval **login, **password;
@@ -79,6 +81,78 @@ void basic_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC)
smart_str_append_const(soap_headers, "\r\n");
efree(buf);
smart_str_free(&auth);
+ return 1;
+ }
+ return 0;
+}
+
+/* Additional HTTP headers */
+void http_context_headers(php_stream_context* context,
+ zend_bool has_authorization,
+ zend_bool has_proxy_authorization,
+ zend_bool has_cookies,
+ smart_str* soap_headers TSRMLS_DC)
+{
+ zval **tmp;
+
+ 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) &&
+ (!has_cookies ||
+ name_len != sizeof("cookie")-1 ||
+ strncasecmp(s, "cookie", sizeof("cookie")-1) != 0) &&
+ (!has_authorization ||
+ name_len != sizeof("authorization")-1 ||
+ strncasecmp(s, "authorization", sizeof("authorization")-1) != 0) &&
+ (!has_proxy_authorization ||
+ 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;
+ }
}
}
@@ -664,8 +738,7 @@ try_again:
/* Proxy HTTP Authentication */
if (use_proxy && !use_ssl) {
- has_proxy_authorization = 1;
- proxy_authentication(this_ptr, &soap_headers TSRMLS_CC);
+ has_proxy_authorization = proxy_authentication(this_ptr, &soap_headers TSRMLS_CC);
}
/* Send cookies along with request */
@@ -707,65 +780,7 @@ try_again:
}
}
- 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) &&
- (!has_cookies ||
- name_len != sizeof("cookie")-1 ||
- strncasecmp(s, "cookie", sizeof("cookie")-1) != 0) &&
- (!has_authorization ||
- name_len != sizeof("authorization")-1 ||
- strncasecmp(s, "authorization", sizeof("authorization")-1) != 0) &&
- (!has_proxy_authorization ||
- 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;
- }
- }
+ http_context_headers(context, has_authorization, has_proxy_authorization, has_cookies, &soap_headers TSRMLS_CC);
smart_str_append_const(&soap_headers, "\r\n");
smart_str_0(&soap_headers);
diff --git a/ext/soap/php_http.h b/ext/soap/php_http.h
index 2cab5c06c9..540a91708a 100644
--- a/ext/soap/php_http.h
+++ b/ext/soap/php_http.h
@@ -31,6 +31,11 @@ int make_http_soap_request(zval *this_ptr,
char **response,
int *response_len TSRMLS_DC);
-void proxy_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC);
-void basic_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC);
+int proxy_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC);
+int basic_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC);
+void http_context_headers(php_stream_context* context,
+ zend_bool has_authorization,
+ zend_bool has_proxy_authorization,
+ zend_bool has_cookies,
+ smart_str* soap_headers TSRMLS_DC);
#endif
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index eeedc510f1..d250850786 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -3196,6 +3196,8 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, long cache_wsdl TSRMLS_DC)
smart_str headers = {0};
char* key = NULL;
time_t t = time(0);
+ zend_bool has_proxy_authorization = 0;
+ zend_bool has_authorization = 0;
if (strchr(uri,':') != NULL || IS_ABSOLUTE_PATH(uri, uri_len)) {
uri_len = strlen(uri);
@@ -3299,10 +3301,10 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, long cache_wsdl TSRMLS_DC)
zval_ptr_dtor(&str_proxy);
}
- proxy_authentication(this_ptr, &headers TSRMLS_CC);
+ has_proxy_authorization = proxy_authentication(this_ptr, &headers TSRMLS_CC);
}
- basic_authentication(this_ptr, &headers TSRMLS_CC);
+ has_authorization = basic_authentication(this_ptr, &headers TSRMLS_CC);
/* Use HTTP/1.1 with "Connection: close" by default */
if (php_stream_context_get_option(context, "http", "protocol_version", &tmp) == FAILURE) {
@@ -3311,7 +3313,7 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, long cache_wsdl TSRMLS_DC)
ZVAL_DOUBLE(http_version, 1.1);
php_stream_context_set_option(context, "http", "protocol_version", http_version);
zval_ptr_dtor(&http_version);
- smart_str_appendl(&headers, "Connection: close", sizeof("Connection: close")-1);
+ smart_str_appendl(&headers, "Connection: close\r\n", sizeof("Connection: close\r\n")-1);
}
if (headers.len > 0) {
@@ -3319,6 +3321,8 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, long cache_wsdl TSRMLS_DC)
if (!context) {
context = php_stream_context_alloc(TSRMLS_C);
+ } else {
+ http_context_headers(context, has_authorization, has_proxy_authorization, 0, &headers TSRMLS_CC);
}
smart_str_0(&headers);