diff --git a/src/HttpsUri.php b/src/HttpsUri.php new file mode 100644 index 0000000000..0d9f205a10 --- /dev/null +++ b/src/HttpsUri.php @@ -0,0 +1,23 @@ +uri === null || is_string($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 0f977f08fa..b3a6c87159 100644 --- a/test/RequestTest.php +++ b/test/RequestTest.php @@ -323,6 +323,26 @@ public function testFromStringFactoryCreatesSingleObjectWithHeaderFolding() $this->assertEquals('foo-bar', $header->getFieldValue()); } + public function testRequestUriRespectsXForwardedProtoHeader() + { + $request = Request::fromString("GET /foo HTTP/1.1"); + $request->setUri("http://someurl.test"); + + $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() + { + $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