From c55af3c65ac116bbd935bd3d695869d88056c49c Mon Sep 17 00:00:00 2001 From: Vincent JARDIN Date: Tue, 23 Apr 2019 23:10:38 +0200 Subject: [PATCH] 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', ], ]), ]); --- ext/soap/php_http.c | 23 +++++++- ext/soap/tests/custom_content_type.phpt | 77 +++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 ext/soap/tests/custom_content_type.phpt 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== -- 2.40.0