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-обработчику. Пользовательский обработчик или обработчик потока не обязан предоставлять те же обратные вызовы рукопожатия прокси. Рассматривайте перехваченные заголовки прокси как диагностические данные и избегайте ненужного хранения значений, связанных с учётной записью.

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