From: Vincent JARDIN Date: Tue, 23 Apr 2019 21:10:38 +0000 (+0200) Subject: Support content_type stream context option in soap X-Git-Tag: php-7.4.0alpha1~283 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c55af3c65ac116bbd935bd3d695869d88056c49c;p=php Support content_type stream context option in soap Allows overriding the HTTP header using the HTTP context: $client = new SoapClient('http://url.wsdl&v=latest', [ 'stream_context' => stream_context_create([ 'http' => [ 'content_type' => 'foobarX', ], ]), ]); --- diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index 9df865b76a..5938a2e081 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -617,7 +617,16 @@ try_again: smart_str_append_smart_str(&soap_headers, &soap_headers_z); if (soap_version == SOAP_1_2) { - smart_str_append_const(&soap_headers,"Content-Type: application/soap+xml; charset=utf-8"); + if (context && + (tmp = php_stream_context_get_option(context, "http", "content_type")) != NULL && + Z_TYPE_P(tmp) == IS_STRING && + Z_STRLEN_P(tmp) > 0 + ) { + smart_str_append_const(&soap_headers, "Content-Type: "); + smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)); + } else { + smart_str_append_const(&soap_headers, "Content-Type: application/soap+xml; charset=utf-8"); + } if (soapaction) { smart_str_append_const(&soap_headers,"; action=\""); smart_str_appends(&soap_headers, soapaction); @@ -625,7 +634,17 @@ try_again: } smart_str_append_const(&soap_headers,"\r\n"); } else { - smart_str_append_const(&soap_headers,"Content-Type: text/xml; charset=utf-8\r\n"); + if (context && + (tmp = php_stream_context_get_option(context, "http", "content_type")) != NULL && + Z_TYPE_P(tmp) == IS_STRING && + Z_STRLEN_P(tmp) > 0 + ) { + smart_str_append_const(&soap_headers, "Content-Type: "); + smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)); + smart_str_append_const(&soap_headers, "\r\n"); + } else { + smart_str_append_const(&soap_headers, "Content-Type: text/xml; charset=utf-8\r\n"); + } if (soapaction) { smart_str_append_const(&soap_headers, "SOAPAction: \""); smart_str_appends(&soap_headers, soapaction); diff --git a/ext/soap/tests/custom_content_type.phpt b/ext/soap/tests/custom_content_type.phpt new file mode 100644 index 0000000000..b0dbc1d651 --- /dev/null +++ b/ext/soap/tests/custom_content_type.phpt @@ -0,0 +1,77 @@ +--TEST-- +SOAP customized Content-Type, eg. SwA use case +--SKIPIF-- + +--FILE-- + 'http://' . PHP_CLI_SERVER_ADDRESS, + 'uri' => 'misc-uri', + 'soap_version' => SOAP_1_2, + 'user_agent' => 'Vincent JARDIN, test headers', + 'trace' => true, /* record the headers before sending */ + 'stream_context' => stream_context_create([ + 'http' => [ + 'header' => sprintf("MIME-Version: 1.0\r\n"), + 'content_type' => sprintf("Multipart/Related") + ], + ]), +]); + +$client->__soapCall("foo", [ 'arg1' => "XXXbar"]); + +$headers = $client->__getLastRequestHeaders(); + +if (strpos($headers, 'Multipart/Related; action="misc-uri#foo"') === FALSE) + printf("Content-Type NOK %s" . PHP_EOL, $headers); +else + printf("Content-Type OK" . PHP_EOL); + +/* + * In case of an empty content-type, let's fallback to the default content. + */ +$client2 = new soapclient(NULL, [ + 'location' => 'http://' . PHP_CLI_SERVER_ADDRESS, + 'uri' => 'misc-uri', + 'soap_version' => SOAP_1_2, + 'user_agent' => 'Vincent JARDIN, test headers', + 'trace' => true, /* record the headers before sending */ + 'stream_context' => stream_context_create([ + 'http' => [ + 'header' => sprintf("MIME-Version: 1.0\r\n"), + 'content_type' => sprintf("") + ], + ]), +]); + +$client2->__soapCall("foo", [ 'arg1' => "XXXbar"]); + +$headers = $client2->__getLastRequestHeaders(); + +if (strpos($headers, 'Content-Type: application/soap+xml; charset=utf-8; action="misc-uri#foo"') === FALSE) + printf("Content-Type Default NOK %s" . PHP_EOL, $headers); +else + printf("Content-Type Default OK" . PHP_EOL); +?> +==DONE== +--EXPECT-- +Content-Type OK +Content-Type Default OK +==DONE==