getContentLengthLong() == -1 reiškia, kad turimuose metaduomenyse nėra žinomo turinio ilgio. Tęskite srauto skaitymą ir rodykite gautus baitus arba neapibrėžtą eigą; nelaikykite to tuščiu atsakymu ir neskirkite neigiamo dydžio buferio.

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;
    }
}

Ryšys jau sukonfigūruotas, o output priklauso iškvietėjui. Išlaikykite ryšio ir skaitymo skirtąsias trukmes bei bet kokį programos dydžio apribojimą aplink šią kilpą. I/O klaida yra nepavykęs atsisiuntimas, o ne sėkmingas užbaigimas su mažiau baitų.

Palyginkite ilgius tame pačiame sluoksnyje. HTTP/1.1 chunked kodavimas gali pakeisti Content-Length, o jį iškoduoja HTTP realizacija. Proxy gali jį perrėminti. Dekompresija taip pat gali lemti, kad programos iškoduotų baitų skaičius skirtųsi nuo užkoduoto Content-Length.

Jei pasirodo ir Transfer-Encoding, ir Content-Length, nesirinkite patogaus skaičiaus: HTTP rėminimas teikia pirmenybę perdavimo kodavimui ir derinį laiko galima klaida. Palikite tą analizę atitinkančiai realizacijai.

FTP URL per HTTP tarpinę reikalauja patikrinti konkretų URLConnection elgesį; ji negarantuoja, kad kiekviena HTTP antraštės prieiga elgsis kaip įprastame HTTP URL bet kurioje JDK. Kur metaduomenys svarbūs, naudokite ilgos reikšmės length API, ir patikrinkite baigtą artefaktą pagal faktiškai reikalingą ilgį arba kontrolinę sumą. Korpuso skaitymas nepadaro anksčiau buvusios antraštės matomos.

Susiję straipsniai