Guzzles cURL-handler: fang proxyens CONNECT-headere
Fang separate blokke af svarheadere med Guzzles cURL-handler, når både proxyens CONNECT-svar og webstedets svar er vigtige.
En HTTPS-anmodning gennem en HTTP-proxy kan modtage ét svar, der accepterer CONNECT, og senere et svar fra webstedet inde i den tunnel. Se Guzzles proxyvalg pr. anmodning for den indledende ruteopsætning. En header på det første svar behøver ikke findes på det endelige svarobjekt.
For at genskabe med et HTTP-endepunkt, du selv vælger, kan du tage en kandidat fra listen over HTTP-proxyer og bekræfte, at den accepterer HTTPS-tunnelen. For Guzzle 7.10's cURL-handlervej skal du bevare hvert header-callback som en separat 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(),
];
},
]);
cURL-udvidelsen skal eksponere CURLOPT_SUPPRESS_CONNECT_HEADERS, en indstilling indført af libcurl 7.54.0. Når den sættes til false, kan CONNECT-headere nå cURL's header-callback. Guzzle 7.10-handleren bygger et svar for hver afsluttet headerblok og kalder on_headers ved den grænse.
Hold blokkene i rækkefølge. Autentificeringsudfordringer, omdirigeringer og informationssvar kan give ekstra blokke; læg ikke alle værdier sammen i ét array, og klassificér ikke et svar alene ud fra, at dets status er 200.
Det returnerede svar repræsenterer det afsluttede requests svar, mens blocks bevarer de observationer, som callbackene har samlet. Hvis tunnel- eller TLS-opsætningen fejler, skal du håndtere den kastede transfer-undtagelse i det kaldende program; der findes muligvis ikke et endeligt webstedssvar.
Denne adfærd er knyttet til den angivne cURL-handler. En brugerdefineret handler eller stream-handler er ikke forpligtet til at eksponere de samme proxy-håndtryks-callbacks. Behandl opfangede proxyheadere som diagnostiske data, og undgå unødigt at beholde kontorelaterede værdier.