Curl возвращает все нормально, когда плохой ip передан CURLOPT_DNS_SERVERS

0

Я создал многопоточную программу (pthread) c++, которая настроена на использование списка пользовательских DNS. В моих тестах я использовал google 8.8.8.8 для хорошего ex, и некоторый случайный ip, например 113.65.123.138, 13.23.123.87, для проверки отказа. Но все идет одинаково в обоих случаях, успешно.

Curl был построен с поддержкой C-ares, и я протестировал, чтобы быть уверенным:

curl_version_info_data *data = curl_version_info(CURLVERSION_NOW);
cout<<endl<<"Curl version: "<< data->version <<endl
    <<"AsyncDNS: "<<( data->features | CURL_VERSION_ASYNCHDNS ? "YES" : "NO"  ) <<endl;
//output: Curl version: 7.30.0 \n AsyncDNS: YES

Остальная часть кода:

curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, thisThreadData->current_dns->dns_str.c_str()); 

curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE,false); //thread safety 
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, CONNECT_TIMEOUT);    
curl_easy_setopt(curl, CURLOPT_TIMEOUT, CONNECTION_TIMEOUT);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5);   
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_to_string);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &getUrlOutput->header);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &getUrlOutput->html);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip,deflate");

status=curl_easy_perform(curl);

Я тестировал случайные IP-адреса (на всякий случай, когда я наткнулся на какой-то действующий DNS):

$ host google.com 113.65.123.138
;; connection timed out; no servers could be reached
$ host google.com 13.23.123.87
;; connection timed out; no servers could be reached

Что мне не хватает?

Обновить

Я пробовал последнюю версию libcurl (7.33.0) и c-ares (1.10.0) и тот же результат.

Также, если я CURLE_HTTP_RETURNED_ERROR (22) неправильный домен для URL- CURLE_HTTP_RETURNED_ERROR (22) он возвращает CURLE_HTTP_RETURNED_ERROR (22) противоположный CURLE_COULDNT_RESOLVE_HOST (6).

Обновление 2

Забыл упомянуть, что я использовал HTML_PROXY для подключения, и, похоже, это был важный аспект, см. Ответ.

Теги:
curl
dns
libcurl

1 ответ

0
Лучший ответ

Согласно форумам curl, он ожидал поведения, поскольку dns обрабатывается прокси-сервером.

Когда я использую прокси-сервер, как мне (или я могу) контролировать, разрешен ли целевой URL-адрес локально или прокси-сервером? У меня есть условия, в которых мне нужны оба варианта.

С помощью HTTP-Proxy клиент (завиток) передает полный URL-адрес прокси-серверу, а прокси-сервер будет разрешать имя хоста.
Если вы действительно хотите сделать это на стороне клиента, вам нужно сначала разрешить имя, а затем "переустановить" URL-адрес, чтобы использовать только числовые номера IP, и установить заголовок Host:, чтобы содержать имя хоста, которое вы разрешили.

В моем случае, когда прокси-сервер DNS обнаруживает ошибку, он возвращает страницу с html-форматированной ошибкой с сообщением "host not found", html_status 503, поэтому скручивание прошло проверку DNS и сказал, что домен в порядке, но с CURLE_HTTP_RETURNED_ERROR с CURLE_HTTP_RETURNED_ERROR.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню