Для существующего дескриптора libcurl явно разделите списки заголовков назначения и прокси:

curl_easy_setopt(handle, CURLOPT_HEADEROPT, (long)CURLHEADER_SEPARATE);
curl_easy_setopt(handle, CURLOPT_PROXYHEADER, proxy_headers);
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, origin_headers);

Сохраняйте настроенный дескриптор и действительные списки живыми на время передачи. CURLHEADER_SEPARATE отличает заголовки, используемые на CONNECT, от заголовков, используемых для запроса к назначению. Старые примеры единой политики могут помещать обычный список в оба обмена.

Путь запросаЗначение отдельных списков
HTTPS внутри обычного туннеля CONNECTСначала происходит обмен с прокси; затем HTTP-заголовки назначения следуют внутри TLS назначения.
Обычная пересылка HTTPПрокси может читать заголовки назначения, а libcurl может использовать оба применимых списка в одном пересылаемом запросе.

Маркер маршрутизации только для прокси относится к обмену с прокси. При пересылке открытым текстом произвольное настраиваемое поле может достичь источника, если только схема пересылки не обрабатывает его; имя параметра не является гарантией конфиденциальности.

Используйте поддерживаемые параметры учётных данных для аутентификации. Для определяемых оператором метаданных установите, какой шаг их использует и можно ли их пересылать, вместо размещения пароля в общем поле.

Когда маркер отсутствует или выглядит утекающим, определите фактический запрос, содержащий его. Обратный вызов заголовков, показывающий несколько обменов, может заставить правильно разделённые списки выглядеть смешанными.

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