TJ is too short
TJ is too short

Reputation: 873

Laravel - Guzzle: Getting GuzzleHttp\Exception\ConnectException: cURL error 6 Could not resolve host randomly

This is probably the weirdest situation that I ever seen. Basically I have a system built in Laravel 5.1 which needs to make a request to an external system. The thing is, sometimes it works but sometimes I get

GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: hosthere

Absolutely nothing changes, in terms of code. I run the application with exactly the same parameters and sometimes I get the error, sometimes I get the right response.

Any ideas?

Thanks in advance

EDIT 2 When I execute nslookup domainthatineedtouse.com I get

;; Got SERVFAIL reply from 8.8.8.8, trying next server
Server: 8.8.4.4
Address:    8.8.4.4#53

Non-authoritative answer:
Name:   domainthatineedtouse.com
Address: therealipaddressishere

Can this be related to the issue?

EDIT This is part of the class that is making the connection.

<?php


use GuzzleHttp\ClientInterface;

class MyClass
{
    const ENDPOINT = 'http://example.com/v1/endpoint';

    /**
     * @var \GuzzleHttp\ClientInterface
     */
    protected $client;

    /**
     * @var string The api key used to connect to the service
     */
    protected $apiKey;

    /**
     * Constructor.
     *
     * @param $apiKey
     * @param ClientInterface $client
     */
    public function __construct($apiKey, ClientInterface $client)
    {
        $this->client = $client;
        $this->apiKey = $apiKey;
    }

    /**
     * Here is where I make the request
     *
     * @param $param1
     * @param $param2
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function makeTheRequest($param1, $param2)
    {
        return $this->client->request('get', self::ENDPOINT, [
            'query' => [
                'api_token' => $this->apiKey,
                'parameter_1' => $param1,
                'parameter_2' => $param2,
            ]
        ]);
    }
}

Upvotes: 6

Views: 20250

Answers (3)

TJ is too short
TJ is too short

Reputation: 873

I hope this helps. Basically the problem was related to the server:

https://twitter.com/digitalocean/status/844178536835551233

In my case, I just needed to reboot and everything seems fine now.

Upvotes: 0

Tariq Khan
Tariq Khan

Reputation: 6066

This is something one should always anticipate while calling external APIs most of them face outages including the very popular Amazon's Product Advertising API. So keeping that in mind this should always be placed in a try/catch along with using retries placed in a do/while.

You should always catch these two types of common timeouts, connection timeouts and request timeouts. \GuzzleHttp\Exception\ConnectException and \GuzzleHttp\Exception\RequestException

// query External API
// retry by using a do/while
$retry_count    = 0;
do {
    try {
        $response = json_decode($this->external_service->runOperation($operation));
    } catch (\GuzzleHttp\Exception\ConnectException $e) {
        // log the error here

        Log::Warning('guzzle_connect_exception', [
                'url' => $this->request->fullUrl(),
                'message' => $e->getMessage()
        ]);
    } catch (\GuzzleHttp\Exception\RequestException $e) {

        Log::Warning('guzzle_connection_timeout', [
                'url' => $this->request->fullUrl(),
                'message' => $e->getMessage()
        ]);
    }

    // Do max 5 attempts
    if (++$retry_count == 5) {
        break;
    }
} while(!is_array($response));

Upvotes: 7

acabala
acabala

Reputation: 149

It could be helpful if you share actual code with us.


What I can say now, there are chances to be one of 2 issues:

a) DNS settings problem on your server. You need to try different configuration

b) you are passing http:// as part of the url.

Upvotes: 0

Related Questions