Żą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.

Powiązane artykuły