Java preuzimanja preko proxyja kada getContentLengthLong vrati -1
Rukujte nepoznatim Content-Length u Java preuzimanju preko proxyja bez tretiranja nedostajućih metapodataka o veličini kao praznog odgovora.
getContentLengthLong() == -1 znači da u dostupnim metapodacima nema poznate dužine sadržaja. Nastavite čitati tok i prikazujte primljene bajtove ili neodređeni napredak; ne tretirajte to kao prazan odgovor i ne dodeljujte bafer negativne veličine.
long expected = connection.getContentLengthLong();
long received = 0;
byte[] buffer = new byte[8192];
try (InputStream input = connection.getInputStream()) {
int count;
while ((count = input.read(buffer)) != -1) {
output.write(buffer, 0, count);
received += count;
}
}
Veza je već konfigurisana, a output poseduje pozivalac. Zadržite tajmaute veze i čitanja te bilo koje ograničenje veličine aplikacije oko ove petlje. I/O greška je neuspelo preuzimanje, a ne uspešan završetak sa manje bajtova.
Upoređujte dužine na istom sloju. HTTP/1.1 chunked kodiranje može zameniti Content-Length i dekodira ga HTTP implementacija. Proxy ga može ponovo uokviriti. Dekompresija takođe može učiniti da se dekodirani broj bajtova aplikacije razlikuje od kodiranog Content-Length.
Ako se pojave i Transfer-Encoding i Content-Length, nemojte birati zgodan broj: HTTP uokvirivanje daje prednost prenosnom kodiranju i tretira kombinaciju kao moguću grešku. Prepustite to parsiranje usklađenoj implementaciji.
FTP URL kroz HTTP gejtvej zahteva proveru konkretnog ponašanja URLConnection; ne garantuje da se svaki pristup HTTP zaglavlju ponaša kao na običnom HTTP URL-u u svakom JDK-u. Koristite length API sa dugom vrednošću gde su metapodaci važni i validirajte završeni artefakt prema stvarno potrebnoj dužini ili kontrolnoj sumi. Čitanje tela ne čini ranije odsutno zaglavlje vidljivim.