Guzzles cURL-hanterare: fånga proxyns CONNECT-huvuden
Fånga separata svarshuvudblock med Guzzles cURL-hanterare när både proxyns CONNECT-svar och webbplatsens svar spelar roll.
En HTTPS-begäran via en HTTP-proxy kan få ett svar som accepterar CONNECT och ett senare svar från webbplatsen inne i tunneln. För den inledande vägkonfigurationen, se Guzzles proxy-alternativ per begäran. Ett huvud i det första svaret behöver inte finnas på det slutliga svarets objekt.
För en reproduktion med en HTTP-slutpunkt du väljer själv, ta en kandidat från listan över HTTP-proxyservrar och bekräfta att den accepterar HTTPS-tunneln. För Guzzle 7.10:s cURL-hanterarväg, bevara varje header-callback som ett separat block:
$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-tillägget måste exponera CURLOPT_SUPPRESS_CONNECT_HEADERS, ett alternativ som infördes i libcurl 7.54.0. Att sätta det till false låter CONNECT-huvuden nå cURL:s header-callback. Guzzle 7.10-hanteraren bygger ett svar för varje avslutat huvudblock och anropar on_headers vid den gränsen.
Håll blocken i ordning. Autentiseringsutmaningar, omdirigeringar och informativa svar kan ge ytterligare block; platta inte ut alla värden till en array och klassificera inte ett svar enbart för att dess status är 200.
Det returnerade svaret representerar den slutförda begärans svar, medan blocks bevarar observationerna som callbackarna samlade in. Om tunneln eller TLS-konfigurationen misslyckas, hantera det utlösta transfer-undantaget i den anropande applikationen; ett slutligt webbplatssvar kanske inte finns.
Detta beteende är knutet till den angivna cURL-hanteraren. En anpassad hanterare eller stream-hanterare är inte skyldig att exponera samma proxy-handskaknings-callbacks. Behandla fångade proxyhuvuden som diagnostikdata och undvik att onödigtvis behålla kontobundna värden.