Comece pelo resultado do cURL quando uma página baixada por um proxy parece incompleta. Uma resposta curta, uma transferência falhada e uma página de bloqueio completa exigem explicações diferentes.

Com CURLOPT_RETURNTRANSFER ativado no handle já 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);

Recolha estes valores antes de liberar o handle. A comparação estrita distingue uma falha de transporte de um corpo bem-sucedido, como uma string vazia ou “0”. Os estados de erro HTTP não são falhas automáticas de curl_exec, portanto interprete também o estado.

O contador de dados baixados não inclui cabeçalhos. O valor declarado vem de Content-Length e é -1 quando esse tamanho é desconhecido. Uma resposta pode omitir Content-Length legitimamente; um valor desconhecido não é um diagnóstico de ficheiro truncado.

A descodificação automática de conteúdo introduz outra distinção. Content-Length costuma descrever a representação comprimida, enquanto a string PHP pode conter bytes descomprimidos. Comparar strlen($body) com esse cabeçalho compara então representações diferentes.

O cURL pode reportar CURLE_PARTIAL_FILE quando a transferência viola um tamanho esperado. Preserve esse erro em vez de tratar qualquer saída não vazia como sucesso. Por outro lado, uma transferência bem-sucedida com uma resposta 200 pequena pode ser a página inteira que a origem ou o proxy decidiu devolver.

Por fim verifique o conteúdo necessário. O HTML obtido pelo cURL não executa JavaScript para preencher a página. As secções que o navegador mostra podem faltar na resposta original mesmo que todos os bytes transmitidos tenham chegado.

Artigos relacionados