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;
After some more testing I needed to tweak the patch and the example,
here is version 2.
$opts = array('http' => array('header' => 'X-foo: bar'));
$ctx = stream_context_create($opts);
Brian
--- ext/soap/php_http.c.orig 2008-09-26 05:39:50.000000000 -0700
+++ ext/soap/php_http.c 2008-09-26 06:42:34.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,19 @@
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)) {
-
smart_str_appendl(&soap_headers, Z_STRVAL_PP(tmpzval),
Z_STRLEN_PP(tmpzval));
-
}
-
/* Send cookies along with request */ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies",
sizeof("_cookies"), (void **)&cookies) == SUCCESS) {
zval **data;
Hi Brian,
I think you patch does the things you like properly, but why do we need
such ability? I don't see a use-case.
In case of accepting this patch, we also need to care about duplicate
headers.
Thanks. Dmitry.
Brian J. France wrote:
After some more testing I needed to tweak the patch and the example,
here is version 2.$opts = array('http' => array('header' => 'X-foo: bar'));
$ctx = stream_context_create($opts);Brian
--- ext/soap/php_http.c.orig 2008-09-26 05:39:50.000000000 -0700
+++ ext/soap/php_http.c 2008-09-26 06:42:34.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,19 @@
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)) {
smart_str_appendl(&soap_headers, Z_STRVAL_PP(tmpzval),
Z_STRLEN_PP(tmpzval));
}
/* Send cookies along with request */ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies",
sizeof("_cookies"), (void **)&cookies) == SUCCESS) {
zval **data;
Dmitry Stogov wrote:
Hi Brian,
I think you patch does the things you like properly, but why do we need
such ability? I don't see a use-case.In case of accepting this patch, we also need to care about duplicate
headers.
Some web services require custom headers for authentication or to bounce
along information about the originating request in order to do proper
logging and accounting about which top-level users are causing the
backend web services requests.
-Rasmus
Hi Rasmus,
Rasmus Lerdorf wrote:
Dmitry Stogov wrote:
Hi Brian,
I think you patch does the things you like properly, but why do we need
such ability? I don't see a use-case.In case of accepting this patch, we also need to care about duplicate
headers.Some web services require custom headers for authentication or to bounce
along information about the originating request in order to do proper
logging and accounting about which top-level users are causing the
backend web services requests.
Could you give an example.
Thanks. Dmitry.
Dmitry Stogov wrote:
Hi Rasmus,
Rasmus Lerdorf wrote:
Dmitry Stogov wrote:
Hi Brian,
I think you patch does the things you like properly, but why do we need
such ability? I don't see a use-case.In case of accepting this patch, we also need to care about duplicate
headers.
Some web services require custom headers for authentication or to bounce
along information about the originating request in order to do proper
logging and accounting about which top-level users are causing the
backend web services requests.Could you give an example.
Well, for one a bunch of the internal Yahoo web services require a
certificate header. I doubt we are the only Web company who needs to
authenticate the higher-level users of lower-level web services.
We are running with Brian's patch now, but I don't really see the reason
not to make it possible for people to set custom headers on web services
requests.
Another example is the Weather Underground API. They ask you to set the
User-Agent to your email address so they can contact you if your app
starts causing them problems.
-Rasmus
Rasmus Lerdorf wrote:
Dmitry Stogov wrote:
Hi Rasmus,
Rasmus Lerdorf wrote:
Dmitry Stogov wrote:
Hi Brian,
I think you patch does the things you like properly, but why do we need
such ability? I don't see a use-case.In case of accepting this patch, we also need to care about duplicate
headers.
Some web services require custom headers for authentication or to bounce
along information about the originating request in order to do proper
logging and accounting about which top-level users are causing the
backend web services requests.Could you give an example.
Well, for one a bunch of the internal Yahoo web services require a
certificate header. I doubt we are the only Web company who needs to
authenticate the higher-level users of lower-level web services.We are running with Brian's patch now, but I don't really see the reason
not to make it possible for people to set custom headers on web services
requests.
I see. It's not a problem. I'll look and probably add the patch on this
week.
Thanks. Dmitry.
Another example is the Weather Underground API. They ask you to set the
User-Agent to your email address so they can contact you if your app
starts causing them problems.-Rasmus
just curious, why is ext/soap internally duplicating this http stuff
instead of using the http stream stuff directly? or did I
misunderstand something?
Am 29.09.2008 um 10:11 schrieb Dmitry Stogov:
Hi Brian,
I think you patch does the things you like properly, but why do we
need
such ability? I don't see a use-case.In case of accepting this patch, we also need to care about duplicate
headers.Thanks. Dmitry.
Brian J. France wrote:
After some more testing I needed to tweak the patch and the example,
here is version 2.$opts = array('http' => array('header' => 'X-foo: bar'));
$ctx = stream_context_create($opts);Brian
--- ext/soap/php_http.c.orig 2008-09-26 05:39:50.000000000 -0700
+++ ext/soap/php_http.c 2008-09-26 06:42:34.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,19 @@
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)) {
smart_str_appendl(&soap_headers, Z_STRVAL_PP(tmpzval),
Z_STRLEN_PP(tmpzval));
}
/* Send cookies along with request */ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies",
sizeof("_cookies"), (void **)&cookies) == SUCCESS) {
zval **data;
Hi Brain,
A little bit different patch committed into PHP_5_3 and HEAD.
I don't think it's allowed to commit it into PHP_5_2.
Please verify, if it works for you.
Thanks. Dmitry.
Brian J. France wrote:
After some more testing I needed to tweak the patch and the example,
here is version 2.$opts = array('http' => array('header' => 'X-foo: bar'));
$ctx = stream_context_create($opts);Brian
--- ext/soap/php_http.c.orig 2008-09-26 05:39:50.000000000 -0700
+++ ext/soap/php_http.c 2008-09-26 06:42:34.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,19 @@
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)) {
smart_str_appendl(&soap_headers, Z_STRVAL_PP(tmpzval),
Z_STRLEN_PP(tmpzval));
}
/* Send cookies along with request */ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies",
sizeof("_cookies"), (void **)&cookies) == SUCCESS) {
zval **data;