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

Схожі статті