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 прокси отдельно от статуса назначения.

Похожие статьи