Cabeceiras de PHP cURL a través dun proxy: CONNECT fronte ás respostas de destino
Manteña separadas as cabeceiras de CONNECT, autenticación, redirección e resposta final cando unha transferencia PHP cURL usa un proxy.
Recolla as liñas de cabeceira por separado do corpo da resposta. Unha transferencia a través dun proxy pode entregar cabeceiras de CONNECT, autenticación, redirección e resposta de destino nunha soa operación:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Esta devolución de chamada conserva a secuencia bruta de liñas e devolve o número de bytes aceptados. Recibe liñas completas; pero aínda non as agrupa en respostas nin selecciona as cabeceiras do sitio web final.
Interprete a secuencia como bloques
Unha liña de estado HTTP inicia un bloque de resposta, e unha liña en branco remata as súas cabeceiras. Preserve eses límites antes de escoller a resposta de destino final. Os intentos de autenticación intermedios e as redireccións poden engadir bloques cada un.
Os trailers poden chegar máis tarde a través da devolución de chamada. Manteña suficiente estado do analizador para distinguilos das cabeceiras iniciais, en lugar de adxuntar cada campo posterior á primeira resposta.
Conserve ou suprima a evidencia do túnel
Lea CURLINFO_HTTP_CONNECTCODE por separado para o estado CONNECT do túnel HTTPS. Un túnel aceptado non establece unha resposta correcta do sitio web.
Se o colector non necesita as cabeceiras CONNECT, CURLOPT_SUPPRESS_CONNECT_HEADERS controla a súa entrega á saída de cabeceiras configurada e ás rutas de devolución de chamada. Comprobe a compatibilidade na libcurl e na compilación de PHP vinculadas. Suprimir simplifica a recollida, pero elimina a evidencia de túnel a nivel de cabeceira que pode axudar ao diagnóstico.
Non recupere o corpo cun desprazamento fixo nin buscando unha etiqueta HTML. Os tamaños das cabeceiras varían, as respostas intermedias difiren e o corpo pode ser binario ou estar baleiro. Un informe de erro antigo específico dunha versión non xustifica un desprazamento suposto.
Manteña o tratamento do corpo por separado e conserve o erro de transferencia xunto coas etapas de resposta observadas se a recollida ou a análise fallan. Iso distingue unha devolución de chamada interrompida, datos de aplicación mal formados e un intercambio de proxy rexeitado.