Description
Hello, thanks for your great work!
Was trying to use CurlClient
without any (default) HTTPOptions
but it fail with a curl error:
chillerlan\HTTP\Psr18\RequestException : error setting certificate verify locations:
CAfile:
CApath: /etc/ssl/certs
wich is weird because making a plain curl connection didn't fail:
public function testCurlIsWorking()
{
$curl = curl_init();
curl_setopt($curl, \CURLOPT_URL, 'https://example.com/');
curl_setopt($curl, \CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, \CURLOPT_SSL_VERIFYPEER, true);
\curl_exec($curl);
$errno = \curl_errno($curl);
if ($errno !== \CURLE_OK) {
$error = \curl_error($curl);
$this->fail($error);
}
$this->assertTrue(true, 'test complete');
}
So I take a look into your package and I see that in CurlHandle::init()
you are setting $this->options->curl_options[\CURLOPT_CAINFO]
with a NULL
value.
If you modify the test and add this line will fail in the same way.
curl_setopt($curl, \CURLOPT_CAINFO, null);
I think that the problem is in CurlHandle::initCurlOptions()
that returns an array with CURLOPT_CAINFO => $this->options->ca_info
even when $this->options->ca_info === NULL
. I tested including CURLOPT_CAINFO
only when $this->options->ca_info
is not falsy and it work just fine.
By the way, the same would happens with CURLOPT_CAPATH
if you provide a way to work with.
Looks like CURLOPT_CAINFO
or CURLOPT_CAPATH
cannot be removed using null or empty strings, and it will fail. Also, if both are set then both must succeed.
Could you consider to fix this? Do you want me to make a PR? I'm not familiar with your test suite. The only this I was thinking is to simply remove 'ca_info' => __DIR__.'/../cacert.pem'
from the initiation parameters on CurlClientTest.php
.