HTTPS-запит через HTTP-проксі може отримати одну відповідь, що приймає CONNECT, і пізнішу відповідь від сайту всередині цього тунелю. Щодо початкового налаштування маршруту дивіться опцію проксі для кожного запиту в Guzzle. Заголовок із першої відповіді не обов'язково має бути в об'єкті фінальної відповіді.

Щоб відтворити це з HTTP-ендпоінтом, який ви оберете самі, візьміть кандидата зі списку HTTP-проксі і переконайтеся, що він приймає HTTPS-тунель. Для шляху cURL-обробника в Guzzle 7.10 зберігайте кожен header callback як окремий блок:

$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 досягати header callback-а cURL. Обробник Guzzle 7.10 будує відповідь для кожного завершеного блоку заголовків і викликає on_headers на цій межі.

Тримайте блоки в порядку. Проблеми автентифікації, переспрямування та інформаційні відповіді можуть створювати додаткові блоки; не зводьте всі значення в один array і не класифікуйте відповідь лише за тим, що її статус — 200.

Повернена відповідь представляє відповідь завершеного запиту, тоді як blocks зберігає спостереження, зібрані callback-ами. Якщо тунель або налаштування TLS не вдаються, обробіть викинутий transfer exception у застосунку, що викликає; фінальної відповіді сайту може не бути.

Ця поведінка прив'язана до зазначеного cURL-обробника. Власний обробник або stream-обробник не зобов'язаний надавати ті самі callback-и проксі-рукостискання. Ставтеся до перехоплених заголовків проксі як до діагностичних даних і не зберігайте без потреби значення, пов'язані з обліковим записом.

Схожі статті