Заголовки PHP cURL через прокси: CONNECT и ответы целевого сайта
Держите отдельно заголовки CONNECT, аутентификации, перенаправлений и финального ответа, когда передача PHP cURL использует прокси.
Собирайте строки заголовков отдельно от тела ответа. Передача через прокси может доставить заголовки CONNECT, аутентификации, перенаправления и ответа целевого сайта за одну операцию:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Этот обратный вызов сохраняет исходную последовательность строк и возвращает число принятых байт. Он получает полные строки; однако пока не группирует их в ответы и не выбирает заголовки итогового сайта.
Трактуйте последовательность как блоки
Строка состояния HTTP начинает блок ответа, а пустая строка завершает его заголовки. Сохраняйте эти границы до выбора финального ответа цели. Промежуточные попытки аутентификации и перенаправления могут добавлять блоки.
Трейлеры могут прийти позже через обратный вызов. Храните достаточно состояния парсера, чтобы отличать их от начальных заголовков, вместо того чтобы прикреплять каждое последующее поле к первому ответу.
Сохраняйте или подавляйте свидетельство туннеля
Читайте CURLINFO_HTTP_CONNECTCODE отдельно для статуса CONNECT туннеля HTTPS. Принятый туннель не доказывает успешный ответ сайта.
Если заголовки CONNECT сборщику не нужны, CURLOPT_SUPPRESS_CONNECT_HEADERS управляет их доставкой в настроенный вывод заголовков и пути обратного вызова. Проверьте поддержку в связанных libcurl и сборке PHP. Подавление упрощает сбор, но удаляет свидетельство туннеля на уровне заголовков, которое может помочь диагностике.
Не восстанавливайте тело фиксированным смещением или поиском HTML-тега. Размеры заголовков различаются, промежуточные ответы отличаются, а тело может быть двоичным или пустым. Старый отчёт об ошибке, специфичный для версии, не оправдывает угаданное смещение.
Держите обработку тела отдельно и сохраняйте ошибку передачи вместе с наблюдёнными этапами ответа, если сбор или разбор не удался. Это различает прерванный обратный вызов, повреждённые данные приложения и отклонённый обмен через прокси.