From 0a071ccb01722e66e3c3a551349abb959a196574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Mon, 26 Jun 2017 18:59:58 +0200 Subject: [PATCH] Fix merging default headers if overwritten with custom case headers --- src/RequestData.php | 15 ++++++++++++--- tests/RequestDataTest.php | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/RequestData.php b/src/RequestData.php index e9e39e5..f87a44d 100644 --- a/src/RequestData.php +++ b/src/RequestData.php @@ -23,15 +23,24 @@ private function mergeDefaultheaders(array $headers) $connectionHeaders = ('1.1' === $this->protocolVersion) ? array('Connection' => 'close') : array(); $authHeaders = $this->getAuthHeaders(); - return array_merge( + $defaults = array_merge( array( 'Host' => $this->getHost().$port, 'User-Agent' => 'React/alpha', ), $connectionHeaders, - $authHeaders, - $headers + $authHeaders ); + + // remove all defaults that already exist in $headers + $lower = array_change_key_case($headers, CASE_LOWER); + foreach ($defaults as $key => $_) { + if (isset($lower[strtolower($key)])) { + unset($defaults[$key]); + } + } + + return array_merge($defaults, $headers); } public function getScheme() diff --git a/tests/RequestDataTest.php b/tests/RequestDataTest.php index 9d63f8d..dc5f2b2 100644 --- a/tests/RequestDataTest.php +++ b/tests/RequestDataTest.php @@ -54,6 +54,23 @@ public function toStringReturnsHTTPRequestMessageWithHeaders() $this->assertSame($expected, $requestData->__toString()); } + /** @test */ + public function toStringReturnsHTTPRequestMessageWithHeadersInCustomCase() + { + $requestData = new RequestData('GET', 'http://www.example.com', array( + 'user-agent' => 'Hello', + 'LAST' => 'World' + )); + + $expected = "GET / HTTP/1.0\r\n" . + "Host: www.example.com\r\n" . + "user-agent: Hello\r\n" . + "LAST: World\r\n" . + "\r\n"; + + $this->assertSame($expected, $requestData->__toString()); + } + /** @test */ public function toStringReturnsHTTPRequestMessageWithProtocolVersionThroughConstructor() {