Chris@0
|
1 <?php
|
Chris@0
|
2 namespace GuzzleHttp\Psr7;
|
Chris@0
|
3
|
Chris@0
|
4 use InvalidArgumentException;
|
Chris@0
|
5 use Psr\Http\Message\RequestInterface;
|
Chris@0
|
6 use Psr\Http\Message\StreamInterface;
|
Chris@0
|
7 use Psr\Http\Message\UriInterface;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * PSR-7 request implementation.
|
Chris@0
|
11 */
|
Chris@0
|
12 class Request implements RequestInterface
|
Chris@0
|
13 {
|
Chris@0
|
14 use MessageTrait;
|
Chris@0
|
15
|
Chris@0
|
16 /** @var string */
|
Chris@0
|
17 private $method;
|
Chris@0
|
18
|
Chris@0
|
19 /** @var null|string */
|
Chris@0
|
20 private $requestTarget;
|
Chris@0
|
21
|
Chris@0
|
22 /** @var UriInterface */
|
Chris@0
|
23 private $uri;
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * @param string $method HTTP method
|
Chris@0
|
27 * @param string|UriInterface $uri URI
|
Chris@0
|
28 * @param array $headers Request headers
|
Chris@0
|
29 * @param string|null|resource|StreamInterface $body Request body
|
Chris@0
|
30 * @param string $version Protocol version
|
Chris@0
|
31 */
|
Chris@0
|
32 public function __construct(
|
Chris@0
|
33 $method,
|
Chris@0
|
34 $uri,
|
Chris@0
|
35 array $headers = [],
|
Chris@0
|
36 $body = null,
|
Chris@0
|
37 $version = '1.1'
|
Chris@0
|
38 ) {
|
Chris@0
|
39 if (!($uri instanceof UriInterface)) {
|
Chris@0
|
40 $uri = new Uri($uri);
|
Chris@0
|
41 }
|
Chris@0
|
42
|
Chris@0
|
43 $this->method = strtoupper($method);
|
Chris@0
|
44 $this->uri = $uri;
|
Chris@0
|
45 $this->setHeaders($headers);
|
Chris@0
|
46 $this->protocol = $version;
|
Chris@0
|
47
|
Chris@17
|
48 if (!isset($this->headerNames['host'])) {
|
Chris@0
|
49 $this->updateHostFromUri();
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 if ($body !== '' && $body !== null) {
|
Chris@0
|
53 $this->stream = stream_for($body);
|
Chris@0
|
54 }
|
Chris@0
|
55 }
|
Chris@0
|
56
|
Chris@0
|
57 public function getRequestTarget()
|
Chris@0
|
58 {
|
Chris@0
|
59 if ($this->requestTarget !== null) {
|
Chris@0
|
60 return $this->requestTarget;
|
Chris@0
|
61 }
|
Chris@0
|
62
|
Chris@0
|
63 $target = $this->uri->getPath();
|
Chris@0
|
64 if ($target == '') {
|
Chris@0
|
65 $target = '/';
|
Chris@0
|
66 }
|
Chris@0
|
67 if ($this->uri->getQuery() != '') {
|
Chris@0
|
68 $target .= '?' . $this->uri->getQuery();
|
Chris@0
|
69 }
|
Chris@0
|
70
|
Chris@0
|
71 return $target;
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 public function withRequestTarget($requestTarget)
|
Chris@0
|
75 {
|
Chris@0
|
76 if (preg_match('#\s#', $requestTarget)) {
|
Chris@0
|
77 throw new InvalidArgumentException(
|
Chris@0
|
78 'Invalid request target provided; cannot contain whitespace'
|
Chris@0
|
79 );
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 $new = clone $this;
|
Chris@0
|
83 $new->requestTarget = $requestTarget;
|
Chris@0
|
84 return $new;
|
Chris@0
|
85 }
|
Chris@0
|
86
|
Chris@0
|
87 public function getMethod()
|
Chris@0
|
88 {
|
Chris@0
|
89 return $this->method;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 public function withMethod($method)
|
Chris@0
|
93 {
|
Chris@0
|
94 $new = clone $this;
|
Chris@0
|
95 $new->method = strtoupper($method);
|
Chris@0
|
96 return $new;
|
Chris@0
|
97 }
|
Chris@0
|
98
|
Chris@0
|
99 public function getUri()
|
Chris@0
|
100 {
|
Chris@0
|
101 return $this->uri;
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 public function withUri(UriInterface $uri, $preserveHost = false)
|
Chris@0
|
105 {
|
Chris@0
|
106 if ($uri === $this->uri) {
|
Chris@0
|
107 return $this;
|
Chris@0
|
108 }
|
Chris@0
|
109
|
Chris@0
|
110 $new = clone $this;
|
Chris@0
|
111 $new->uri = $uri;
|
Chris@0
|
112
|
Chris@17
|
113 if (!$preserveHost || !isset($this->headerNames['host'])) {
|
Chris@0
|
114 $new->updateHostFromUri();
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 return $new;
|
Chris@0
|
118 }
|
Chris@0
|
119
|
Chris@0
|
120 private function updateHostFromUri()
|
Chris@0
|
121 {
|
Chris@0
|
122 $host = $this->uri->getHost();
|
Chris@0
|
123
|
Chris@0
|
124 if ($host == '') {
|
Chris@0
|
125 return;
|
Chris@0
|
126 }
|
Chris@0
|
127
|
Chris@0
|
128 if (($port = $this->uri->getPort()) !== null) {
|
Chris@0
|
129 $host .= ':' . $port;
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 if (isset($this->headerNames['host'])) {
|
Chris@0
|
133 $header = $this->headerNames['host'];
|
Chris@0
|
134 } else {
|
Chris@0
|
135 $header = 'Host';
|
Chris@0
|
136 $this->headerNames['host'] = 'Host';
|
Chris@0
|
137 }
|
Chris@0
|
138 // Ensure Host is the first header.
|
Chris@0
|
139 // See: http://tools.ietf.org/html/rfc7230#section-5.4
|
Chris@0
|
140 $this->headers = [$header => [$host]] + $this->headers;
|
Chris@0
|
141 }
|
Chris@0
|
142 }
|