Update Request to implement changes to PSR-7 PR #523

This commit is contained in:
PJ Dietz 2015-04-26 16:05:46 -04:00
parent 43c050ec2e
commit f706d47c6d
2 changed files with 108 additions and 174 deletions

View File

@ -17,86 +17,6 @@ class Request extends Message implements RequestInterface
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Psr\Http\Message\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. * Retrieves the message's request target.
* *
@ -226,6 +146,23 @@ class Request extends Message implements RequestInterface
public function withUri(UriInterface $uri, $preserveHost = false) public function withUri(UriInterface $uri, $preserveHost = false)
{ {
$request = clone $this; $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; $request->uri = $uri;
return $request; return $request;
} }

View File

@ -12,90 +12,8 @@ use WellRESTed\Message\Request;
*/ */
class RequestTest extends \PHPUnit_Framework_TestCase class RequestTest extends \PHPUnit_Framework_TestCase
{ {
/** // ------------------------------------------------------------------------
* @covers WellRESTed\Message\Request::getHeaders // Request Target
*/
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"));
}
/** /**
* @covers WellRESTed\Message\Request::getRequestTarget * @covers WellRESTed\Message\Request::getRequestTarget
@ -113,6 +31,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase
public function testGetRequestTargetUsesOriginFormOfUri() public function testGetRequestTargetUsesOriginFormOfUri()
{ {
$uri = $this->prophesize('\Psr\Http\Message\UriInterface'); $uri = $this->prophesize('\Psr\Http\Message\UriInterface');
$uri->getHost()->willReturn("");
$uri->getPath()->willReturn("/my/path"); $uri->getPath()->willReturn("/my/path");
$uri->getQuery()->willReturn("cat=Molly&dog=Bear"); $uri->getQuery()->willReturn("cat=Molly&dog=Bear");
@ -130,6 +49,20 @@ class RequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals("/", $request->getRequestTarget()); $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 * @covers WellRESTed\Message\Request::getMethod
*/ */
@ -150,16 +83,8 @@ class RequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals("POST", $request->getMethod()); $this->assertEquals("POST", $request->getMethod());
} }
/** // ------------------------------------------------------------------------
* @covers WellRESTed\Message\Request::withRequestTarget // Request URI
* @covers WellRESTed\Message\Request::getRequestTarget
*/
public function testWithRequestTargetCreatesNewInstance()
{
$request = new Request();
$request = $request->withRequestTarget("*");
$this->assertEquals("*", $request->getRequestTarget());
}
/** /**
* @covers WellRESTed\Message\Request::withUri * @covers WellRESTed\Message\Request::withUri
@ -199,4 +124,76 @@ class RequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($uri2, $request2->getUri()); $this->assertEquals($uri2, $request2->getUri());
$this->assertEquals(["text/plain"], $request2->getHeader("Accept")); $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"));
}
} }