From 083343bd9e77e086ca40bfa6e29fa20314e81461 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 19 Jul 2018 22:56:34 +0200 Subject: [PATCH 1/4] Improvment withUri --- src/RequestTrait.php | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/RequestTrait.php b/src/RequestTrait.php index a1bdc3de..e8d2fffa 100644 --- a/src/RequestTrait.php +++ b/src/RequestTrait.php @@ -251,10 +251,13 @@ public function getUri() */ public function withUri(UriInterface $uri, $preserveHost = false) { + $normalizedHeader = 'host'; $new = clone $this; $new->uri = $uri; - if ($preserveHost && $this->hasHeader('Host')) { + $hasHeader = isset($this->headerNames[$normalizedHeader]); + + if ($preserveHost && isset($hasHeader)) { return $new; } @@ -267,18 +270,13 @@ public function withUri(UriInterface $uri, $preserveHost = false) $host .= ':' . $uri->getPort(); } - $new->headerNames['host'] = 'Host'; - - // Remove an existing host header if present, regardless of current - // de-normalization of the header name. - // @see https://github.com/zendframework/zend-diactoros/issues/91 - foreach (array_keys($new->headers) as $header) { - if (strtolower($header) === 'host') { - unset($new->headers[$header]); - } + if ($hasHeader) { + unset($new->headers[$new->headerNames[$normalizedHeader]]); } - $new->headers['Host'] = [$host]; + $header = 'Host'; + $new->headerNames[$normalizedHeader] = $header; + $new->headers[$header] = [$host]; return $new; } From 98237e108a80c36fc0ed02ddbd03f7129b525d31 Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 19 Jul 2018 23:05:31 +0200 Subject: [PATCH 2/4] Avoid other string operations --- src/MessageTrait.php | 4 ++++ src/Request.php | 21 ++++----------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/MessageTrait.php b/src/MessageTrait.php index d249d86a..dca9600a 100644 --- a/src/MessageTrait.php +++ b/src/MessageTrait.php @@ -269,6 +269,10 @@ public function withoutHeader($header) $normalized = strtolower($header); $original = $this->headerNames[$normalized]; + if ($normalized === 'host') { + return $this; + } + $new = clone $this; unset($new->headers[$original], $new->headerNames[$normalized]); return $new; diff --git a/src/Request.php b/src/Request.php index 422862ec..aa89b158 100644 --- a/src/Request.php +++ b/src/Request.php @@ -41,14 +41,7 @@ public function __construct($uri = null, $method = null, $body = 'php://temp', a */ public function getHeaders() { - $headers = $this->headers; - if (! $this->hasHeader('host') - && $this->uri->getHost() - ) { - $headers['Host'] = [$this->getHostFromUri()]; - } - - return $headers; + return $this->headers; } /** @@ -56,18 +49,12 @@ public function getHeaders() */ public function getHeader($header) { - if (! $this->hasHeader($header)) { - if (strtolower($header) === 'host' - && $this->uri->getHost() - ) { - return [$this->getHostFromUri()]; - } + $normalized = strtolower($header); + if (! isset($this->headerNames[$normalized])) { return []; } - $header = $this->headerNames[strtolower($header)]; - - return $this->headers[$header]; + return $this->headers[$this->headerNames[$normalized]]; } } From 192879924cef5f83000e8adcfc7da3deaa64413d Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 19 Jul 2018 23:28:45 +0200 Subject: [PATCH 3/4] Refactor header methods --- src/MessageTrait.php | 33 +++++++++++++++++++-------------- src/Request.php | 22 ---------------------- 2 files changed, 19 insertions(+), 36 deletions(-) diff --git a/src/MessageTrait.php b/src/MessageTrait.php index dca9600a..e4df191c 100644 --- a/src/MessageTrait.php +++ b/src/MessageTrait.php @@ -123,7 +123,12 @@ public function getHeaders() */ public function hasHeader($header) { - return isset($this->headerNames[strtolower($header)]); + return $this->hasHeaderNormalized(strtolower($header)); + } + + private function hasHeaderNormalized($normalizedHeader) + { + return isset($this->headerNames[$normalizedHeader]); } /** @@ -142,13 +147,13 @@ public function hasHeader($header) */ public function getHeader($header) { - if (! $this->hasHeader($header)) { + $normalized = strtolower($header); + + if (! $this->hasHeaderNormalized($normalized)) { return []; } - $header = $this->headerNames[strtolower($header)]; - - return $this->headers[$header]; + return $this->headers[$this->headerNames[$normalized]]; } /** @@ -198,16 +203,16 @@ public function getHeaderLine($name) */ public function withHeader($header, $value) { - $this->assertHeader($header); + $new = clone $this; + $new->assertHeader($header); $normalized = strtolower($header); - $new = clone $this; - if ($new->hasHeader($header)) { + if ($new->hasHeaderNormalized($normalized)) { unset($new->headers[$new->headerNames[$normalized]]); } - $value = $this->filterHeaderValue($value); + $value = $new->filterHeaderValue($value); $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; @@ -262,18 +267,18 @@ public function withAddedHeader($header, $value) */ public function withoutHeader($header) { - if (! $this->hasHeader($header)) { - return clone $this; - } - $normalized = strtolower($header); - $original = $this->headerNames[$normalized]; if ($normalized === 'host') { return $this; } + if (! $this->hasHeaderNormalized($normalized)) { + return clone $this; + } + $new = clone $this; + $original = $new->headerNames[$normalized]; unset($new->headers[$original], $new->headerNames[$normalized]); return $new; } diff --git a/src/Request.php b/src/Request.php index aa89b158..054d2a5a 100644 --- a/src/Request.php +++ b/src/Request.php @@ -35,26 +35,4 @@ public function __construct($uri = null, $method = null, $body = 'php://temp', a { $this->initialize($uri, $method, $body, $headers); } - - /** - * {@inheritdoc} - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * {@inheritdoc} - */ - public function getHeader($header) - { - $normalized = strtolower($header); - - if (! isset($this->headerNames[$normalized])) { - return []; - } - - return $this->headers[$this->headerNames[$normalized]]; - } } From 40eed95193977e66bd427b4ce4b3a667734c13bd Mon Sep 17 00:00:00 2001 From: Witold Wasiczko Date: Thu, 19 Jul 2018 23:51:33 +0200 Subject: [PATCH 4/4] Some other improvements --- src/MessageTrait.php | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/MessageTrait.php b/src/MessageTrait.php index e4df191c..6d67d4b9 100644 --- a/src/MessageTrait.php +++ b/src/MessageTrait.php @@ -212,12 +212,7 @@ public function withHeader($header, $value) unset($new->headers[$new->headerNames[$normalized]]); } - $value = $new->filterHeaderValue($value); - - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - - return $new; + return $this->addNewHeader($new, $normalized, $header, $value); } /** @@ -241,18 +236,31 @@ public function withAddedHeader($header, $value) { $this->assertHeader($header); - if (! $this->hasHeader($header)) { - return $this->withHeader($header, $value); + $normalized = strtolower($header); + + $new = clone $this; + + if (! $this->hasHeaderNormalized($normalized)) { + return $new->addNewHeader($new, $normalized, $header, $value); } - $header = $this->headerNames[strtolower($header)]; + $header = $new->headerNames[$normalized]; - $new = clone $this; - $value = $this->filterHeaderValue($value); + $value = $new->filterHeaderValue($value); $new->headers[$header] = array_merge($this->headers[$header], $value); return $new; } + private function addNewHeader(self $instance, $normalizedHeader, $header, $value) + { + $value = $instance->filterHeaderValue($value); + + $instance->headerNames[$normalizedHeader] = $header; + $instance->headers[$header] = $value; + + return $instance; + } + /** * Return an instance without the specified header. * @@ -339,19 +347,15 @@ private function getStream($stream, $modeIfNotInstance) */ private function setHeaders(array $originalHeaders) { - $headerNames = $headers = []; + $this->headerNames = $this->headers = []; foreach ($originalHeaders as $header => $value) { - $value = $this->filterHeaderValue($value); + $normalized = strtolower($header); $this->assertHeader($header); - $headerNames[strtolower($header)] = $header; - $headers[$header] = $value; + $this->addNewHeader($this, $normalized, $header, $value); } - - $this->headerNames = $headerNames; - $this->headers = $headers; } /**