Quando il file scaricato inizia con una riga di stato HTTP
Tenete l'inquadratura della risposta HTTP fuori dal file scaricato invece di copiare ogni byte ricevuto da un socket proxy nel file di output.
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.