]> granicus.if.org Git - php/commitdiff
Fix bug #73538
authorCraig Duncan <git@duncanc.co.uk>
Sun, 20 Nov 2016 17:41:14 +0000 (17:41 +0000)
committerNikita Popov <nikic@php.net>
Sun, 20 Nov 2016 20:18:28 +0000 (21:18 +0100)
Remove any previous default headers and replace with the specified
ones, as documented, and as is the case when a single header is
passed.

NEWS
ext/soap/soap.c
ext/soap/tests/bugs/bug73538.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index eafe8b68b344cab041de22bca25820a14e4f3ea1..3fe30bb30b21d9793b914894ed4701ca47180f28 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,10 @@ PHP                                                                        NEWS
   . Fixed bug #73087, #61183, #71494 (Memory corruption in bindParam).
     (Dorin Marcoci)
 
+- Soap:
+  . Fixed bug #73538 (SoapClient::__setSoapHeaders doesn't overwrite SOAP
+    headers). (duncan3dc)
+
 - SPL:
   . Fixed bug #73423 (Reproducible crash with GDB backtrace). (Laruence)
 
index a2170283c8b7be4a0de9779de31c1483df85db72..ffa988472c647a0ae2eef514362e7668ad934864 100644 (file)
@@ -3209,12 +3209,8 @@ PHP_METHOD(SoapClient, __setSoapHeaders)
        if (headers == NULL || Z_TYPE_P(headers) == IS_NULL) {
                zend_hash_str_del(Z_OBJPROP_P(this_ptr), "__default_headers", sizeof("__default_headers")-1);
        } else if (Z_TYPE_P(headers) == IS_ARRAY) {
-               zval *default_headers;
-
                verify_soap_headers_array(Z_ARRVAL_P(headers));
-               if ((default_headers = zend_hash_str_find(Z_OBJPROP_P(this_ptr), "__default_headers", sizeof("__default_headers")-1)) == NULL) {
-                       add_property_zval(this_ptr, "__default_headers", headers);
-               }
+               add_property_zval(this_ptr, "__default_headers", headers);
        } else if (Z_TYPE_P(headers) == IS_OBJECT &&
                   instanceof_function(Z_OBJCE_P(headers), soap_header_class_entry)) {
                zval default_headers;
diff --git a/ext/soap/tests/bugs/bug73538.phpt b/ext/soap/tests/bugs/bug73538.phpt
new file mode 100644 (file)
index 0000000..1bf0372
--- /dev/null
@@ -0,0 +1,35 @@
+--TEST--
+SOAP: SoapClient::__setHeaders array overrides previous headers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$client = new SoapClient(null, [
+    "location"      =>  "test://",
+    "uri"           =>  "test://",
+    "exceptions"    =>  false,
+    "trace"         =>  true,
+]);
+$client->__setSoapHeaders(new \SoapHeader('ns', 'Header', ['something' => 1]));
+$client->__setSoapHeaders(new \SoapHeader('ns', 'Header', ['something' => 2]));
+$client->test();
+echo $client->__getLastRequest();
+
+$client = new SoapClient(null, [
+    "location"      =>  "test://",
+    "uri"           =>  "test://",
+    "exceptions"    =>  false,
+    "trace"         =>  true,
+]);
+$client->__setSoapHeaders([new \SoapHeader('ns', 'Header', ['something' => 1])]);
+$client->__setSoapHeaders([new \SoapHeader('ns', 'Header', ['something' => 2])]);
+$client->test();
+echo $client->__getLastRequest();
+
+?>
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="test://" xmlns:ns2="ns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header><ns2:Header><item><key>something</key><value>2</value></item></ns2:Header></SOAP-ENV:Header><SOAP-ENV:Body><ns1:test/></SOAP-ENV:Body></SOAP-ENV:Envelope>
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="test://" xmlns:ns2="ns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header><ns2:Header><item><key>something</key><value>2</value></item></ns2:Header></SOAP-ENV:Header><SOAP-ENV:Body><ns1:test/></SOAP-ENV:Body></SOAP-ENV:Envelope>