Guzzleov cURL handler: zajemanje glav CONNECT proxyja
Zajemite ločene bloke glav odgovora z Guzzleovim cURL handlerjem, ko sta pomembna tako odgovor CONNECT proxyja kot odgovor spletnega mesta.
Zahteva HTTPS prek proxyja HTTP lahko prejme en odgovor, ki sprejme CONNECT, in pozneje odgovor spletnega mesta znotraj tega tunela. Za začetno nastavitev poti glejte Guzzleovo možnost proxyja na zahtevo. Glava iz prvega odgovora ni nujno v končnem objektu odgovora.
Za reprodukcijo s končno točko HTTP, ki jo izberete sami, vzemite kandidata s seznama proxyjev HTTP in potrdite, da sprejema tunel HTTPS. Na poti cURL handlerja v Guzzleu 7.10 ohranite vsak povratni klic glav kot ločen blok:
$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(),
];
},
]);
Razširitev cURL mora izpostaviti CURLOPT_SUPPRESS_CONNECT_HEADERS, možnost, ki jo je uvedel libcurl 7.54.0. Nastavitev na false omogoči, da glave CONNECT dosežejo povratni klic glav cURL. Handler Guzzle 7.10 zgradi odgovor za vsak dokončan blok glav in na tej meji pokliče on_headers.
Bloke hranite v vrstnem redu. Izzivi preverjanja pristnosti, preusmeritve in informativni odgovori lahko ustvarijo dodatne bloke; ne sploščite vseh vrednosti v eno polje in odgovora ne razvrščajte samo zato, ker je njegovo stanje 200.
Vrnjeni odgovor predstavlja odgovor dokončane zahteve, medtem ko blocks ohranja opažanja, ki so jih zbrali povratni klici. Če nastavitev tunela ali TLS ne uspe, obravnavajte vrženo izjemo prenosa v klicoči aplikaciji; končnega odgovora spletnega mesta morda ni.
To vedenje je vezano na navedeni cURL handler. Handler po meri ali pretočni handler ni dolžan izpostaviti istih povratnih klicev rokovanja s proxyjem. Zajete glave proxyja obravnavajte kot diagnostične podatke in se izogibajte nepotrebnemu shranjevanju vrednosti, povezanih z računom.