Unha solicitude HTTPS a través dun proxy HTTP pode recibir unha resposta que acepta CONNECT e, máis tarde, unha resposta do sitio web dentro dese túnel. Para a configuración inicial da ruta, consulte a opción de proxy por solicitude de Guzzle. Unha cabeceira da primeira resposta non ten por que existir no obxecto de resposta final.

Para reproducilo cun punto de conexión HTTP que escolla vostede mesmo, tome un candidato da lista de proxys HTTP e confirme que acepta o túnel HTTPS. Na ruta do xestor cURL de Guzzle 7.10, conserve cada devolución de chamada de cabeceiras como un bloque separado:

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

A extensión cURL debe expor CURLOPT_SUPPRESS_CONNECT_HEADERS, unha opción introducida por libcurl 7.54.0. Establecela en false permite que as cabeceiras CONNECT cheguen á devolución de chamada de cabeceiras de cURL. O xestor de Guzzle 7.10 constrúe unha resposta para cada bloque de cabeceiras completado e chama on_headers nese límite.

Manteña os bloques en orde. Os desafíos de autenticación, as redireccións e as respostas informativas poden producir bloques adicionais; non achande todos os valores nunha soa matriz nin clasifique unha resposta só porque o seu estado sexa 200.

A resposta devolta representa a resposta da solicitude completada, mentres que blocks conserva as observacións recollidas polas devolucións de chamada. Se falla a configuración do túnel ou de TLS, xestione a excepción de transferencia lanzada na aplicación que chama; pode que non exista unha resposta final do sitio web.

Este comportamento está ligado ao xestor cURL indicado. Un xestor personalizado ou de fluxo non está obrigado a expor as mesmas devolucións de chamada do aperto de mans do proxy. Trate as cabeceiras de proxy capturadas como datos de diagnóstico e evite reter valores vinculados á conta sen necesidade.

Artigos relacionados