diff --git a/README.md b/README.md index ea4d927..9b29f1b 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,14 @@ $uri = new CodeJet\Uri('https://www.example.com'); echo $uri; ``` +### Request +Creating a request using the PSR7 RequestInterface methods. +``` php +$request = (new CodeJet\Http\Request())->withMethod('POST')->withUri($uri); +echo $uri; +``` + + ## Change log Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. diff --git a/phpunit.xml.dist b/phpunit.xml.dist index ab4f0bb..a170674 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -32,7 +32,7 @@ - + diff --git a/src/Factory/RequestFactory.php b/src/Factory/RequestFactory.php new file mode 100644 index 0000000..ddf9375 --- /dev/null +++ b/src/Factory/RequestFactory.php @@ -0,0 +1,25 @@ +withMethod($method) + ->withUri($uri); + } +} diff --git a/src/Request.php b/src/Request.php new file mode 100644 index 0000000..9514332 --- /dev/null +++ b/src/Request.php @@ -0,0 +1,110 @@ +requestTarget) { + return $this->requestTarget; + } + + $requestTarget = self::DEFAULT_REQUEST_TARGET; + + if ($this->uri) { + $requestTarget = $this->uri->getPath(); + + if (!empty($this->uri->getQuery())) { + $requestTarget .= '?' . $this->uri->getQuery(); + } + } + + return $requestTarget; + } + + /** + * @inheritdoc + */ + public function getMethod() + { + return $this->method; + } + + /** + * @inheritdoc + */ + public function withRequestTarget($requestTarget) + { + $clone = clone $this; + $clone->requestTarget = $requestTarget; + + return $clone; + } + + /** + * @inheritdoc + */ + public function withMethod($method) + { + $clone = clone $this; + $clone->method = $method; + + return $clone; + } + + /** + * @inheritdoc + */ + public function getUri() + { + return $this->uri; + } + + /** + * @inheritdoc + */ + public function withUri(UriInterface $uri, $preserveHost = false) + { + $clone = clone $this; + $clone->uri = $uri; + + if (!empty($uri->getHost()) && $preserveHost === false) { + return $clone->withHeader('host', $uri->getHost()); + } + + if (empty($clone->getHeader('host')) && !empty($uri->getHost()) && $preserveHost === true) { + $clone = $clone->withHeader('host', $uri->getHost()); + } + + return $clone; + } +} diff --git a/tests/RequestTest.php b/tests/RequestTest.php new file mode 100644 index 0000000..41d0f2d --- /dev/null +++ b/tests/RequestTest.php @@ -0,0 +1,83 @@ +withMethod('POST'); + + $this->assertNotSame($request, $postRequest); + $this->assertSame('POST', $postRequest->getMethod()); + } + + // Request Target + + public function testRequestTargetReturnsDefault() + { + $request = new Request(); + $this->assertSame('/', $request->getRequestTarget()); + } + + public function testCanSetAndGetRequestTarget() + { + $request = new Request(); + $requestWithRequestTarget = $request->withRequestTarget('/path?query=skittles'); + $this->assertNotSame($request, $requestWithRequestTarget); + + $this->assertSame('/path?query=skittles', $requestWithRequestTarget->getRequestTarget()); + } + + public function testCanGetRequestTargetFromUri() + { + $uri = new Uri('http://test.example.com/path?query=skittles'); + $request = (new Request())->withUri($uri); + + $this->assertSame('/path?query=skittles', $request->getRequestTarget()); + } + + // Uri + + public function testCanSetAndGetUri() + { + $request = new Request(); + + $uri = new Uri(); + + $requestWithUri = $request->withUri($uri); + + $this->assertNotSame($request, $requestWithUri); + $this->assertSame($uri, $requestWithUri->getUri()); + } + + public function testSetUriAlsoSetsHostHeader() + { + $request = new Request(); + $uri = new Uri('http://test.example.com'); + $requestWithHostHeader = $request->withUri($uri); + + $this->assertSame('test.example.com', $requestWithHostHeader->getHeader('host')); + } + + public function testSetUriReplacesHostHeader() + { + $request = (new Request())->withHeader('host', 'overwritten.host.example.com'); + $uri = new Uri('http://updated.host.example.com'); + $requestWithUpdatedHostHeader = $request->withUri($uri); + + $this->assertSame('updated.host.example.com', $requestWithUpdatedHostHeader->getHeader('host')); + } + + public function testCanPreserveHostWhenSettingUriWithDifferentHost() + { + $request = (new Request())->withHeader('host', 'preserved.host.example.com'); + $uri = new Uri('http://unused.host.example.com'); + $requestWithPreservedHostHeader = $request->withUri($uri, true); + + $this->assertSame('preserved.host.example.com', $requestWithPreservedHostHeader->getHeader('host')); + } +}