mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
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', ], ]), ]);
This commit is contained in:
parent
357da6bc59
commit
c55af3c65a
2 changed files with 98 additions and 2 deletions
|
@ -617,7 +617,16 @@ try_again:
|
||||||
smart_str_append_smart_str(&soap_headers, &soap_headers_z);
|
smart_str_append_smart_str(&soap_headers, &soap_headers_z);
|
||||||
|
|
||||||
if (soap_version == SOAP_1_2) {
|
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) {
|
if (soapaction) {
|
||||||
smart_str_append_const(&soap_headers,"; action=\"");
|
smart_str_append_const(&soap_headers,"; action=\"");
|
||||||
smart_str_appends(&soap_headers, soapaction);
|
smart_str_appends(&soap_headers, soapaction);
|
||||||
|
@ -625,7 +634,17 @@ try_again:
|
||||||
}
|
}
|
||||||
smart_str_append_const(&soap_headers,"\r\n");
|
smart_str_append_const(&soap_headers,"\r\n");
|
||||||
} else {
|
} 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) {
|
if (soapaction) {
|
||||||
smart_str_append_const(&soap_headers, "SOAPAction: \"");
|
smart_str_append_const(&soap_headers, "SOAPAction: \"");
|
||||||
smart_str_appends(&soap_headers, soapaction);
|
smart_str_appends(&soap_headers, soapaction);
|
||||||
|
|
77
ext/soap/tests/custom_content_type.phpt
Normal file
77
ext/soap/tests/custom_content_type.phpt
Normal file
|
@ -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==
|
Loading…
Add table
Add a link
Reference in a new issue