diff options
author | Vincent JARDIN <vjardin@free.fr> | 2019-04-23 23:10:38 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-05-13 10:51:03 +0200 |
commit | c55af3c65ac116bbd935bd3d695869d88056c49c (patch) | |
tree | bd0ec68ecbce722de76af62dd9fc85f035cd36da /ext/soap | |
parent | 357da6bc59268755323bc924b0aae93374c7e227 (diff) | |
download | php-git-c55af3c65ac116bbd935bd3d695869d88056c49c.tar.gz |
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',
],
]),
]);
Diffstat (limited to 'ext/soap')
-rw-r--r-- | ext/soap/php_http.c | 23 | ||||
-rw-r--r-- | ext/soap/tests/custom_content_type.phpt | 77 |
2 files changed, 98 insertions, 2 deletions
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-- +<?php + require_once('skipif.inc'); + + if (!file_exists(__DIR__ . "/../../../sapi/cli/tests/php_cli_server.inc")) { + echo "skip sapi/cli/tests/php_cli_server.inc required but not found"; + } +?> +--FILE-- +<?php + +include __DIR__ . "/../../../sapi/cli/tests/php_cli_server.inc"; + +$args = substr(PHP_OS, 0, 3) == 'WIN' ? "-d extension_dir=" . ini_get("extension_dir") . " -d extension=php_soap.dll" : ""; +$code = <<<'PHP' +/* Receive */ +$content = trim(file_get_contents("php://input")) . PHP_EOL; +PHP; + +php_cli_server_start($code, false, $args); + +$client = 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("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== |