Passed
Push — master ( a2929b...1a0f41 )
by Gabor
02:32
created

ServerRequest::withParsedBody()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 6
ccs 4
cts 4
cp 1
crap 1
rs 10
c 0
b 0
f 0
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':
0 ignored issues
show
Coding Style introduced by
case statements should be defined using a colon.

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.

switch ($expr) {
    case "A": { //wrong
        doSomething();
        break;
    }
    case "B"; //wrong
        doSomething();
        break;
    case "C": //right
        doSomething();
        break;
}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
89
            case 'application/x-json':
0 ignored issues
show
Coding Style introduced by
case statements should be defined using a colon.

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.

switch ($expr) {
    case "A": { //wrong
        doSomething();
        break;
    }
    case "B"; //wrong
        doSomething();
        break;
    case "C": //right
        doSomething();
        break;
}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
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