O manipulador cURL do Guzzle: capturar os cabeçalhos CONNECT do proxy
Capture blocos separados de cabeçalhos de resposta com o manipulador cURL do Guzzle quando tanto a resposta CONNECT do proxy quanto a resposta do site importam.
Uma solicitação HTTPS por meio de um proxy HTTP pode receber uma resposta que aceita CONNECT e, mais tarde, uma resposta do site dentro desse túnel. Para a configuração inicial da rota, consulte a opção de proxy por solicitação do Guzzle. Um cabeçalho da primeira resposta não precisa existir no objeto de resposta final.
Para reproduzir com um endpoint HTTP que você mesmo escolher, pegue um candidato na lista de proxies HTTP e confirme que ele aceita o túnel HTTPS. No caminho do manipulador cURL do Guzzle 7.10, preserve cada callback de cabeçalhos como um bloco 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 extensão cURL deve expor CURLOPT_SUPPRESS_CONNECT_HEADERS, uma opção introduzida pelo libcurl 7.54.0. Defini-la como false permite que os cabeçalhos CONNECT cheguem ao callback de cabeçalhos do cURL. O manipulador do Guzzle 7.10 monta uma resposta para cada bloco de cabeçalhos concluído e chama on_headers nesse limite.
Mantenha os blocos em ordem. Desafios de autenticação, redirecionamentos e respostas informativas podem produzir blocos adicionais; não achate todos os valores em um único array nem classifique uma resposta apenas porque o status dela é 200.
A resposta retornada representa a resposta da solicitação concluída, enquanto blocks preserva as observações coletadas pelos callbacks. Se a configuração do túnel ou do TLS falhar, trate a exceção de transferência lançada no aplicativo chamador; pode não existir uma resposta final do site.
Esse comportamento está ligado ao manipulador cURL indicado. Um manipulador personalizado ou de fluxo não é obrigado a expor os mesmos callbacks de handshake do proxy. Trate os cabeçalhos de proxy capturados como dados de diagnóstico e evite reter valores vinculados à conta sem necessidade.