1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* WebHemi. |
4
|
|
|
* |
5
|
|
|
* PHP version 7.1 |
6
|
|
|
* |
7
|
|
|
* @copyright 2012 - 2018 Gixx-web (http://www.gixx-web.com) |
8
|
|
|
* @license https://opensource.org/licenses/MIT The MIT License (MIT) |
9
|
|
|
* |
10
|
|
|
* @link http://www.gixx-web.com |
11
|
|
|
*/ |
12
|
|
|
declare(strict_types = 1); |
13
|
|
|
|
14
|
|
|
namespace WebHemi\Http\ServiceAdapter\GuzzleHttp; |
15
|
|
|
|
16
|
|
|
use GuzzleHttp\Psr7\ServerRequest as GuzzleServerRequest; |
17
|
|
|
use InvalidArgumentException; |
18
|
|
|
use WebHemi\Http\ServerRequestInterface; |
19
|
|
|
|
20
|
|
|
/** |
21
|
|
|
* Class ServerRequest. |
22
|
|
|
*/ |
23
|
|
|
class ServerRequest extends GuzzleServerRequest implements ServerRequestInterface |
24
|
|
|
{ |
25
|
|
|
/** |
26
|
|
|
* @var null|array|object |
27
|
|
|
*/ |
28
|
|
|
private $parsedBody; |
29
|
|
|
|
30
|
|
|
/** |
31
|
|
|
* Checks if it is an XML HTTP Request (Ajax) or not. |
32
|
|
|
* |
33
|
|
|
* @return bool |
34
|
|
|
*/ |
35
|
2 |
|
public function isXmlHttpRequest() : bool |
36
|
|
|
{ |
37
|
2 |
|
$serverParams = $this->getServerParams(); |
38
|
|
|
|
39
|
|
|
return ( |
40
|
2 |
|
isset($serverParams['HTTP_X_REQUESTED_WITH']) |
41
|
2 |
|
&& $serverParams['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' |
42
|
|
|
); |
43
|
|
|
} |
44
|
|
|
|
45
|
|
|
/** |
46
|
|
|
* The Guzzle does not handle the php://input for DELETE, PUT, PATCH etc Request methods. So we need to do it. |
47
|
|
|
* |
48
|
|
|
* @return array|null|object |
49
|
|
|
*/ |
50
|
2 |
|
public function getParsedBody() |
51
|
|
|
{ |
52
|
2 |
|
if (empty($this->parsedBody)) { |
53
|
2 |
|
$this->parsedBody = $this->parseInput(); |
54
|
|
|
} |
55
|
|
|
|
56
|
2 |
|
return $this->parsedBody; |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
/** |
60
|
|
|
* {@inheritdoc} |
61
|
|
|
*/ |
62
|
15 |
|
public function withParsedBody($data) |
63
|
|
|
{ |
64
|
15 |
|
$new = clone $this; |
65
|
15 |
|
$new->parsedBody = $data; |
66
|
|
|
|
67
|
15 |
|
return $new; |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
/** |
71
|
|
|
* Parse |
72
|
|
|
* |
73
|
|
|
* @return array|object|null |
74
|
|
|
*/ |
75
|
2 |
|
protected function parseInput() |
76
|
|
|
{ |
77
|
2 |
|
$parsedInput = null; |
78
|
2 |
|
$input = file_get_contents('php://input'); |
79
|
|
|
|
80
|
2 |
|
if (empty($input)) { |
81
|
2 |
|
return null; |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
$serverParams = $this->getServerParams(); |
85
|
|
|
$contentType = explode(';', ($serverParams['HTTP_CONTENT_TYPE'] ?? 'plain/text'))[0]; |
86
|
|
|
|
87
|
|
|
switch (strtolower($contentType)) { |
88
|
|
|
case 'application/json': |
|
|
|
|
89
|
|
|
case 'application/x-json': |
|
|
|
|
90
|
|
|
$parsedInput = json_decode($input, true); |
91
|
|
|
break; |
92
|
|
|
|
93
|
|
|
case 'application/x-www-form-urlencoded': |
94
|
|
|
parse_str($input, $parsedInput); |
95
|
|
|
break; |
96
|
|
|
|
97
|
|
|
case 'multipart/form-data': |
98
|
|
|
// TODO write own parser to support PUT and DELETE methods' multipart/form-data |
99
|
|
|
throw new InvalidArgumentException('Unsopported request content type.'); |
100
|
|
|
break; |
101
|
|
|
} |
102
|
|
|
|
103
|
|
|
return $parsedInput; |
104
|
|
|
} |
105
|
|
|
} |
106
|
|
|
|
As per the PSR-2 coding standard, case statements should not be wrapped in curly braces. There is no need for braces, since each case is terminated by the next
break
.There is also the option to use a semicolon instead of a colon, this is discouraged because many programmers do not even know it works and the colon is universal between programming languages.
To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.