Guzzles cURL-handler: fang CONNECT-hodene fra proxyen
Fang separate blokker med responshoder med Guzzles cURL-handler når både proxyens CONNECT-svar og nettstedets svar betyr noe.
En HTTPS-forespørsel via en HTTP-proxy kan få ett svar som aksepterer CONNECT, og deretter et svar fra nettstedet inne i tunnelen. Se Guzzles proxyvalg per forespørsel for oppsett av den første ruten. Et hode i det første svaret trenger ikke å finnes i det endelige svarobjektet.
Vil du gjenskape dette med et HTTP-endepunkt du velger selv, tar du en kandidat fra listen over HTTP-proxyer og bekrefter at den aksepterer HTTPS-tunnelen. På cURL-handlerveien i Guzzle 7.10 bevarer du hvert hode-callback som en separat blokk:
$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-utvidelsen må tilby CURLOPT_SUPPRESS_CONNECT_HEADERS, en innstilling som libcurl 7.54.0 introduserte. Setter du den til false, når CONNECT-hodene cURLs hode-callback. Guzzle 7.10-handleren bygger et svar for hver fullførte hodeblokk og kaller on_headers ved den grensen.
Hold blokkene i rekkefølge. Autentiseringsutfordringer, omdirigeringer og informasjonssvar kan gi ekstra blokker; ikke slå alle verdier sammen i én matrise, og ikke klassifiser et svar bare fordi statusen er 200.
Svaret som returneres, representerer svaret på den fullførte forespørselen, mens blocks bevarer observasjonene som callbackene samlet. Hvis tunnel- eller TLS-oppsettet feiler, må du håndtere transfer-unntaket som kastes i applikasjonen som kaller; det kan hende at det ikke finnes noe endelig nettstedssvar.
Denne oppførselen henger sammen med den angitte cURL-handleren. En egen handler eller strømmehandler er ikke forpliktet til å tilby de samme proxy-håndtrykk-callbackene. Behandle fangede proxy-hoder som diagnostiske data, og unngå å beholde kontorelaterte verdier uten grunn.