Handlerul cURL al Guzzle: capturarea antetelor CONNECT ale proxy-ului
Capturați blocuri separate de antete de răspuns cu handlerul cURL al Guzzle când contează atât răspunsul CONNECT al proxy-ului, cât și răspunsul site-ului.
O cerere HTTPS printr-un proxy HTTP poate primi un răspuns care acceptă CONNECT și, mai târziu, un răspuns de la site în interiorul acelui tunel. Pentru configurarea inițială a rutei, vedeți opțiunea proxy per cerere a Guzzle. Un antet din primul răspuns nu trebuie să existe neapărat în obiectul de răspuns final.
Pentru a reproduce cu un endpoint HTTP pe care îl alegeți singur, luați un candidat din lista de proxy-uri HTTP și confirmați că acceptă tunelul HTTPS. Pe calea handlerului cURL din Guzzle 7.10, păstrați fiecare apel invers al antetelor ca un bloc separat:
$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(),
];
},
]);
Extensia cURL trebuie să expună CURLOPT_SUPPRESS_CONNECT_HEADERS, o opțiune introdusă de libcurl 7.54.0. Setarea ei pe false permite antetelor CONNECT să ajungă la apelul invers al antetelor din cURL. Handlerul Guzzle 7.10 construiește un răspuns pentru fiecare bloc de antete finalizat și apelează on_headers la acea graniță.
Păstrați blocurile în ordine. Provocările de autentificare, redirecționările și răspunsurile informative pot produce blocuri suplimentare; nu aplatizați toate valorile într-un singur tablou și nu clasificați un răspuns doar pentru că starea lui este 200.
Răspunsul returnat reprezintă răspunsul cererii finalizate, în timp ce blocks păstrează observațiile colectate de apelurile inverse. Dacă configurarea tunelului sau a TLS eșuează, gestionați excepția de transfer aruncată în aplicația apelantă; este posibil să nu existe un răspuns final al site-ului.
Acest comportament este legat de handlerul cURL menționat. Un handler personalizat sau de flux nu este obligat să expună aceleași apeluri inverse ale strângerii de mână a proxy-ului. Tratați antetele proxy capturate ca date de diagnostic și evitați păstrarea inutilă a valorilor legate de cont.