Una solicitud HTTPS a través de un proxy HTTP puede recibir una respuesta que acepta CONNECT y, más tarde, una respuesta del sitio web dentro de ese túnel. Para la configuración inicial de la ruta, consulte la opción de proxy por solicitud de Guzzle. Una cabecera de la primera respuesta no tiene por qué existir en el objeto de respuesta final.

Para reproducirlo con un punto de conexión HTTP que elija usted mismo, tome un candidato de la lista de proxies HTTP y confirme que acepta el túnel HTTPS. En la ruta del manejador cURL de Guzzle 7.10, conserve cada devolución de llamada de cabeceras 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(),
        ];
    },
]);

La extensión cURL debe exponer CURLOPT_SUPPRESS_CONNECT_HEADERS, una opción introducida por libcurl 7.54.0. Establecerla en false permite que las cabeceras CONNECT lleguen a la devolución de llamada de cabeceras de cURL. El manejador de Guzzle 7.10 construye una respuesta para cada bloque de cabeceras completado y llama a on_headers en ese límite.

Mantenga los bloques en orden. Los desafíos de autenticación, las redirecciones y las respuestas informativas pueden producir bloques adicionales; no aplane todos los valores en un solo array ni clasifique una respuesta solo porque su estado sea 200.

La respuesta devuelta representa la respuesta de la solicitud completada, mientras que blocks conserva las observaciones recogidas por las devoluciones de llamada. Si falla la configuración del túnel o de TLS, gestione la excepción de transferencia lanzada en la aplicación que llama; puede que no exista una respuesta final del sitio web.

Este comportamiento está ligado al manejador cURL indicado. Un manejador personalizado o de flujo no está obligado a exponer las mismas devoluciones de llamada del apretón de manos del proxy. Trate las cabeceras de proxy capturadas como datos de diagnóstico y evite retener valores vinculados a la cuenta sin necesidad.

Artículos relacionados