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);
|
||||
|
||||
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);
|
||||
|
|
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