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