|
@@ -16,7 +16,7 @@ use Psr\Http\Message\RequestInterface;
|
|
|
class CurlFactory implements CurlFactoryInterface
|
|
class CurlFactory implements CurlFactoryInterface
|
|
|
{
|
|
{
|
|
|
/** @var array */
|
|
/** @var array */
|
|
|
- private $handles;
|
|
|
|
|
|
|
+ private $handles = [];
|
|
|
|
|
|
|
|
/** @var int Total number of idle handles to keep in cache */
|
|
/** @var int Total number of idle handles to keep in cache */
|
|
|
private $maxHandles;
|
|
private $maxHandles;
|
|
@@ -163,7 +163,7 @@ class CurlFactory implements CurlFactoryInterface
|
|
|
// If an exception was encountered during the onHeaders event, then
|
|
// If an exception was encountered during the onHeaders event, then
|
|
|
// return a rejected promise that wraps that exception.
|
|
// return a rejected promise that wraps that exception.
|
|
|
if ($easy->onHeadersException) {
|
|
if ($easy->onHeadersException) {
|
|
|
- return new RejectedPromise(
|
|
|
|
|
|
|
+ return \GuzzleHttp\Promise\rejection_for(
|
|
|
new RequestException(
|
|
new RequestException(
|
|
|
'An error was encountered during the on_headers event',
|
|
'An error was encountered during the on_headers event',
|
|
|
$easy->request,
|
|
$easy->request,
|
|
@@ -186,7 +186,7 @@ class CurlFactory implements CurlFactoryInterface
|
|
|
? new ConnectException($message, $easy->request, null, $ctx)
|
|
? new ConnectException($message, $easy->request, null, $ctx)
|
|
|
: new RequestException($message, $easy->request, $easy->response, null, $ctx);
|
|
: new RequestException($message, $easy->request, $easy->response, null, $ctx);
|
|
|
|
|
|
|
|
- return new RejectedPromise($error);
|
|
|
|
|
|
|
+ return \GuzzleHttp\Promise\rejection_for($error);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private function getDefaultConf(EasyHandle $easy)
|
|
private function getDefaultConf(EasyHandle $easy)
|
|
@@ -326,12 +326,20 @@ class CurlFactory implements CurlFactoryInterface
|
|
|
$conf[CURLOPT_SSL_VERIFYHOST] = 2;
|
|
$conf[CURLOPT_SSL_VERIFYHOST] = 2;
|
|
|
$conf[CURLOPT_SSL_VERIFYPEER] = true;
|
|
$conf[CURLOPT_SSL_VERIFYPEER] = true;
|
|
|
if (is_string($options['verify'])) {
|
|
if (is_string($options['verify'])) {
|
|
|
- $conf[CURLOPT_CAINFO] = $options['verify'];
|
|
|
|
|
|
|
+ // Throw an error if the file/folder/link path is not valid or doesn't exist.
|
|
|
if (!file_exists($options['verify'])) {
|
|
if (!file_exists($options['verify'])) {
|
|
|
throw new \InvalidArgumentException(
|
|
throw new \InvalidArgumentException(
|
|
|
"SSL CA bundle not found: {$options['verify']}"
|
|
"SSL CA bundle not found: {$options['verify']}"
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
+ // If it's a directory or a link to a directory use CURLOPT_CAPATH.
|
|
|
|
|
+ // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
|
|
|
|
|
+ if (is_dir($options['verify']) ||
|
|
|
|
|
+ (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {
|
|
|
|
|
+ $conf[CURLOPT_CAPATH] = $options['verify'];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $conf[CURLOPT_CAINFO] = $options['verify'];
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -370,15 +378,30 @@ class CurlFactory implements CurlFactoryInterface
|
|
|
$conf[CURLOPT_FILE] = fopen('php://temp', 'w+');
|
|
$conf[CURLOPT_FILE] = fopen('php://temp', 'w+');
|
|
|
$easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]);
|
|
$easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ $timeoutRequiresNoSignal = false;
|
|
|
if (isset($options['timeout'])) {
|
|
if (isset($options['timeout'])) {
|
|
|
|
|
+ $timeoutRequiresNoSignal |= $options['timeout'] < 1;
|
|
|
$conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
|
|
$conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // CURL default value is CURL_IPRESOLVE_WHATEVER
|
|
|
|
|
+ if (isset($options['force_ip_resolve'])) {
|
|
|
|
|
+ if ('v4' === $options['force_ip_resolve']) {
|
|
|
|
|
+ $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
|
|
|
|
|
+ } else if ('v6' === $options['force_ip_resolve']) {
|
|
|
|
|
+ $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (isset($options['connect_timeout'])) {
|
|
if (isset($options['connect_timeout'])) {
|
|
|
|
|
+ $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
|
|
|
$conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
|
|
$conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
|
|
|
|
|
+ $conf[CURLOPT_NOSIGNAL] = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (isset($options['proxy'])) {
|
|
if (isset($options['proxy'])) {
|
|
|
if (!is_array($options['proxy'])) {
|
|
if (!is_array($options['proxy'])) {
|
|
|
$conf[CURLOPT_PROXY] = $options['proxy'];
|
|
$conf[CURLOPT_PROXY] = $options['proxy'];
|