Een HTTPS-verzoek via een HTTP-proxy kan één antwoord ontvangen dat CONNECT accepteert en daarna een antwoord van de website binnen die tunnel. Voor de eerste route-instelling, zie Guzzles proxy-optie per verzoek. Een header op het eerste antwoord hoeft niet op het uiteindelijke antwoordobject te staan.

Om dit te reproduceren met een HTTP-eindpunt dat u zelf kiest, neemt u een kandidaat uit de lijst met HTTP-proxy’s en bevestigt u dat die de HTTPS-tunnel accepteert. Op het cURL-handlerpad van Guzzle 7.10 bewaart u elke header-callback als een apart 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(),
        ];
    },
]);

De cURL-extensie moet CURLOPT_SUPPRESS_CONNECT_HEADERS bieden, een optie die door libcurl 7.54.0 is geïntroduceerd. Door deze op false te zetten, bereiken CONNECT-headers de header-callback van cURL. De handler van Guzzle 7.10 bouwt een antwoord voor elk voltooid headerblok en roept on_headers op die grens aan.

Houd de blokken in volgorde. Authenticatie-uitdagingen, omleidingen en informatieve antwoorden kunnen extra blokken opleveren; plat alle waarden niet tot één array en classificeer een antwoord niet alleen omdat de status 200 is.

Het teruggegeven antwoord vertegenwoordigt het antwoord van het voltooide verzoek, terwijl blocks de observaties bewaart die de callbacks hebben verzameld. Als de tunnel- of TLS-instelling mislukt, verwerk dan de gegooide transfer-exceptie in de aanroepende applicatie; een definitief websiteantwoord bestaat mogelijk niet.

Dit gedrag is gekoppeld aan de genoemde cURL-handler. Een aangepaste handler of streamhandler hoeft niet dezelfde proxy-handshake-callbacks te bieden. Behandel vastgelegde proxyheaders als diagnostische gegevens en vermijd het onnodig bewaren van aan het account gekoppelde waarden.

Gerelateerde artikelen