L'handler cURL di Guzzle: catturare le intestazioni CONNECT del proxy
Catturate blocchi separati di intestazioni di risposta con l'handler cURL di Guzzle quando contano sia la risposta CONNECT del proxy sia la risposta del sito web.
Una richiesta HTTPS tramite un proxy HTTP può ricevere una risposta che accetta CONNECT e, più tardi, una risposta dal sito web all'interno di quel tunnel. Per la configurazione iniziale della rotta, vedere l'opzione proxy per richiesta di Guzzle. Un'intestazione della prima risposta non deve necessariamente esistere nell'oggetto di risposta finale.
Per riprodurre con un endpoint HTTP scelto da voi, prendete un candidato dalla lista dei proxy HTTP e verificate che accetti il tunnel HTTPS. Nel percorso dell'handler cURL di Guzzle 7.10, conservate ogni callback delle intestazioni come blocco separato:
$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(),
];
},
]);
L'estensione cURL deve esporre CURLOPT_SUPPRESS_CONNECT_HEADERS, un'opzione introdotta da libcurl 7.54.0. Impostarla su false consente alle intestazioni CONNECT di raggiungere il callback delle intestazioni di cURL. L'handler di Guzzle 7.10 costruisce una risposta per ogni blocco di intestazioni completato e chiama on_headers a quel confine.
Mantenete i blocchi in ordine. Le richieste di autenticazione, i reindirizzamenti e le risposte informative possono produrre blocchi aggiuntivi; non appiattite tutti i valori in un unico array e non classificate una risposta solo perché il suo stato è 200.
La risposta restituita rappresenta la risposta della richiesta completata, mentre blocks conserva le osservazioni raccolte dai callback. Se la configurazione del tunnel o di TLS fallisce, gestite l'eccezione di trasferimento lanciata nell'applicazione chiamante; potrebbe non esistere una risposta finale del sito web.
Questo comportamento è legato all'handler cURL indicato. Un handler personalizzato o di flusso non è tenuto a esporre gli stessi callback di handshake del proxy. Trattate le intestazioni proxy catturate come dati diagnostici ed evitate di conservare inutilmente valori legati all'account.