HttpClient::get()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 1
1
<?php
2
3
namespace Saxulum\HttpClient\Joomla;
4
5
use Joomla\Http\HttpFactory;
6
use Joomla\Http\Http;
7
use Joomla\Http\Response as JoomlaResponse;
8
use Saxulum\HttpClient\HttpClientInterface;
9
use Saxulum\HttpClient\Request;
10
use Saxulum\HttpClient\Response;
11
12
class HttpClient implements HttpClientInterface
13
{
14
    /**
15
     * @var Http
16
     */
17
    protected $http;
18
19
    /**
20
     * @param Http $http
21
     */
22
    public function __construct(Http $http = null)
23
    {
24
        $this->http = null !== $http ? $http : HttpFactory::getHttp();
25
    }
26
27
    /**
28
     * @param  Request    $request
29
     * @return Response
30
     * @throws \Exception
31
     */
32
    public function request(Request $request)
33
    {
34
        $methodName = strtolower($request->getMethod());
35
36
        if (!is_callable(array($this, $methodName))) {
37
            throw new \Exception("Unsupported method '{$request->getMethod()}'!");
38
        }
39
40
        /** @var JoomlaResponse $joomlaResponse */
41
        $joomlaResponse = $this->$methodName($request);
42
43
        return new Response(
44
            (string) $request->getProtocolVersion(),
45
            $joomlaResponse->code,
46
            self::getStatusMessage($joomlaResponse->code),
47
            $joomlaResponse->headers,
48
            $joomlaResponse->body
49
        );
50
    }
51
52
    /**
53
     * @param  Request        $request
54
     * @return JoomlaResponse
55
     */
56
    protected function options(Request $request)
57
    {
58
        return $this->http->options(
59
            (string) $request->getUrl(),
60
            $request->getHeaders()
61
        );
62
    }
63
64
    /**
65
     * @param  Request        $request
66
     * @return JoomlaResponse
67
     */
68
    protected function get(Request $request)
69
    {
70
        return $this->http->get(
71
            (string) $request->getUrl(),
72
            $request->getHeaders()
73
        );
74
    }
75
76
    /**
77
     * @param  Request        $request
78
     * @return JoomlaResponse
79
     */
80
    protected function head(Request $request)
81
    {
82
        return $this->http->head(
83
            (string) $request->getUrl(),
84
            $request->getHeaders()
85
        );
86
    }
87
88
    /**
89
     * @param  Request        $request
90
     * @return JoomlaResponse
91
     */
92
    protected function post(Request $request)
93
    {
94
        return $this->http->post(
95
            (string) $request->getUrl(),
96
            $request->getContent(),
97
            $this->prepareHeaders($request)
98
        );
99
    }
100
101
    /**
102
     * @param  Request        $request
103
     * @return JoomlaResponse
104
     */
105
    protected function put(Request $request)
106
    {
107
        return $this->http->put(
108
            (string) $request->getUrl(),
109
            $request->getContent(),
110
            $this->prepareHeaders($request)
111
        );
112
    }
113
114
    /**
115
     * @param  Request        $request
116
     * @return JoomlaResponse
117
     */
118
    protected function delete(Request $request)
119
    {
120
        return $this->http->delete(
121
            (string) $request->getUrl(),
122
            $request->getHeaders()
123
        );
124
    }
125
126
    /**
127
     * @param  Request        $request
128
     * @return JoomlaResponse
129
     */
130
    protected function patch(Request $request)
131
    {
132
        return $this->http->patch(
133
            (string) $request->getUrl(),
134
            $request->getContent(),
135
            $this->prepareHeaders($request)
136
        );
137
    }
138
139
    /**
140
     * @param  Request $request
141
     * @return array
142
     */
143
    protected function prepareHeaders(Request $request)
144
    {
145
        $headers = $request->getHeaders();
146
147
        if (null !== $request->getContent() && !isset($headers['Content-Type'])) {
148
            $headers['Content-Type'] = 'application/x-www-form-urlencoded';
149
        }
150
151
        return $headers;
152
    }
153
154
    /**
155
     * @param  int        $statusCode
156
     * @return string
157
     * @throws \Exception
158
     */
159
    protected static function getStatusMessage($statusCode)
160
    {
161
        static $reflectionResponse;
162
163
        if (null === $reflectionResponse) {
164
            $responseClass = 'Saxulum\HttpClient\Response';
165
            $reflectionResponse = new \ReflectionClass($responseClass);
166
        }
167
168
        $constantName = self::getCodeConstantName($statusCode);
169
170
        if (!$reflectionResponse->hasConstant($constantName)) {
171
            throw new \Exception("Unknown status code {$statusCode}!");
172
        }
173
174
        return $reflectionResponse->getConstant($constantName);
175
    }
176
177
    /**
178
     * @param  int    $statusCode
179
     * @return string
180
     */
181
    protected static function getCodeConstantName($statusCode)
182
    {
183
        return 'STATUS_MESSAGE_' . $statusCode;
184
    }
185
}
186