Update Request to implement changes to PSR-7 PR #523
This commit is contained in:
parent
43c050ec2e
commit
f706d47c6d
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue