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);
}
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);
--- /dev/null
+--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==