La risposta cURL di PHP è stata troncata?
Controlla il risultato del trasferimento cURL, lo stato della risposta e la rappresentazione del corpo prima di confrontare la dimensione scaricata con Content-Length.
Parti dal risultato di cURL quando una pagina scaricata tramite proxy sembra incompleta. Una risposta breve, un trasferimento fallito e una pagina di blocco completa richiedono spiegazioni diverse.
Con CURLOPT_RETURNTRANSFER abilitato sull’handle già configurato:
$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);
Raccogli questi valori prima di rilasciare l’handle. Il confronto rigoroso distingue un errore di trasporto da corpi riusciti come una stringa vuota o “0”. Gli stati di errore HTTP non sono automaticamente errori di curl_exec, quindi interpreta anche lo stato.
Il contatore dei dati scaricati esclude le intestazioni. Il valore dichiarato proviene da Content-Length ed è -1 quando la dimensione è sconosciuta. Una risposta può omettere legittimamente Content-Length; un valore sconosciuto non è una diagnosi di file troncato.
La decodifica automatica del contenuto introduce un’altra distinzione. Content-Length descrive di solito la rappresentazione compressa, mentre la stringa PHP può contenere byte decompressi. Confrontare strlen($body) con quell’intestazione significa quindi confrontare rappresentazioni diverse.
cURL può segnalare CURLE_PARTIAL_FILE quando il trasferimento viola una dimensione attesa. Conserva quell’errore invece di trattare qualsiasi output non vuoto come successo. Al contrario, un trasferimento riuscito con una piccola risposta 200 può essere l’intera pagina che l’origine o il proxy hanno scelto di restituire.
Infine controlla il contenuto richiesto. L’HTML recuperato da cURL non esegue JavaScript per popolare la pagina. Le sezioni mostrate dal browser possono mancare nella risposta originale anche se ogni byte trasmesso è arrivato.