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 манипулатор. Персонализиран или потоков манипулатор не е задължен да предоставя същите обратни извиквания при прокси ръкостискането. Отнасяйте се към уловените прокси заглавки като диагностични данни и избягвайте ненужното запазване на стойности, свързани с акаунт.