-
Notifications
You must be signed in to change notification settings - Fork 62
/
CurlDriver.php
118 lines (98 loc) · 2.82 KB
/
CurlDriver.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
<?php
/**
* @author Joshua Estes
* @copyright 2012-2015 Joshua Estes
* @license https://github.com/nbobtc/bitcoind-php/blob/2.x/LICENSE MIT
*/
namespace Nbobtc\Http\Driver;
use Psr\Http\Message\RequestInterface;
use Zend\Diactoros\Response;
/**
* Uses cURL to send Requests
*
* @since 2.0.0
*/
class CurlDriver implements DriverInterface
{
/**
* @var resource
*/
protected static $ch;
/**
* @var array
*/
protected $curlOptions = array();
/**
* @since 2.0.0
*/
public function __destruct()
{
if (null !== self::$ch) {
curl_close(self::$ch);
self::$ch = null; // Nulling to avoid calling curl_close again
}
}
/**
* @since 2.0.0
* {@inheritDoc}
*/
public function execute(RequestInterface $request)
{
$uri = $request->getUri();
if (null === self::$ch || gettype(self::$ch) != 'curl') {
self::$ch = curl_init();
}
curl_setopt_array(self::$ch, $this->getDefaultCurlOptions());
curl_setopt(self::$ch, CURLOPT_URL, sprintf('%s://%s@%s', $uri->getScheme(), $uri->getUserInfo(), $uri->getHost()));
curl_setopt(self::$ch, CURLOPT_PORT, $uri->getPort());
$headers = array();
foreach ($request->getHeaders() as $header => $values) {
$headers[] = $header.': '.implode(', ', $values);
}
curl_setopt(self::$ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt(self::$ch, CURLOPT_POSTFIELDS, (string) $request->getBody());
// Allows user to override any option, may cause errors
curl_setopt_array(self::$ch, $this->curlOptions);
/** @var string|false */
$result = curl_exec(self::$ch);
/** @var array|false */
$info = curl_getinfo(self::$ch);
/** @var string */
$error = curl_error(self::$ch);
if (!empty($error)) {
throw new \Exception($error);
}
$response = new Response();
$response = $response->withStatus($info['http_code']);
$response->getBody()->write($result);
$response->getBody()->rewind(); // empty getContents() without rewind()
return $response;
}
/**
* Add options to use for cURL requests
*
* @since 2.0.0
* @param integer $option
* @param mixed $value
*/
public function addCurlOption($option, $value)
{
$this->curlOptions[$option] = $value;
return $this;
}
/**
* Returns an array of cURL options
*
* @since 2.0.0
* @return array
*/
protected function getDefaultCurlOptions()
{
return array(
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 10,
);
}
}