La réponse cURL de PHP était-elle tronquée ?
Vérifiez le résultat du transfert cURL, le statut de la réponse et la représentation du corps avant de comparer la taille téléchargée avec Content-Length.
Commencez par le résultat de cURL lorsqu’une page téléchargée via un proxy semble incomplète. Une réponse courte, un transfert échoué et une page de blocage complète demandent des explications différentes.
Avec CURLOPT_RETURNTRANSFER activé sur le handle déjà configuré :
$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);
Récupérez ces valeurs avant de libérer le handle. La comparaison stricte distingue un échec de transport d’un corps réussi comme une chaîne vide ou “0”. Les statuts d’erreur HTTP ne sont pas automatiquement des échecs de curl_exec, il faut donc aussi interpréter le statut.
Le compteur de téléchargement exclut les en-têtes. La valeur déclarée provient de Content-Length et vaut -1 lorsque cette taille est inconnue. Une réponse peut légitimement omettre Content-Length ; une valeur inconnue n’est pas un diagnostic de fichier tronqué.
Le décodage automatique du contenu introduit une autre distinction. Content-Length décrit souvent la représentation compressée, alors que la chaîne PHP peut contenir des octets décompressés. Comparer strlen($body) à cet en-tête revient alors à comparer des représentations différentes.
cURL peut signaler CURLE_PARTIAL_FILE lorsque le transfert enfreint une taille attendue. Conservez cette erreur au lieu de traiter toute sortie non vide comme un succès. À l’inverse, un transfert réussi avec une petite réponse 200 peut être la page entière que l’origine ou le proxy a choisi de renvoyer.
Enfin vérifiez le contenu requis. Le HTML récupéré par cURL n’exécute pas JavaScript pour remplir la page. Les sections affichées par le navigateur peuvent manquer dans la réponse d’origine même si chaque octet transmis est arrivé.