Guzzleov cURL rukovatelj: hvatanje proxy CONNECT zaglavlja
Uhvatite odvojene blokove zaglavlja odgovora Guzzleovim cURL rukovateljem kada su i odgovor proxyja na CONNECT i odgovor web-mjesta važni.
HTTPS zahtjev kroz HTTP proxy može primiti jedan odgovor koji prihvaća CONNECT i kasniji odgovor web-mjesta unutar tog tunela. Za početno postavljanje rute pogledajte Guzzleovu opciju proxyja po zahtjevu. Zaglavlje iz prvog odgovora ne mora postojati na konačnom objektu odgovora.
Za reprodukciju s HTTP krajnjom točkom koju sami odaberete uzmite kandidata s popisa HTTP proxyja i potvrdite da prihvaća HTTPS tunel. Na putu cURL rukovatelja u Guzzleu 7.10 sačuvajte svaki povratni poziv zaglavlja kao zaseban 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 proširenje mora izložiti CURLOPT_SUPPRESS_CONNECT_HEADERS, opciju koju je uveo libcurl 7.54.0. Postavljanje na false omogućuje da CONNECT zaglavlja dođu do cURL-ovog povratnog poziva zaglavlja. Guzzle 7.10 rukovatelj gradi odgovor za svaki dovršeni blok zaglavlja i poziva on_headers na toj granici.
Držite blokove u redoslijedu. Autentifikacijski izazovi, preusmjeravanja i informativni odgovori mogu stvoriti dodatne blokove; nemojte spljoštiti sve vrijednosti u jedan niz i nemojte klasificirati odgovor samo zato što mu je status 200.
Vraćeni odgovor predstavlja odgovor dovršenog zahtjeva, dok blocks čuva zapažanja prikupljena povratnim pozivima. Ako postavljanje tunela ili TLS-a ne uspije, obradite bačenu iznimku prijenosa u aplikaciji koja poziva; konačni odgovor web-mjesta možda ne postoji.
Ovo se ponašanje veže uz navedeni cURL rukovatelj. Prilagođeni rukovatelj ili rukovatelj toka nije obavezan izložiti iste povratne pozive proxy rukovanja. Tretirajte uhvaćena proxy zaglavlja kao dijagnostičke podatke i izbjegavajte nepotrebno zadržavanje vrijednosti povezanih s računom.