3

I have been loading the httpClient Core Service in a drupal 8 site. The service class works just fine when the request doesn't take too long from the API. It seems that if the request takes any longer than about 20-30 seconds the site throws a cURL response error 28 saying

GuzzleHttp\Exception\ConnectException: cURL error 28: Operation timed out  after 30000 milliseconds with 0 bytes received (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in GuzzleHttp\Handler\CurlFactory::createRejection() (line 186 of ../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php).

After a bit of poking around online I saw some reference to the fact that the "CURLOPT_TIMEOUT_MS" error doesn't work with all versions of php and they suggest to replace the reference to "CURLOPT_TIMEOUT_MS" to "CURLOPT_TIMEOUT" same for "CURLOPT_CONNECTTIMEOUT_MS".

In the above file with the error I found that in lines 374-380 which read the following

if (isset($options['timeout'])) {
  $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
}
if (isset($options['connect_timeout'])) {
   $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
}

if it's changed to the following

if (isset($options['timeout'])) {
    $conf[CURLOPT_TIMEOUT] = $options['timeout'] * 1000;
}
if (isset($options['connect_timeout'])) {
   $conf[CURLOPT_CONNECTTIMEOUT] = $options['connect_timeout'] * 1000;
}

removing the "_MS" then the site doesn't throw any errors.

Is this an error in the core code? Is this issue possibly related and can it be fixed with the patches attached to this d.o issue? Also please see this comment on that issue with reference to what I mentioned above.

Any suggestions or direction on this would be greatly appreciated!

3
  • You don't have a use of undefined constant error (as far as you reported), so your problem is probably different. CurlFactory is within Guzzle, so if there is a bug in there, it isn't Drupal. The thing to find out is what connect_timeout and timeout are set to in the calling code.
    – cilefen
    Jul 7, 2016 at 19:51
  • Unless you are not logging notices.
    – cilefen
    Jul 7, 2016 at 19:52
  • @cilefen Thanks for the response. I checked my logs for any php notices and I don't see any notices related to this issue. How would I go about finding out what the connect_timeout and timeout are set to in the calling code? I did try setting the connect_timeout manually in my local.settings.php file but that didn't seem to help..
    – Hershy
    Jul 7, 2016 at 20:08

1 Answer 1

3

As @cilefen suggested in his comments my problem was related to the timeout value that was being set in the calling code rather then an error with an undefined constant. I had fixed the error in my particular situation by adjusting the timeout value in my custom code that was making the API call with the following (600 is an example).

$request = $client->post($url, [
  'timeout' => 600,
  'json' => [array(...)],
]);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.