Cabeceras de PHP cURL con proxy: CONNECT frente a las respuestas del destino
Mantenga separadas las cabeceras de CONNECT, autenticación, redirección y respuesta final cuando una transferencia PHP cURL usa un proxy.
Recoja las líneas de cabecera por separado del cuerpo de la respuesta. Una transferencia a través de un proxy puede entregar cabeceras de CONNECT, autenticación, redirección y respuesta del destino en una sola operación:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Esta devolución de llamada conserva la secuencia bruta de líneas y devuelve el número de bytes aceptados. Recibe líneas completas; pero aún no las agrupa en respuestas ni selecciona las cabeceras del sitio web final.
Interprete la secuencia como bloques
Una línea de estado HTTP inicia un bloque de respuesta y una línea en blanco termina sus cabeceras. Conserve esos límites antes de elegir la respuesta final del destino. Los intentos de autenticación intermedios y las redirecciones pueden añadir bloques cada uno.
Los trailers pueden llegar más tarde a través de la devolución de llamada. Mantenga suficiente estado del analizador para distinguirlos de las cabeceras iniciales, en lugar de adjuntar cada campo posterior a la primera respuesta.
Conserve o suprima la evidencia del túnel
Lea CURLINFO_HTTP_CONNECTCODE por separado para el estado CONNECT del túnel HTTPS. Un túnel aceptado no establece una respuesta correcta del sitio web.
Si el recolector no necesita las cabeceras CONNECT, CURLOPT_SUPPRESS_CONNECT_HEADERS controla su entrega a la salida de cabeceras configurada y a las rutas de devolución de llamada. Compruebe el soporte en la libcurl y la compilación de PHP vinculadas. Suprimir simplifica la recolección, pero elimina la evidencia de túnel a nivel de cabecera que puede ayudar al diagnóstico.
No recupere el cuerpo con un desplazamiento fijo ni buscando una etiqueta HTML. Los tamaños de cabecera varían, las respuestas intermedias difieren y el cuerpo puede ser binario o estar vacío. Un informe de error antiguo específico de una versión no justifica un desplazamiento supuesto.
Mantenga el tratamiento del cuerpo por separado y conserve el error de transferencia junto con las etapas de respuesta observadas si la recolección o el análisis fallan. Eso distingue una devolución de llamada interrumpida, datos de aplicación mal formados y un intercambio de proxy rechazado.