Явное указание прокси для easy handle libcurl
Настройте easy handle libcurl для конкретного прокси и различайте ошибки опций, сбои передачи и HTTP-статус.
libcurl привязывает конфигурацию прокси к easy handle, выполняющему передачу. Укажите адрес посредника на этом handle, оставив CURLOPT_URL в качестве URL назначения.
Следующий фрагмент предполагает, что libcurl инициализирован и handle является допустимым easy handle:
char error[CURL_ERROR_SIZE] = {0};
CURLcode result;
result = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error);
if (result == CURLE_OK)
result = curl_easy_setopt(handle, CURLOPT_URL,
"https://example.com/");
if (result == CURLE_OK)
result = curl_easy_setopt(handle, CURLOPT_PROXY,
"http://proxy.example:8080");
if (result == CURLE_OK)
result = curl_easy_perform(handle);
if (result != CURLE_OK)
fprintf(stderr, "%s\n", error[0] ? error
: curl_easy_strerror(result));
Поддерживайте буфер ошибок живым, пока handle ссылается на него. Прежде чем выйти из его области видимости, очистите handle либо замените или очистите его указатель CURLOPT_ERRORBUFFER. Имя хоста прокси — заполнитель; неаутентифицированный кандидат из списка HTTP-прокси может предоставить адрес для этого теста публичного сайта. Используйте его фактическую схему и порт и проверьте, разрешает ли он туннель HTTPS.
Назначение HTTPS может использовать HTTP-прокси. libcurl управляет туннелем для этой передачи HTTPS. http:// в опции прокси описывает соединение с посредником. Меняйте его на https:// только для конечной точки прокси, которая действительно принимает TLS, и сборки libcurl, которая это поддерживает.
Сделайте фактический маршрут осознанным
Явная опция прокси переопределяет соответствующую настройку окружения прокси. Обход — отдельное решение: унаследованный no_proxy всё ещё может исключить назначение. Если этот handle должен использовать выбранный прокси для каждого получаемого назначения, настройте CURLOPT_NOPROXY как пустую строку в рамках этой политики.
И наоборот, установка CURLOPT_PROXY в пустую строку явно отключает использование прокси. Установка его в NULL удаляет явное назначение и снова разрешает поведение на основе окружения. Эти два значения служат разным целям.
Заголовок, специфичный для цели, например Content-Type: text/xml, не выбирает прокси. Добавляйте его только тогда, когда фактическое тело запроса и API назначения нуждаются в этом типе медиа.
Читайте и результат HTTP
Успешный curl_easy_perform не означает, что сайт вернул успешный HTTP-статус. Прочитайте CURLINFO_RESPONSE_CODE и примените обработку статусов приложения. Ответ CONNECT прокси имеет собственное значение, CURLINFO_HTTP_CONNECTCODE; отказ в туннеле предшествует любому ответу сайта.
CURLOPT_FAILONERROR может рассматривать многие ошибки HTTP как сбои, но его документация упоминает исключения аутентификации. Держите вызов 407 прокси отдельно от статуса назначения.