cURL-обробник Guzzle: перехоплення заголовків CONNECT проксі
Перехоплюйте окремі блоки заголовків відповіді за допомогою cURL-обробника Guzzle, коли важливі і відповідь проксі на CONNECT, і відповідь сайту.
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-и проксі-рукостискання. Ставтеся до перехоплених заголовків проксі як до діагностичних даних і не зберігайте без потреби значення, пов'язані з обліковим записом.