ext/soap and http header
| From: | Brian J. France | Date: | Fri, 26 Sep 2008 13:15:12 +0000 |
| Subject: | ext/soap and http header | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-40707@lists.php.net to get a copy of this message | ||
Hi,
Currently there isn't a way to add http headers into a soap request. Below is a patch to get headers from the passed in context (code taken from ext/standard/http_fopen_wrapper.c). Doing something like this:
$opts = array('http' => array('header' => 'X-foo: bar'));
$ctx = stream_context_create($opts);
and then passing $ctx into the SoapClient constructor. This is a simple patch as it assumes the user isn't going to duplicate items like content-type, user-agent or other headers already set by the soap client code.
This patch is based on 5.2.5, it could easily be ported to HEAD/5_3/5_2.
Thoughts?
Thanks,
Brian
---------
--- ext/soap/php_http.c.orig 2008-09-26 05:39:50.000000000 -0700
+++ ext/soap/php_http.c 2008-09-26 05:54:15.000000000 -0700
@@ -391,7 +391,8 @@
PG(allow_url_fopen) = old_allow_url_fopen;
if (stream) {
- zval **cookies, **login, **password;
+ php_stream_context *context = NULL;+ zval **cookies, **login, **password, **tmpzval = NULL; int ret = zend_list_insert(phpurl, le_url); add_property_resource(this_ptr, "httpurl", ret); @@ -638,6 +639,23 @@ proxy_authentication(this_ptr, &soap_headers TSRMLS_CC); } + /* get context to check for http headers */ + 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);
+ }
+
+ /* Send http headers from context */
+ if (context &&
+ php_stream_context_get_option(context, "http", "header", &tmpzval) == SUCCESS &&
+ Z_TYPE_PP(tmpzval) == IS_STRING && Z_STRLEN_PP(tmpzval)) {
+ char *tmp = php_trim(Z_STRVAL_PP(tmpzval), Z_STRLEN_PP(tmpzval), NULL, 0, NULL, 3 TSRMLS_CC);
+ int len = strlen(tmp);
+ if (len > 0) {
+ smart_str_appendl(&soap_headers, tmp, len);
+ }+ } + /* Send cookies along with request */ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies", sizeof("_cookies"), (void **)&cookies) == SUCCESS) { zval **data;