summaryrefslogtreecommitdiff
path: root/src/Http
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2018-08-16 18:13:53 +0200
committerIgor Scheller <igor.scheller@igorshp.de>2018-08-19 14:04:16 +0200
commit5427ee385dc2ff117a1130eb606f78e708949c8f (patch)
treefdea2a1ffcf8b85bf32725f5479c8a781f059387 /src/Http
parent18fd73a899602a473044013854a354254062ebd4 (diff)
Made Engelsystem\Http\Request PSR-7 RequestInterface compatible
Diffstat (limited to 'src/Http')
-rw-r--r--src/Http/MessageTrait.php21
-rw-r--r--src/Http/Request.php131
2 files changed, 147 insertions, 5 deletions
diff --git a/src/Http/MessageTrait.php b/src/Http/MessageTrait.php
index fa3a1459..e46d291e 100644
--- a/src/Http/MessageTrait.php
+++ b/src/Http/MessageTrait.php
@@ -4,7 +4,6 @@ namespace Engelsystem\Http;
use Psr\Http\Message\StreamInterface;
-use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Zend\Diactoros\Stream;
/**
@@ -41,7 +40,12 @@ trait MessageTrait
public function withProtocolVersion($version)
{
$new = clone $this;
- $new->setProtocolVersion($version);
+ if (method_exists($new, 'setProtocolVersion')) {
+ $new->setProtocolVersion($version);
+ } else {
+ $new->server->set('SERVER_PROTOCOL', $version);
+ }
+
return $new;
}
@@ -72,7 +76,11 @@ trait MessageTrait
*/
public function getHeaders()
{
- return $this->headers->allPreserveCase();
+ if (method_exists($this->headers, 'allPreserveCase')) {
+ return $this->headers->allPreserveCase();
+ }
+
+ return $this->headers->all();
}
/**
@@ -228,7 +236,12 @@ trait MessageTrait
public function withBody(StreamInterface $body)
{
$new = clone $this;
- $new->setContent($body);
+
+ if (method_exists($new, 'setContent')) {
+ $new->setContent($body);
+ } else {
+ $new->content = $body;
+ }
return $new;
}
diff --git a/src/Http/Request.php b/src/Http/Request.php
index c6a9e5ad..fd3bff42 100644
--- a/src/Http/Request.php
+++ b/src/Http/Request.php
@@ -2,10 +2,15 @@
namespace Engelsystem\Http;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\UriInterface;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
+use Zend\Diactoros\Uri;
-class Request extends SymfonyRequest
+class Request extends SymfonyRequest implements RequestInterface
{
+ use MessageTrait;
+
/**
* Get POST input
*
@@ -64,4 +69,128 @@ class Request extends SymfonyRequest
{
return rtrim(preg_replace('/\?.*/', '', $this->getUri()), '/');
}
+
+ /**
+ * Retrieves the message's request target.
+ *
+ *
+ * Retrieves the message's request-target either as it will appear (for
+ * clients), as it appeared at request (for servers), or as it was
+ * specified for the instance (see withRequestTarget()).
+ *
+ * In most cases, this will be the origin-form of the composed URI,
+ * unless a value was provided to the concrete implementation (see
+ * withRequestTarget() below).
+ *
+ * If no URI is available, and no request-target has been specifically
+ * provided, this method MUST return the string "/".
+ *
+ * @return string
+ */
+ public function getRequestTarget()
+ {
+ $query = $this->getQueryString();
+ return '/' . $this->path() . (!empty($query) ? '?' . $query : '');
+ }
+
+ /**
+ * Return an instance with the specific request-target.
+ *
+ * If the request needs a non-origin-form request-target — e.g., for
+ * specifying an absolute-form, authority-form, or asterisk-form —
+ * this method may be used to create an instance with the specified
+ * request-target, verbatim.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * changed request target.
+ *
+ * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various
+ * request-target forms allowed in request messages)
+ * @param mixed $requestTarget
+ * @return static
+ */
+ public function withRequestTarget($requestTarget)
+ {
+ return $this->create($requestTarget);
+ }
+
+ /**
+ * Return an instance with the provided HTTP method.
+ *
+ * While HTTP method names are typically all uppercase characters, HTTP
+ * method names are case-sensitive and thus implementations SHOULD NOT
+ * modify the given string.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * changed request method.
+ *
+ * @param string $method Case-sensitive method.
+ * @return static
+ * @throws \InvalidArgumentException for invalid HTTP methods.
+ */
+ public function withMethod($method)
+ {
+ $new = clone $this;
+ $new->setMethod($method);
+
+ return $new;
+ }
+
+ /**
+ * Returns an instance with the provided URI.
+ *
+ * This method MUST update the Host header of the returned request by
+ * default if the URI contains a host component. If the URI does not
+ * contain a host component, any pre-existing Host header MUST be carried
+ * over to the returned request.
+ *
+ * You can opt-in to preserving the original state of the Host header by
+ * setting `$preserveHost` to `true`. When `$preserveHost` is set to
+ * `true`, this method interacts with the Host header in the following ways:
+ *
+ * - If the Host header is missing or empty, and the new URI contains
+ * a host component, this method MUST update the Host header in the returned
+ * request.
+ * - If the Host header is missing or empty, and the new URI does not contain a
+ * host component, this method MUST NOT update the Host header in the returned
+ * request.
+ * - If a Host header is present and non-empty, this method MUST NOT update
+ * the Host header in the returned request.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new UriInterface instance.
+ *
+ * @link http://tools.ietf.org/html/rfc3986#section-4.3
+ * @param UriInterface $uri New request URI to use.
+ * @param bool $preserveHost Preserve the original state of the Host header.
+ * @return static
+ */
+ public function withUri(UriInterface $uri, $preserveHost = false)
+ {
+ $new = $this->create($uri);
+ if ($preserveHost) {
+ $new->headers->set('HOST', $this->getHost());
+ }
+
+ return $new;
+ }
+
+ /**
+ * Retrieves the URI instance.
+ *
+ * This method MUST return a UriInterface instance.
+ *
+ * @link http://tools.ietf.org/html/rfc3986#section-4.3
+ * @return string|UriInterface Returns a UriInterface instance
+ * representing the URI of the request.
+ */
+ public function getUri()
+ {
+ $uri = parent::getUri();
+
+ return new Uri($uri);
+ }
}