cURL-обработчик Guzzle: перехват заголовков CONNECT прокси
Перехватывайте отдельные блоки заголовков ответа с помощью cURL-обработчика Guzzle, когда важны и ответ CONNECT прокси, и ответ сайта.
HTTPS-запрос через HTTP-прокси может получить один ответ, принимающий CONNECT, а затем более поздний ответ сайта внутри этого туннеля. Для начальной настройки маршрута см. опцию прокси Guzzle на запрос. Заголовок из первого ответа не обязан присутствовать в итоговом объекте ответа.
Чтобы воспроизвести это с выбранной вами HTTP-конечной точкой, возьмите кандидата из списка HTTP-прокси и убедитесь, что он принимает HTTPS-туннель. На пути cURL-обработчика Guzzle 7.10 сохраняйте каждый обратный вызов заголовков как отдельный блок:
$blocks = [];
$client = new \GuzzleHttp\Client([
'handler' => \GuzzleHttp\HandlerStack::create(
new \GuzzleHttp\Handler\CurlHandler()
),
]);
$response = $client->get('https://www.example.com/', [
'proxy' => 'http://proxy.example:8080',
'curl' => [CURLOPT_SUPPRESS_CONNECT_HEADERS => false],
'on_headers' => function (
\Psr\Http\Message\ResponseInterface $part
) use (&$blocks) {
$blocks[] = [
'status' => $part->getStatusCode(),
'reason' => $part->getReasonPhrase(),
'headers' => $part->getHeaders(),
];
},
]);
Расширение cURL должно предоставлять CURLOPT_SUPPRESS_CONNECT_HEADERS — параметр, появившийся в libcurl 7.54.0. Значение false позволяет заголовкам CONNECT доходить до обратного вызова заголовков cURL. Обработчик Guzzle 7.10 создаёт ответ для каждого завершённого блока заголовков и вызывает on_headers на этой границе.
Сохраняйте порядок блоков. Пробросы аутентификации, перенаправления и информационные ответы могут создавать дополнительные блоки; не сводите все значения в один массив и не классифицируйте ответ только потому, что его статус равен 200.
Возвращённый ответ представляет ответ завершённого запроса, а blocks хранит наблюдения, собранные обратными вызовами. Если настройка туннеля или TLS не удалась, обработайте выброшенное исключение передачи в вызывающем приложении; итогового ответа сайта может не быть.
Это поведение привязано к указанному cURL-обработчику. Пользовательский обработчик или обработчик потока не обязан предоставлять те же обратные вызовы рукопожатия прокси. Рассматривайте перехваченные заголовки прокси как диагностические данные и избегайте ненужного хранения значений, связанных с учётной записью.