-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServerRequest.php
More file actions
353 lines (319 loc) · 10.2 KB
/
ServerRequest.php
File metadata and controls
353 lines (319 loc) · 10.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
<?php
/*
* This file is part of Berlioz framework.
*
* @license https://opensource.org/licenses/MIT MIT License
* @copyright 2021 Ronan GIRON
* @author Ronan GIRON <https://github.com/ElGigi>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code, to the root.
*/
declare(strict_types=1);
namespace Berlioz\Http\Message;
use InvalidArgumentException;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UriInterface;
/**
* Class ServerRequest.
*/
class ServerRequest extends Request implements ServerRequestInterface
{
private ?array $queryParams = null;
public function __construct(
string $method,
UriInterface|string $uri,
array $headers = [],
protected array $cookies = [],
protected array $serverParams = [],
mixed $body = null,
protected array $uploadedFiles = [],
protected array $attributes = []
) {
parent::__construct($method, $uri, $body, $headers);
}
/**
* Retrieve server parameters.
*
* Retrieves data related to the incoming request environment,
* typically derived from PHP's $_SERVER superglobal. The data IS NOT
* REQUIRED to originate from $_SERVER.
*
* @return array
*/
public function getServerParams(): array
{
return $this->serverParams;
}
/**
* Retrieve server parameter.
*
* @param string $name Param name
* @param mixed $default Default value to return if the param does not exist.
*
* @return mixed
*/
public function getServerParam(string $name, mixed $default = null): mixed
{
$serverParams = $this->getServerParams();
return $serverParams[$name] ?? $default;
}
/**
* Retrieve cookies.
*
* Retrieves cookies sent by the client to the server.
*
* The data MUST be compatible with the structure of the $_COOKIE superglobal.
*
* @return array
*/
public function getCookieParams(): array
{
return $this->cookies;
}
/**
* Return an instance with the specified cookies.
*
* The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
* be compatible with the structure of $_COOKIE. Typically, this data will
* be injected at instantiation.
*
* This method MUST NOT update the related Cookie header of the request
* instance, nor related values in the server params.
*
* 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
* updated cookie values.
*
* @param array $cookies Array of key/value pairs representing cookies.
*
* @return static
*/
public function withCookieParams(array $cookies): static
{
$clone = clone $this;
$clone->cookies = $cookies;
return $clone;
}
/**
* Retrieve query string arguments.
*
* Retrieves the deserialized query string arguments, if any.
*
* Note: the query params might not be in sync with the URI or server
* params. If you need to ensure you are only getting the original
* values, you may need to parse the query string from `getUri()->getQuery()`
* or from the `QUERY_STRING` server param.
*
* @return array
*/
public function getQueryParams(): array
{
if (null !== $this->queryParams) {
return $this->queryParams;
}
if (null !== $this->getUri()) {
parse_str($this->getUri()->getQuery(), $this->queryParams);
return $this->queryParams;
}
return [];
}
/**
* Retrieve query string argument.
*
* @param string $name Query param name
* @param mixed|null $default Default value to return if the param does not exist.
*
* @return mixed
*/
public function getQueryParam(string $name, mixed $default = null): mixed
{
$queryParams = $this->getQueryParams();
return $queryParams[$name] ?? $default;
}
/**
* Return an instance with the specified query string arguments.
*
* These values SHOULD remain immutable over the course of the incoming
* request. They MAY be injected during instantiation, such as from PHP's
* $_GET superglobal, or MAY be derived from some other value such as the
* URI. In cases where the arguments are parsed from the URI, the data
* MUST be compatible with what PHP's parse_str() would return for
* purposes of how duplicate query parameters are handled, and how nested
* sets are handled.
*
* Setting query string arguments MUST NOT change the URI stored by the
* request, nor the values in the server params.
*
* 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
* updated query string arguments.
*
* @param array $query Array of query string arguments, typically from
* $_GET.
*
* @return static
*/
public function withQueryParams(array $query): static
{
$clone = clone $this;
$clone->queryParams = $query;
return $clone;
}
/**
* Retrieve normalized file upload data.
*
* This method returns upload metadata in a normalized tree, with each leaf
* an instance of Psr\Http\Message\UploadedFileInterface.
*
* These values MAY be prepared from $_FILES or the message body during
* instantiation, or MAY be injected via withUploadedFiles().
*
* @return array An array tree of UploadedFileInterface instances; an empty
* array MUST be returned if no data is present.
*/
public function getUploadedFiles(): array
{
return $this->uploadedFiles ?? [];
}
/**
* Create a new instance with the specified uploaded files.
*
* 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
* updated body parameters.
*
* @param array $uploadedFiles An array tree of UploadedFileInterface instances.
*
* @return static
* @throws InvalidArgumentException if an invalid structure is provided.
*/
public function withUploadedFiles(array $uploadedFiles): static
{
$clone = clone $this;
$clone->uploadedFiles = $uploadedFiles;
return $clone;
}
/**
* Retrieve attributes derived from the request.
*
* The request "attributes" may be used to allow injection of any
* parameters derived from the request: e.g., the results of path
* match operations; the results of decrypting cookies; the results of
* deserializing non-form-encoded message bodies; etc. Attributes
* will be application and request specific, and CAN be mutable.
*
* @return array Attributes derived from the request.
*/
public function getAttributes(): array
{
return $this->attributes ?? [];
}
/**
* Return an instance with the specified derived request attributes.
*
* 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
* updated attributes.
*
* @param array $attributes Attributes.
*
* @return static
* @see getAttributes()
*
*/
public function withAttributes(array $attributes): static
{
$clone = clone $this;
$clone->attributes = $attributes;
return $clone;
}
/**
* Retrieve a single derived request attribute.
*
* Retrieves a single derived request attribute as described in
* getAttributes(). If the attribute has not been previously set, returns
* the default value as provided.
*
* This method obviates the need for a hasAttribute() method, as it allows
* specifying a default value to return if the attribute is not found.
*
* @param string $name The attribute name.
* @param mixed $default Default value to return if the attribute does not exist.
*
* @return mixed
* @see getAttributes()
*
*/
public function getAttribute(string $name, mixed $default = null): mixed
{
return $this->attributes[$name] ?? $default ?? null;
}
/**
* Return an instance with the specified derived request attribute.
*
* This method allows setting a single derived request attribute as
* described in getAttributes().
*
* 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
* updated attribute.
*
* @param string $name The attribute name.
* @param mixed $value The value of the attribute.
*
* @return static
* @see getAttributes()
*
*/
public function withAttribute($name, $value): static
{
$clone = clone $this;
$clone->attributes[$name] = $value;
return $clone;
}
/**
* Return an instance that removes the specified derived request attribute.
*
* This method allows removing a single derived request attribute as
* described in getAttributes().
*
* This method MUST be implemented in such a way as to retain the
* immutability of the message, and MUST return an instance that removes
* the attribute.
*
* @param string $name The attribute name.
*
* @return static
* @see getAttributes()
*
*/
public function withoutAttribute($name): static
{
$clone = clone $this;
unset($clone->attributes[$name]);
return $clone;
}
/**
* Is AJAX request ?
*
* @return bool
*/
public function isAjaxRequest(): bool
{
if ($this->hasHeader('AjaxRequest')) {
return true;
}
if ($this->getServerParam('HTTP_X_REQUESTED_WITH', '') == 'XMLHttpRequest') {
return true;
}
return false;
}
/**
* @inheritDoc
*/
public function withParsedBody($data): ServerRequestInterface
{
return parent::withParsedBody($data);
}
}