Se un presunto PDF o foglio di calcolo inizia con HTTP/1.1 200 OK, il downloader ha salvato una risposta grezza invece del file. Questa risposta schematica contiene solo quattro byte di contenuto:

HTTP/1.1 200 OK
Transfer-Encoding: chunked

4
DATA
0

Il file è DATA. La riga di stato, le intestazioni, il marcatore di dimensione e la struttura di terminazione appartengono a HTTP. Rimuovere un numero fisso di byte non è sicuro perché le lunghezze delle intestazioni variano. Copiare tutto ciò che segue la prima riga vuota lascia comunque l'inquadratura a blocchi, e le risposte informative possono precedere la risposta finale.

Per un download normale, sostituite la copia da socket grezzo a file con l'interfaccia del corpo della risposta del client HTTP. Configurate il suo proxy, validate lo stato finale e trasmettete il corpo a un output temporaneo. Il client gestisce l'inquadratura del messaggio: i corpi delimitati da lunghezza, a blocchi e da connessione richiedono un'analisi diversa.

La codifica del contenuto è un ulteriore livello. Decidete se vi servono i byte decodificati del file o un contenuto grezzo richiesto esplicitamente, in base al comportamento documentato del client. I byte compressi non sono automaticamente una corruzione del proxy.

Se l'applicazione deve conservare codice a livello di socket, possiede tutte quelle regole di analisi oltre alla gestione di lettura e scrittura. Scrivete solo il numero di byte effettivamente restituiti da una lettura, non la capacità del buffer, e gestite le scritture parziali. Altrimenti un contenuto di buffer obsoleto può corrompere anche un corpo estratto correttamente.

HTTPS richiede più che rimuovere una risposta CONNECT: dopo la corretta configurazione del tunnel, stabilite TLS verso la destinazione e poi analizzate la risposta HTTP interna. I byte cifrati che seguono le intestazioni del proxy non sono il file scaricabile.

Lasciate l'output fallito o incompleto sotto un nome temporaneo. Pubblicatelo solo dopo che il trasferimento e i controlli sul file sono riusciti; un file non vuoto non dimostra un download completo.

Articoli correlati