Cabeçalhos do PHP cURL via proxy: CONNECT versus respostas de destino
Mantenha separados os cabeçalhos de CONNECT, autenticação, redirecionamento e resposta final quando uma transferência PHP cURL usa um proxy.
Recolha as linhas de cabeçalho separadamente do corpo da resposta. Uma transferência por um proxy pode entregar cabeçalhos de CONNECT, autenticação, redirecionamento e resposta de destino numa única operação:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Este callback preserva a sequência bruta de linhas e devolve o número de bytes aceitos. Recebe linhas completas; mas ainda não as agrupa em respostas nem seleciona os cabeçalhos do site final.
Interprete a sequência como blocos
Uma linha de estado HTTP inicia um bloco de resposta, e uma linha em branco termina os seus cabeçalhos. Preserve esses limites antes de escolher a resposta de destino final. Tentativas de autenticação intermédias e redirecionamentos podem cada um acrescentar blocos.
Os trailers podem chegar mais tarde através do callback. Mantenha estado suficiente do analisador para os distinguir dos cabeçalhos iniciais, em vez de anexar cada campo posterior à primeira resposta.
Conserve ou suprima a evidência do túnel
Leia CURLINFO_HTTP_CONNECTCODE separadamente para o estado CONNECT do túnel HTTPS. Um túnel aceite não estabelece uma resposta bem-sucedida do site.
Se o coletor não precisar dos cabeçalhos CONNECT, CURLOPT_SUPPRESS_CONNECT_HEADERS controla a sua entrega à saída de cabeçalhos configurada e aos caminhos de callback. Verifique o suporte na libcurl e na compilação PHP associadas. Suprimir simplifica a recolha, mas remove a evidência de túnel ao nível dos cabeçalhos que pode ajudar ao diagnóstico.
Não recupere o corpo com um deslocamento fixo nem procurando uma tag HTML. Os tamanhos dos cabeçalhos variam, as respostas intermédias diferem e o corpo pode ser binário ou estar vazio. Um relatório de erro antigo específico de uma versão não justifica um deslocamento suposto.
Mantenha o tratamento do corpo separado e conserve o erro de transferência junto das etapas de resposta observadas se a recolha ou a análise falharem. Isso distingue um callback interrompido, dados de aplicação malformados e uma troca de proxy rejeitada.