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
|
// 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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue