-
-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathHttp.php
307 lines (278 loc) · 10.1 KB
/
Http.php
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
<?php
/**
* Part of the Joomla Framework Http Package
*
* @copyright Copyright (C) 2005 - 2021 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
namespace Joomla\Http;
use Joomla\Uri\Uri;
use Joomla\Uri\UriInterface;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
/**
* HTTP client class.
*
* @since 1.0
*/
class Http implements ClientInterface
{
/**
* Options for the HTTP client.
*
* @var array|\ArrayAccess
* @since 1.0
*/
protected $options;
/**
* The HTTP transport object to use in sending HTTP requests.
*
* @var TransportInterface
* @since 1.0
*/
protected $transport;
/**
* Constructor.
*
* @param array|\ArrayAccess $options Client options array. If the registry contains any headers.* elements,
* these will be added to the request headers.
* @param ?TransportInterface $transport The HTTP transport object.
*
* @since 1.0
* @throws \InvalidArgumentException
*/
public function __construct($options = [], ?TransportInterface $transport = null)
{
if (!\is_array($options) && !($options instanceof \ArrayAccess)) {
throw new \InvalidArgumentException(
'The options param must be an array or implement the ArrayAccess interface.'
);
}
$this->options = $options;
if (!$transport) {
$transport = (new HttpFactory())->getAvailableDriver($this->options);
// Ensure the transport is a TransportInterface instance or bail out
if (!($transport instanceof TransportInterface)) {
throw new \InvalidArgumentException(sprintf('A valid %s object was not set.', TransportInterface::class));
}
}
$this->transport = $transport;
}
/**
* Get an option from the HTTP client.
*
* @param string $key The name of the option to get.
* @param mixed $default The default value if the option is not set.
*
* @return mixed The option value.
*
* @since 1.0
*/
public function getOption($key, $default = null)
{
return $this->options[$key] ?? $default;
}
/**
* Set an option for the HTTP client.
*
* @param string $key The name of the option to set.
* @param mixed $value The option value to set.
*
* @return $this
*
* @since 1.0
*/
public function setOption($key, $value)
{
$this->options[$key] = $value;
return $this;
}
/**
* Method to send the OPTIONS command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function options($url, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('OPTIONS', $url, null, $headers, $timeout);
}
/**
* Method to send the HEAD command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function head($url, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('HEAD', $url, null, $headers, $timeout);
}
/**
* Method to send the GET command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function get($url, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('GET', $url, null, $headers, $timeout);
}
/**
* Method to send the POST command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param mixed $data Either an associative array or a string to be sent with the request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function post($url, $data, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('POST', $url, $data, $headers, $timeout);
}
/**
* Method to send the PUT command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param mixed $data Either an associative array or a string to be sent with the request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function put($url, $data, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('PUT', $url, $data, $headers, $timeout);
}
/**
* Method to send the DELETE command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
* @param mixed $data Either an associative array or a string to be sent with the request.
*
* @return Response
*
* @since 1.0
*/
public function delete($url, array $headers = [], $timeout = null, $data = null)
{
return $this->makeTransportRequest('DELETE', $url, $data, $headers, $timeout);
}
/**
* Method to send the TRACE command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function trace($url, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('TRACE', $url, null, $headers, $timeout);
}
/**
* Method to send the PATCH command to the server.
*
* @param string|UriInterface $url The URI to the resource to request.
* @param mixed $data Either an associative array or a string to be sent with the request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
*/
public function patch($url, $data, array $headers = [], $timeout = null)
{
return $this->makeTransportRequest('PATCH', $url, $data, $headers, $timeout);
}
/**
* Sends a PSR-7 request and returns a PSR-7 response.
*
* @param RequestInterface $request The PSR-7 request object.
*
* @return ResponseInterface|Response
*
* @since 2.0.0
*/
public function sendRequest(RequestInterface $request): ResponseInterface
{
$data = $request->getBody()->getContents();
return $this->makeTransportRequest(
$request->getMethod(),
new Uri((string) $request->getUri()),
empty($data) ? null : $data,
$request->getHeaders()
);
}
/**
* Send a request to the server and return a Response object with the response.
*
* @param string $method The HTTP method for sending the request.
* @param string|UriInterface $url The URI to the resource to request.
* @param mixed $data Either an associative array or a string to be sent with the request.
* @param array $headers An array of request headers to send with the request.
* @param integer $timeout Read timeout in seconds.
*
* @return Response
*
* @since 1.0
* @throws \InvalidArgumentException
*/
protected function makeTransportRequest($method, $url, $data = null, array $headers = [], $timeout = null)
{
// Look for headers set in the options.
if (isset($this->options['headers'])) {
$temp = (array) $this->options['headers'];
foreach ($temp as $key => $val) {
if (!isset($headers[$key])) {
$headers[$key] = $val;
}
}
}
// Look for timeout set in the options.
if ($timeout === null && isset($this->options['timeout'])) {
$timeout = $this->options['timeout'];
}
$userAgent = isset($this->options['userAgent']) ? $this->options['userAgent'] : null;
// Convert to a Uri object if we were given a string
if (\is_string($url)) {
$url = new Uri($url);
} elseif (!($url instanceof UriInterface)) {
throw new \InvalidArgumentException(
sprintf(
'A string or %s object must be provided, a "%s" was provided.',
UriInterface::class,
\gettype($url)
)
);
}
return $this->transport->request($method, $url, $data, $headers, $timeout, $userAgent);
}
}