From b9f00b81d45d4560ab2735ef4eb7927b4e68321c Mon Sep 17 00:00:00 2001 From: Steve Reiter Date: Mon, 23 Oct 2017 20:37:28 -0600 Subject: [PATCH 1/3] Added support for x-forwarded-proto header to request object --- src/HttpsUri.php | 25 +++++++++++++++++++++++++ src/Request.php | 7 ++++++- test/RequestTest.php | 15 +++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/HttpsUri.php diff --git a/src/HttpsUri.php b/src/HttpsUri.php new file mode 100644 index 0000000000..9bfa02e8f1 --- /dev/null +++ b/src/HttpsUri.php @@ -0,0 +1,25 @@ +uri === null || is_string($this->uri)) { - $this->uri = new HttpUri($this->uri); + if ($this->getHeader('x-forwarded-proto') === 'https') { + $this->uri = new HttpsUri($this->uri); + } else { + $this->uri = new HttpUri($this->uri); + } } return $this->uri; } diff --git a/test/RequestTest.php b/test/RequestTest.php index 0f977f08fa..f023513ff2 100644 --- a/test/RequestTest.php +++ b/test/RequestTest.php @@ -323,6 +323,21 @@ public function testFromStringFactoryCreatesSingleObjectWithHeaderFolding() $this->assertEquals('foo-bar', $header->getFieldValue()); } + public function testRequestUriRespectsXForwardedProtoHeader() + { + $request = new Request(); + $request->setUri("http://someurl.test"); + $request->getHeaders()->addHeaderLine('X_FORWARDED_PROTO', 'https'); + $this->assertEquals('https', $request->getUri()->getScheme()); + } + + public function testRequestUriSchemeWithoutXForwardedProtoHeader() + { + $request = new Request(); + $request->setUri("http://someurl.test"); + $this->assertEquals('http', $request->getUri()->getScheme()); + } + /** * @see http://en.wikipedia.org/wiki/HTTP_response_splitting * @group ZF2015-04 From 02fc764895db375ff796c7af7a84637df75cadde Mon Sep 17 00:00:00 2001 From: Steve Reiter Date: Tue, 24 Oct 2017 11:31:23 -0600 Subject: [PATCH 2/3] Fixed implementation of X-Forwarded-Proto header support and cleaned up test case --- src/HttpsUri.php | 1 - src/Request.php | 11 ++++++----- test/RequestTest.php | 9 +++++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/HttpsUri.php b/src/HttpsUri.php index 9bfa02e8f1..574a526bc4 100644 --- a/src/HttpsUri.php +++ b/src/HttpsUri.php @@ -7,7 +7,6 @@ namespace Zend\Http; -use Zend\Uri\Exception as UriException; use Zend\Uri\Http as Http; class HttpsUri extends Http diff --git a/src/Request.php b/src/Request.php index 0f170fda8e..1605c7135b 100644 --- a/src/Request.php +++ b/src/Request.php @@ -227,11 +227,12 @@ public function setUri($uri) public function getUri() { if ($this->uri === null || is_string($this->uri)) { - if ($this->getHeader('x-forwarded-proto') === 'https') { - $this->uri = new HttpsUri($this->uri); - } else { - $this->uri = new HttpUri($this->uri); - } + $this->uri = new HttpUri($this->uri); + } + + $headers = $this->getHeaders()->toArray(); + if (array_key_exists('X-Forwarded-Proto', $headers) && $headers['X-Forwarded-Proto'] === 'https') { + $this->uri = new HttpsUri($this->uri); } return $this->uri; } diff --git a/test/RequestTest.php b/test/RequestTest.php index f023513ff2..b3a6c87159 100644 --- a/test/RequestTest.php +++ b/test/RequestTest.php @@ -325,10 +325,15 @@ public function testFromStringFactoryCreatesSingleObjectWithHeaderFolding() public function testRequestUriRespectsXForwardedProtoHeader() { - $request = new Request(); + $request = Request::fromString("GET /foo HTTP/1.1"); $request->setUri("http://someurl.test"); - $request->getHeaders()->addHeaderLine('X_FORWARDED_PROTO', 'https'); + + $headers = new Headers(); + $h = new GenericHeader('X-Forwarded-Proto', 'https'); + $headers->addHeader($h); + $request->setHeaders($headers); $this->assertEquals('https', $request->getUri()->getScheme()); + echo "End of my test"; } public function testRequestUriSchemeWithoutXForwardedProtoHeader() From d9aa92cbb746529916f685b0530d56cea3f9ddae Mon Sep 17 00:00:00 2001 From: Steve Reiter Date: Tue, 24 Oct 2017 11:47:23 -0600 Subject: [PATCH 3/3] Removed extra blank line at end of file --- src/HttpsUri.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/HttpsUri.php b/src/HttpsUri.php index 574a526bc4..0d9f205a10 100644 --- a/src/HttpsUri.php +++ b/src/HttpsUri.php @@ -21,4 +21,3 @@ public function getScheme() return 'https'; } } -