Prenosi Java prek proxyja, ko getContentLengthLong vrne -1
Obvladujte neznan Content-Length pri prenosu Java prek proxyja, ne da bi manjkajoče metapodatke o velikosti obravnavali kot prazen odgovor.
getContentLengthLong() == -1 pomeni, da v razpoložljivih metapodatkih ni znane dolžine vsebine. Nadaljujte z branjem toka in prikazujte prejete bajte ali nedoločen napredek; ne obravnavajte tega kot prazen odgovor in ne dodelite medpomnilnika z negativno velikostjo.
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;
}
}
Povezava je že konfigurirana in output pripada klicatelju. Ohranite časovne omejitve povezave in branja ter morebitno omejitev velikosti aplikacije okoli te zanke. Vhodno-izhodna napaka je neuspešen prenos, ne uspešen zaključek z manj bajti.
Primerjajte dolžine na isti ravni. Chunked kodiranje HTTP/1.1 lahko nadomesti Content-Length in ga dekodira izvedba HTTP. Proxy ga lahko ponovno uokviri. Tudi razširjanje lahko povzroči, da se dekodirano število bajtov aplikacije razlikuje od kodirane Content-Length.
Če se pojavita Transfer-Encoding in Content-Length hkrati, ne izberite priročnega števila: uokvirjanje HTTP daje prednost prenosnemu kodiranju in kombinacijo obravnava kot možno napako. To razčlenjevanje prepustite skladni izvedbi.
URL FTP prek prehoda HTTP zahteva preverjanje konkretnega vedenja URLConnection; ne zagotavlja, da se vsak dostop do glave HTTP obnaša kot pri običajnem URL HTTP v vsakem JDK. Kjer so metapodatki pomembni, uporabite length API z dolgo vrednostjo, in preverite dokončani artefakt glede na dejansko zahtevano dolžino ali kontrolno vsoto. Branje telesa ne povzroči, da bi se prej manjkajoča glava pojavila.