Handler cURL Guzzle: przechwytywanie nagłówków CONNECT proxy
Przechwytuj osobne bloki nagłówków odpowiedzi za pomocą handlera cURL Guzzle, gdy ważna jest zarówno odpowiedź CONNECT proxy, jak i odpowiedź witryny.
Żądanie HTTPS przez proxy HTTP może otrzymać jedną odpowiedź akceptującą CONNECT, a później odpowiedź witryny wewnątrz tego tunelu. Konfigurację początkowej trasy opisano w opcji proxy Guzzle dla pojedynczego żądania. Nagłówek z pierwszej odpowiedzi nie musi istnieć w końcowym obiekcie odpowiedzi.
Aby odtworzyć to z wybranym przez siebie punktem końcowym HTTP, weź kandydata z listy proxy HTTP i potwierdź, że akceptuje tunel HTTPS. Na ścieżce handlera cURL Guzzle 7.10 zachowuj każde wywołanie zwrotne nagłówków jako osobny 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(),
];
},
]);
Rozszerzenie cURL musi udostępniać CURLOPT_SUPPRESS_CONNECT_HEADERS, opcję wprowadzoną przez libcurl 7.54.0. Ustawienie jej na false pozwala nagłówkom CONNECT dotrzeć do wywołania zwrotnego nagłówków cURL. Handler Guzzle 7.10 buduje odpowiedź dla każdego zakończonego bloku nagłówków i wywołuje on_headers na tej granicy.
Zachowaj kolejność bloków. Wyzwania uwierzytelniania, przekierowania i odpowiedzi informacyjne mogą tworzyć dodatkowe bloki; nie spłaszczaj wszystkich wartości do jednej tablicy i nie klasyfikuj odpowiedzi tylko dlatego, że jej status to 200.
Zwracana odpowiedź reprezentuje odpowiedź zakończonego żądania, a blocks zachowuje obserwacje zebrane przez wywołania zwrotne. Jeśli konfiguracja tunelu lub TLS się nie powiedzie, obsłuż zgłoszony wyjątek transferu w aplikacji wywołującej; końcowa odpowiedź witryny może nie istnieć.
To zachowanie jest związane z podanym handlerem cURL. Niestandardowy handler lub handler strumieniowy nie musi udostępniać tych samych wywołań zwrotnych uzgadniania proxy. Traktuj przechwycone nagłówki proxy jako dane diagnostyczne i unikaj niepotrzebnego przechowywania wartości powiązanych z kontem.