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

ServerRequest   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 81
Duplicated Lines 0 %

Test Coverage

Coverage 54.84%

Importance

Changes 0
Metric Value
eloc 30
dl 0
loc 81
ccs 17
cts 31
cp 0.5484
rs 10
c 0
b 0
f 0
wmc 11

4 Methods

Rating   Name   Duplication   Size   Complexity  
A isXmlHttpRequest() 0 7 2
A parseInput() 0 29 6
A getParsedBody() 0 7 2
A withParsedBody() 0 6 1
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