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.

Artículos relacionados