Empiece por el resultado de cURL cuando una página descargada a través de un proxy parece incompleta. Una respuesta corta, una transferencia fallida y una página de bloqueo completa necesitan explicaciones distintas.

Con CURLOPT_RETURNTRANSFER activado en el handle ya configurado:

$body = curl_exec($ch);
if ($body === false) {
    throw new RuntimeException(curl_error($ch), curl_errno($ch));
}

$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$downloaded = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD_T);
$declared = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T);

Reúna estos valores antes de liberar el handle. La comparación estricta distingue un fallo de transporte de un cuerpo correcto como una cadena vacía o “0”. Los estados de error HTTP no son fallos automáticos de curl_exec, así que interprete también el estado.

El contador de descarga excluye las cabeceras. El valor declarado procede de Content-Length y es -1 cuando ese tamaño es desconocido. Una respuesta puede omitir Content-Length legítimamente; un valor desconocido no es un diagnóstico de archivo truncado.

La decodificación automática del contenido introduce otra distinción. Content-Length suele describir la representación comprimida, mientras que la cadena PHP puede contener bytes descomprimidos. Comparar strlen($body) con esa cabecera compara entonces representaciones distintas.

cURL puede informar de CURLE_PARTIAL_FILE cuando la transferencia infringe un tamaño esperado. Conserve ese error en lugar de tratar cualquier salida no vacía como un éxito. A la inversa, una transferencia correcta con una respuesta 200 pequeña puede ser toda la página que el origen o el proxy decidieron devolver.

Por último compruebe el contenido necesario. El HTML que obtiene cURL no ejecuta JavaScript para rellenar la página. Las secciones que muestra el navegador pueden faltar en la respuesta original aunque haya llegado cada byte transmitido.

Artículos relacionados