Eine HTTPS-Anfrage über einen HTTP-Proxy kann eine Antwort erhalten, die CONNECT annimmt, und später eine Antwort der Website innerhalb dieses Tunnels. Für die anfängliche Routeneinrichtung siehe Guzzles Proxy-Option pro Anfrage. Ein Header der ersten Antwort muss nicht im endgültigen Antwortobjekt vorhanden sein.

Für eine Reproduktion mit einem HTTP-Endpunkt, den Sie selbst wählen, nehmen Sie einen Kandidaten aus der HTTP-Proxy-Liste und bestätigen Sie, dass er den HTTPS-Tunnel annimmt. Für den cURL-Handler-Pfad von Guzzle 7.10 bewahren Sie jeden Header-Callback als eigenen Block auf:

$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(),
        ];
    },
]);

Die cURL-Erweiterung muss CURLOPT_SUPPRESS_CONNECT_HEADERS bereitstellen, eine von libcurl 7.54.0 eingeführte Option. Auf false gesetzt, erreichen CONNECT-Header den Header-Callback von cURL. Der Guzzle 7.10-Handler baut für jeden abgeschlossenen Header-Block eine Antwort und ruft on_headers an dieser Grenze auf.

Halten Sie die Blöcke in Reihenfolge. Authentifizierungsaufforderungen, Weiterleitungen und Informationsantworten können zusätzliche Blöcke erzeugen; flachen Sie nicht alle Werte in ein Array ab und klassifizieren Sie eine Antwort nicht allein anhand ihres Status 200.

Die zurückgegebene Antwort steht für die Antwort der abgeschlossenen Anfrage, während blocks die von den Callbacks gesammelten Beobachtungen bewahrt. Wenn die Tunnel- oder TLS-Einrichtung fehlschlägt, behandeln Sie die ausgelöste Transfer-Ausnahme in der aufrufenden Anwendung; eine abschließende Website-Antwort existiert möglicherweise nicht.

Dieses Verhalten ist an den genannten cURL-Handler gebunden. Ein benutzerdefinierter Handler oder Stream-Handler muss nicht dieselben Proxy-Handshake-Callbacks bereitstellen. Behandeln Sie erfasste Proxy-Header als Diagnosedaten und vermeiden Sie es, kontobezogene Werte unnötig aufzubewahren.

Ähnliche Artikel