Java-lataukset välityspalvelimen kautta, kun getContentLengthLong palauttaa -1
Käsittele tuntematon Content-Length Java-latauksessa välityspalvelimen kautta pitämättä puuttuvia kokotietoja tyhjänä vastauksena.
getContentLengthLong() == -1 tarkoittaa, että käytettävissä olevissa metatiedoissa ei ole tunnettua sisällön pituutta. Jatka virran lukemista ja näytä vastaanotetut tavut tai määrittelemätön edistyminen; älä pidä sitä tyhjänä vastauksena äläkä varaa negatiivisen kokoista puskuria.
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;
}
}
Yhteys on jo määritetty ja output kuuluu kutsujalle. Säilytä yhteys- ja lukuaikakatkaisut sekä mahdollinen sovelluksen kokoraja tämän silmukan ympärillä. I/O-virhe on epäonnistunut lataus, ei onnistunut suoritus pienemmällä tavumäärällä.
Vertaa pituuksia samalla kerroksella. HTTP/1.1:n chunked-koodaus voi korvata Content-Lengthin, ja HTTP-toteutus purkaa sen. Välityspalvelin voi kehystää sen uudelleen. Myös purkaminen voi saada sovelluksen puretun tavumäärän poikkeamaan koodatusta Content-Lengthistä.
Jos sekä Transfer-Encoding että Content-Length esiintyvät, älä valitse sopivaa lukua: HTTP-kehystys antaa siirtokoodaukselle etusijan ja pitää yhdistelmää mahdollisena virheenä. Jätä tämä jäsennys yhdenmukaiselle toteutukselle.
FTP-URL HTTP-yhdyskäytävän kautta vaatii sen konkreettisen URLConnection-käyttäytymisen tarkistamisen; se ei takaa, että jokainen HTTP-otsakkeen lukija käyttäytyy kuin tavallisessa HTTP-URL:ssa jokaisessa JDK:ssa. Käytä pitkäarvoista length-APIa siellä, missä metatiedot merkitsevät, ja validoi valmis artefakti todella vaadittua pituutta tai tarkistussummaa vastaan. Rungon lukeminen ei saa aiemmin puuttunutta otsaketta ilmestymään.