Guzzles cURL-handler: fange proxyens CONNECT-hoder
Fang separate blokker med svarhoder med Guzzles cURL-handler når både proxyens CONNECT-svar og nettstedets svar er viktige.
En HTTPS-forespørsel gjennom en HTTP-proxy kan motta ett svar som godtar CONNECT, og senere et svar fra nettstedet inne i den tunnelen. For den innledende ruteoppsettet, se Guzzles proxyvalg per forespørsel. En header i det første svaret trenger ikke finnes på det endelige svarobjektet.
For å gjenskape med et HTTP-endepunkt du velger selv, ta en kandidat fra listen over HTTP-proxyer og bekreft at den godtar HTTPS-tunnelen. På cURL-handlerbanen til Guzzle 7.10 skal du bevare hvert header-callback som en egen 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å eksponere CURLOPT_SUPPRESS_CONNECT_HEADERS, et alternativ som ble innført av libcurl 7.54.0. Å sette det til false lar CONNECT-hoder nå cURLs header-callback. Guzzle 7.10-handleren bygger et svar for hver fullførte headerblokk og kaller on_headers ved den grensen.
Hold blokkene i rekkefølge. Autentiseringsutfordringer, omdirigeringer og informasjonssvar kan gi flere blokker; ikke flat ut alle verdier i én matrise og ikke klassifiser et svar bare fordi statusen er 200.
Svaret som returneres, representerer svaret fra den fullførte forespørselen, mens blocks bevarer observasjonene som callbackene samlet inn. Hvis tunnel- eller TLS-oppsettet mislykkes, håndter transfer-unntaket som kastes i applikasjonen som kaller; det kan hende at det ikke finnes et endelig nettstedssvar.
Denne oppførselen er knyttet til den angitte cURL-handleren. En egendefinert handler eller strømmehandler er ikke forpliktet til å eksponere de samme proxy-håndtrykk-callbackene. Behandle fangede proxy-hoder som diagnostiske data og unngå å beholde kontorelaterte verdier unødvendig.