Request::getUri always returns a URI

This commit is contained in:
PJ Dietz 2015-04-26 19:41:23 -04:00
parent 212bb6871e
commit 534bd43d9b
3 changed files with 86 additions and 13 deletions

View File

@ -14,6 +14,20 @@ class Request extends Message implements RequestInterface
/** @var UriInterface */ /** @var UriInterface */
protected $uri; 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 // Psr\Http\Message\RequestInterface
@ -35,17 +49,20 @@ class Request extends Message implements RequestInterface
*/ */
public function getRequestTarget() public function getRequestTarget()
{ {
// Use the explicitly set request target first.
if (isset($this->requestTarget)) { if (isset($this->requestTarget)) {
return $this->requestTarget; return $this->requestTarget;
} elseif (isset($this->uri)) { }
// Build the origin form from the composed URI.
$target = $this->uri->getPath(); $target = $this->uri->getPath();
$query = $this->uri->getQuery(); $query = $this->uri->getQuery();
if ($query) { if ($query) {
$target .= "?" . $query; $target .= "?" . $query;
} }
return $target;
} // Return "/" if the origin form is empty.
return "/"; return $target ?: "/";
} }
/** /**
@ -100,7 +117,7 @@ class Request extends Message implements RequestInterface
public function withMethod($method) public function withMethod($method)
{ {
$request = clone $this; $request = clone $this;
$request->method = $method; $request->method = $this->getValidatedMethod($method);
return $request; 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)) { if (!is_string($method)) {
$this->uri = clone $this->uri; 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;
} }
} }

View File

@ -3,15 +3,28 @@
namespace WellRESTed\Test\Unit\Message; namespace WellRESTed\Test\Unit\Message;
use WellRESTed\Message\Request; use WellRESTed\Message\Request;
use WellRESTed\Message\Uri;
/** /**
* @uses WellRESTed\Message\Request * @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Request * @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message * @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection * @uses WellRESTed\Message\HeaderCollection
* @uses WellRESTed\Message\Uri
*/ */
class RequestTest extends \PHPUnit_Framework_TestCase class RequestTest extends \PHPUnit_Framework_TestCase
{ {
// ------------------------------------------------------------------------
/**
* @covers WellRESTed\Message\Request::__construct
*/
public function testCreatesInstance()
{
$request = new Request();
$this->assertNotNull($request);
}
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Request Target // Request Target
@ -74,6 +87,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase
/** /**
* @covers WellRESTed\Message\Request::withMethod * @covers WellRESTed\Message\Request::withMethod
* @covers WellRESTed\Message\Request::getValidatedMethod
* @covers WellRESTed\Message\Request::getMethod * @covers WellRESTed\Message\Request::getMethod
*/ */
public function testWithMethodCreatesNewInstance() public function testWithMethodCreatesNewInstance()
@ -83,9 +97,41 @@ class RequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals("POST", $request->getMethod()); $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 // 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::withUri
* @covers WellRESTed\Message\Request::getUri * @covers WellRESTed\Message\Request::getUri

View File

@ -12,6 +12,7 @@ use WellRESTed\Message\UploadedFile;
* @uses WellRESTed\Message\HeaderCollection * @uses WellRESTed\Message\HeaderCollection
* @uses WellRESTed\Message\Stream * @uses WellRESTed\Message\Stream
* @uses WellRESTed\Message\UploadedFile * @uses WellRESTed\Message\UploadedFile
* @uses WellRESTed\Message\Uri
*/ */
class ServerRequestTest extends \PHPUnit_Framework_TestCase class ServerRequestTest extends \PHPUnit_Framework_TestCase
{ {