Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to reuse CURL and set different doh url at every time in libcurl?

I set the hosts file on PC like this:

127.0.0.1 www.baidu.com

Then I wrote a simple test:

CURL *curl = curl_easy_init();
for (int i = 0; i < 3; ++i) {
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 0L);
        curl_easy_setopt(curl, CURLOPT_URL, "www.baidu.com");
        if (i == 1)
            curl_easy_setopt(curl, CURLOPT_DOH_URL, "https://dns.alidns.com/dns-query");
        else
            curl_easy_setopt(curl, CURLOPT_DOH_URL, NULL);
            
        CURLcode res = curl_easy_perform(curl);
        std::cout << std::endl;
        std::cout << "==================================================" << std::endl;
        std::cout << "Time: " << i << std::endl;
        std::cout << "res = " << res << std::endl;
        char *url = NULL;
        curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
        if (url)
            printf("Redirect to: %s\n", url);
        std::cout << "==================================================" << std::endl;
        curl_easy_reset(curl);
    }
}

And the result is like:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

==================================================
Time: 0
res = 7
Redirect to: http://www.baidu.com/
==================================================
==================================================
Time: 1
res = 0
Redirect to: http://www.baidu.com/
==================================================
==================================================
Time: 2
res = 0
Redirect to: http://www.baidu.com/
==================================================

As defined in CURLcode, r = 0 means CURLE_OK, and r = 7 means CURLE_COULDNT_CONNECT.

I don’t understand the result. When i == 0, I set DOH_URL to NULL, so it is normal that it couldn’t connect. But when i == 2, I also set DOH_URL to NULL, and I do reset operation, and set DNS_CACHE_TIMEOUT to 0, why it still could connect?

>Solution :

curl easy uses the existing connection of the 2nd iteration on the 3rd iteration. See Name Resolving

libcurl tries hard to re-use an existing connection rather than to create a new one. The function that checks for an existing connection to use is based purely on the name and is performed before any name resolving is attempted.

See curl_easy_reset()

It does not change the following information kept in the handle: live connections, the Session ID cache, the DNS cache, the cookies, the shares or the alt-svc cache.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading