2 namespace GuzzleHttp\Psr7;
4 use InvalidArgumentException;
5 use Psr\Http\Message\RequestInterface;
6 use Psr\Http\Message\StreamInterface;
7 use Psr\Http\Message\UriInterface;
10 * PSR-7 request implementation.
12 class Request implements RequestInterface
19 /** @var null|string */
20 private $requestTarget;
22 /** @var UriInterface */
26 * @param string $method HTTP method
27 * @param string|UriInterface $uri URI
28 * @param array $headers Request headers
29 * @param string|null|resource|StreamInterface $body Request body
30 * @param string $version Protocol version
32 public function __construct(
39 if (!($uri instanceof UriInterface)) {
43 $this->method = strtoupper($method);
45 $this->setHeaders($headers);
46 $this->protocol = $version;
48 if (!$this->hasHeader('Host')) {
49 $this->updateHostFromUri();
52 if ($body !== '' && $body !== null) {
53 $this->stream = stream_for($body);
57 public function getRequestTarget()
59 if ($this->requestTarget !== null) {
60 return $this->requestTarget;
63 $target = $this->uri->getPath();
67 if ($this->uri->getQuery() != '') {
68 $target .= '?' . $this->uri->getQuery();
74 public function withRequestTarget($requestTarget)
76 if (preg_match('#\s#', $requestTarget)) {
77 throw new InvalidArgumentException(
78 'Invalid request target provided; cannot contain whitespace'
83 $new->requestTarget = $requestTarget;
87 public function getMethod()
92 public function withMethod($method)
95 $new->method = strtoupper($method);
99 public function getUri()
104 public function withUri(UriInterface $uri, $preserveHost = false)
106 if ($uri === $this->uri) {
113 if (!$preserveHost) {
114 $new->updateHostFromUri();
120 private function updateHostFromUri()
122 $host = $this->uri->getHost();
128 if (($port = $this->uri->getPort()) !== null) {
129 $host .= ':' . $port;
132 if (isset($this->headerNames['host'])) {
133 $header = $this->headerNames['host'];
136 $this->headerNames['host'] = 'Host';
138 // Ensure Host is the first header.
139 // See: http://tools.ietf.org/html/rfc7230#section-5.4
140 $this->headers = [$header => [$host]] + $this->headers;