From f706d47c6d2c9bfa6778b921ceaf933568d3e37d Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Sun, 26 Apr 2015 16:05:46 -0400 Subject: [PATCH] Update Request to implement changes to PSR-7 PR #523 --- src/Message/Request.php | 97 +++---------- test/tests/unit/Message/RequestTest.php | 185 ++++++++++++------------ 2 files changed, 108 insertions(+), 174 deletions(-) diff --git a/src/Message/Request.php b/src/Message/Request.php index 2f12790..20a3501 100644 --- a/src/Message/Request.php +++ b/src/Message/Request.php @@ -17,86 +17,6 @@ class Request extends Message implements RequestInterface // ------------------------------------------------------------------------ // Psr\Http\Message\RequestInterface - /** - * Extends MessageInterface::getHeaders() to provide request-specific - * behavior. - * - * Retrieves all message headers. - * - * This method acts exactly like MessageInterface::getHeaders(), with one - * behavioral change: if the Host header has not been previously set, the - * method MUST attempt to pull the host segment of the composed URI, if - * present. - * - * @see MessageInterface::getHeaders() - * @see UriInterface::getHost() - * @return array Returns an associative array of the message's headers. Each - * key MUST be a header name, and each value MUST be an array of strings. - */ - public function getHeaders() - { - $headers = parent::getHeaders(); - // Add a host header, if none is present. - if (!$this->hasHeader("host") && isset($this->uri)) { - $headers["Host"] = [$this->uri->getHost()]; - } - return $headers; - } - - /** - * Extends MessageInterface::getHeader() to provide request-specific - * behavior. - * - * This method acts exactly like MessageInterface::getHeader(), with - * one behavioral change: if the Host header is requested, but has - * not been previously set, the method MUST attempt to pull the host - * component of the composed URI, if present. - * - * @see MessageInterface::getHeader() - * @see UriInterface::getHost() - * @param string $name Case-insensitive header field name. - * @return string[] An array of string values as provided for the given - * header. If the header does not appear in the message, this method MUST - * return an empty array. - */ - public function getHeader($name) - { - $header = parent::getHeader($name); - if ($header === [] && (strtolower($name) === "host") && isset($this->uri)) { - $header = [$this->uri->getHost()]; - } - return $header; - } - - /** - * Extends MessageInterface::getHeaderLines() to provide request-specific - * behavior. - * - * This method returns all of the header values of the given - * case-insensitive header name as a string concatenated together using - * a comma. - * - * This method acts exactly like MessageInterface::getHeaderLines(), with - * one behavioral change: if the Host header is requested, but has - * not been previously set, the method MUST attempt to pull the host - * component of the composed URI, if present. - * - * @see MessageInterface::getHeaderLine() - * @see UriInterface::getHost() - * @param string $name Case-insensitive header field name. - * @return string|null A string of values as provided for the given header - * concatenated together using a comma. If the header does not appear in - * the message, this method MUST return a null value. - */ - public function getHeaderLine($name) - { - $headerLine = parent::getHeaderLine($name); - if ($headerLine === null && (strtolower($name) === "host") && isset($this->uri)) { - $headerLine = $this->uri->getHost(); - } - return $headerLine; - } - /** * Retrieves the message's request target. * @@ -226,6 +146,23 @@ class Request extends Message implements RequestInterface public function withUri(UriInterface $uri, $preserveHost = false) { $request = clone $this; + + $newHost = $uri->getHost(); + $oldHost = isset($request->headers["Host"]) ? $request->headers["Host"] : ""; + + if ($preserveHost === false) { + // Update Host + if ($newHost && $newHost !== $oldHost) { + unset($request->headers["Host"]); + $request->headers["Host"] = $newHost; + } + } else { + // Preserve Host + if (!$oldHost && $newHost) { + $request->headers["Host"] = $newHost; + } + } + $request->uri = $uri; return $request; } diff --git a/test/tests/unit/Message/RequestTest.php b/test/tests/unit/Message/RequestTest.php index 32ed747..4630dda 100644 --- a/test/tests/unit/Message/RequestTest.php +++ b/test/tests/unit/Message/RequestTest.php @@ -12,90 +12,8 @@ use WellRESTed\Message\Request; */ class RequestTest extends \PHPUnit_Framework_TestCase { - /** - * @covers WellRESTed\Message\Request::getHeaders - */ - public function testGetHeadersReturnsHostFromUri() - { - $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); - $uri->getHost()->willReturn("localhost"); - - $request = new Request(); - $request = $request->withUri($uri->reveal()); - - $headers = $request->getHeaders(); - $this->assertEquals(["localhost"], $headers["Host"]); - } - - /** - * @covers WellRESTed\Message\Request::getHeaders - */ - public function testGetHeadersPrefersExplicitHostHeader() - { - $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); - $uri->getHost()->willReturn("localhost"); - - $request = new Request(); - $request = $request->withUri($uri->reveal()); - $request = $request->withHeader("Host", "www.mysite.com"); - - $headers = $request->getHeaders(); - $this->assertEquals(["www.mysite.com"], $headers["Host"]); - } - - /** - * @covers WellRESTed\Message\Request::getHeader - */ - public function testGetHeaderReturnsHostFromUri() - { - $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); - $uri->getHost()->willReturn("localhost"); - - $request = new Request(); - $request = $request->withUri($uri->reveal()); - $this->assertEquals(["localhost"], $request->getHeader("host")); - } - - /** - * @covers WellRESTed\Message\Request::getHeader - */ - public function testGetHeaderPrefersExplicitHostHeader() - { - $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); - $uri->getHost()->willReturn("localhot"); - - $request = new Request(); - $request = $request->withUri($uri->reveal()); - $request = $request->withHeader("Host", "www.mysite.com"); - $this->assertEquals(["www.mysite.com"], $request->getHeader("host")); - } - - /** - * @covers WellRESTed\Message\Request::getHeaderLine - */ - public function testGetHeaderLineReturnsHostFromUri() - { - $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); - $uri->getHost()->willReturn("localhost"); - - $request = new Request(); - $request = $request->withUri($uri->reveal()); - $this->assertEquals("localhost", $request->getHeaderLine("host")); - } - - /** - * @covers WellRESTed\Message\Request::getHeaderLine - */ - public function testGetHeaderLinePrefersExplicitHostHeader() - { - $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); - $uri->getHost()->willReturn("localhost"); - - $request = new Request(); - $request = $request->withUri($uri->reveal()); - $request = $request->withHeader("Host", "www.mysite.com"); - $this->assertEquals("www.mysite.com", $request->getHeaderLine("host")); - } + // ------------------------------------------------------------------------ + // Request Target /** * @covers WellRESTed\Message\Request::getRequestTarget @@ -113,6 +31,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase public function testGetRequestTargetUsesOriginFormOfUri() { $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); + $uri->getHost()->willReturn(""); $uri->getPath()->willReturn("/my/path"); $uri->getQuery()->willReturn("cat=Molly&dog=Bear"); @@ -130,6 +49,20 @@ class RequestTest extends \PHPUnit_Framework_TestCase $this->assertEquals("/", $request->getRequestTarget()); } + /** + * @covers WellRESTed\Message\Request::withRequestTarget + * @covers WellRESTed\Message\Request::getRequestTarget + */ + public function testWithRequestTargetCreatesNewInstance() + { + $request = new Request(); + $request = $request->withRequestTarget("*"); + $this->assertEquals("*", $request->getRequestTarget()); + } + + // ------------------------------------------------------------------------ + // Method + /** * @covers WellRESTed\Message\Request::getMethod */ @@ -150,16 +83,8 @@ class RequestTest extends \PHPUnit_Framework_TestCase $this->assertEquals("POST", $request->getMethod()); } - /** - * @covers WellRESTed\Message\Request::withRequestTarget - * @covers WellRESTed\Message\Request::getRequestTarget - */ - public function testWithRequestTargetCreatesNewInstance() - { - $request = new Request(); - $request = $request->withRequestTarget("*"); - $this->assertEquals("*", $request->getRequestTarget()); - } + // ------------------------------------------------------------------------ + // Request URI /** * @covers WellRESTed\Message\Request::withUri @@ -199,4 +124,76 @@ class RequestTest extends \PHPUnit_Framework_TestCase $this->assertEquals($uri2, $request2->getUri()); $this->assertEquals(["text/plain"], $request2->getHeader("Accept")); } + + /** + * @covers WellRESTed\Message\Request::withUri + */ + public function testWithUriUpdatesHostHeader() + { + $hostname = "bar.com"; + $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); + $uri->getHost()->willReturn($hostname); + + $request = new Request(); + $request = $request->withHeader("Host", "foo.com"); + $request = $request->withUri($uri->reveal()); + $this->assertSame([$hostname], $request->getHeader("Host")); + } + + /** + * @covers WellRESTed\Message\Request::withUri + */ + public function testWithUriDoesNotUpdatesHostHeaderWhenUriHasNoHost() + { + $hostname = "foo.com"; + $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); + $uri->getHost()->willReturn(""); + + $request = new Request(); + $request = $request->withHeader("Host", $hostname); + $request = $request->withUri($uri->reveal()); + $this->assertSame([$hostname], $request->getHeader("Host")); + } + + /** + * @covers WellRESTed\Message\Request::withUri + */ + public function testPreserveHostUpdatesHostHeaderWhenHeaderIsOriginallyMissing() + { + $hostname = "foo.com"; + $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); + $uri->getHost()->willReturn($hostname); + + $request = new Request(); + $request = $request->withUri($uri->reveal(), true); + $this->assertSame([$hostname], $request->getHeader("Host")); + } + + /** + * @covers WellRESTed\Message\Request::withUri + */ + public function testPreserveHostDoesNotUpdatesWhenBothAreMissingHosts() + { + $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); + $uri->getHost()->willReturn(""); + + $request = new Request(); + $request = $request->withUri($uri->reveal(), true); + $this->assertSame([], $request->getHeader("Host")); + } + + /** + * @covers WellRESTed\Message\Request::withUri + */ + public function testPreserveHostDoesNotUpdateHostHeader() + { + $hostname = "foo.com"; + $uri = $this->prophesize('\Psr\Http\Message\UriInterface'); + $uri->getHost()->willReturn("bar.com"); + + $request = new Request(); + $request = $request->withHeader("Host", $hostname); + $request = $request->withUri($uri->reveal(), true); + $this->assertSame([$hostname], $request->getHeader("Host")); + } }