getContentLengthLong() == -1 berarti tidak ada panjang konten yang diketahui dalam metadata yang tersedia. Terus baca aliran dan tampilkan byte yang diterima atau kemajuan tak tentu; jangan menganggapnya respons kosong dan jangan mengalokasikan buffer berukuran negatif.

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

Koneksi sudah dikonfigurasi dan output dimiliki pemanggil. Pertahankan batas waktu koneksi dan baca serta batas ukuran aplikasi apa pun di sekitar perulangan ini. Kesalahan I/O adalah unduhan yang gagal, bukan penyelesaian berhasil dengan byte lebih sedikit.

Bandingkan panjang pada lapisan yang sama. Pengodean chunked HTTP/1.1 dapat menggantikan Content-Length dan didekode oleh implementasi HTTP. Proxy dapat membingkainya ulang. Dekompresi juga dapat membuat jumlah byte terdekode aplikasi berbeda dari Content-Length yang dikodekan.

Jika Transfer-Encoding dan Content-Length muncul bersamaan, jangan memilih angka yang nyaman: framing HTTP mengutamakan pengodean transfer dan menganggap kombinasi itu kemungkinan kesalahan. Serahkan penguraian itu kepada implementasi yang patuh.

URL FTP melalui gateway HTTP memerlukan pemeriksaan perilaku URLConnection konkretnya; itu tidak menjamin setiap pengakses header HTTP berperilaku seperti pada URL HTTP biasa di setiap JDK. Gunakan API panjang bernilai long di tempat metadata penting, dan validasi artefak yang selesai terhadap panjang atau checksum yang benar-benar diperlukan. Membaca body tidak membuat header yang sebelumnya tidak ada menjadi muncul.

Artikel terkait