From 534bd43d9b586a006c914bbb0ce28d01b8b42dc2 Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Sun, 26 Apr 2015 19:41:23 -0400 Subject: [PATCH] Request::getUri always returns a URI --- src/Message/Request.php | 52 ++++++++++++++----- test/tests/unit/Message/RequestTest.php | 46 ++++++++++++++++ test/tests/unit/Message/ServerRequestTest.php | 1 + 3 files changed, 86 insertions(+), 13 deletions(-) diff --git a/src/Message/Request.php b/src/Message/Request.php index 20a3501..964ad7d 100644 --- a/src/Message/Request.php +++ b/src/Message/Request.php @@ -14,6 +14,20 @@ class Request extends Message implements RequestInterface /** @var UriInterface */ protected $uri; + // ------------------------------------------------------------------------ + + public function __construct() + { + parent::__construct(); + $this->uri = new Uri(); + } + + public function __clone() + { + $this->uri = clone $this->uri; + parent::__clone(); + } + // ------------------------------------------------------------------------ // Psr\Http\Message\RequestInterface @@ -35,17 +49,20 @@ class Request extends Message implements RequestInterface */ public function getRequestTarget() { + // Use the explicitly set request target first. if (isset($this->requestTarget)) { return $this->requestTarget; - } elseif (isset($this->uri)) { - $target = $this->uri->getPath(); - $query = $this->uri->getQuery(); - if ($query) { - $target .= "?" . $query; - } - return $target; } - return "/"; + + // Build the origin form from the composed URI. + $target = $this->uri->getPath(); + $query = $this->uri->getQuery(); + if ($query) { + $target .= "?" . $query; + } + + // Return "/" if the origin form is empty. + return $target ?: "/"; } /** @@ -100,7 +117,7 @@ class Request extends Message implements RequestInterface public function withMethod($method) { $request = clone $this; - $request->method = $method; + $request->method = $this->getValidatedMethod($method); return $request; } @@ -169,11 +186,20 @@ class Request extends Message implements RequestInterface // ------------------------------------------------------------------------ - public function __clone() + /** + * @param string $method + * @return string + * @throws \InvalidArgumentException + */ + private function getValidatedMethod($method) { - if (isset($this->uri)) { - $this->uri = clone $this->uri; + if (!is_string($method)) { + throw new \InvalidArgumentException("Method must be a string."); } - parent::__clone(); + $method = trim($method); + if (strpos($method, " ") !== false) { + throw new \InvalidArgumentException("Method cannot contain spaces."); + } + return $method; } } diff --git a/test/tests/unit/Message/RequestTest.php b/test/tests/unit/Message/RequestTest.php index 4630dda..526558d 100644 --- a/test/tests/unit/Message/RequestTest.php +++ b/test/tests/unit/Message/RequestTest.php @@ -3,15 +3,28 @@ namespace WellRESTed\Test\Unit\Message; use WellRESTed\Message\Request; +use WellRESTed\Message\Uri; /** * @uses WellRESTed\Message\Request * @uses WellRESTed\Message\Request * @uses WellRESTed\Message\Message * @uses WellRESTed\Message\HeaderCollection + * @uses WellRESTed\Message\Uri */ class RequestTest extends \PHPUnit_Framework_TestCase { + // ------------------------------------------------------------------------ + + /** + * @covers WellRESTed\Message\Request::__construct + */ + public function testCreatesInstance() + { + $request = new Request(); + $this->assertNotNull($request); + } + // ------------------------------------------------------------------------ // Request Target @@ -74,6 +87,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase /** * @covers WellRESTed\Message\Request::withMethod + * @covers WellRESTed\Message\Request::getValidatedMethod * @covers WellRESTed\Message\Request::getMethod */ public function testWithMethodCreatesNewInstance() @@ -83,9 +97,41 @@ class RequestTest extends \PHPUnit_Framework_TestCase $this->assertEquals("POST", $request->getMethod()); } + /** + * @covers WellRESTed\Message\Request::withMethod + * @covers WellRESTed\Message\Request::getValidatedMethod + * @dataProvider invalidMethodProvider + * @expectedException \InvalidArgumentException + */ + public function testWithMethoThrowsExceptionOnInvalidMethod($method) + { + $request = new Request(); + $request->withMethod($method); + } + + public function invalidMethodProvider() + { + return [ + [0], + [false], + ["WITH SPACE"] + ]; + } + // ------------------------------------------------------------------------ // Request URI + /** + * @covers WellRESTed\Message\Request::getUri + * @ + */ + public function testGetUriReturnsEmptyUriByDefault() + { + $request = new Request(); + $uri = new Uri(); + $this->assertEquals($uri, $request->getUri()); + } + /** * @covers WellRESTed\Message\Request::withUri * @covers WellRESTed\Message\Request::getUri diff --git a/test/tests/unit/Message/ServerRequestTest.php b/test/tests/unit/Message/ServerRequestTest.php index d69f971..514891d 100644 --- a/test/tests/unit/Message/ServerRequestTest.php +++ b/test/tests/unit/Message/ServerRequestTest.php @@ -12,6 +12,7 @@ use WellRESTed\Message\UploadedFile; * @uses WellRESTed\Message\HeaderCollection * @uses WellRESTed\Message\Stream * @uses WellRESTed\Message\UploadedFile + * @uses WellRESTed\Message\Uri */ class ServerRequestTest extends \PHPUnit_Framework_TestCase {