Tải xuống Java qua proxy khi getContentLengthLong trả về -1
Xử lý Content-Length không xác định trong tải xuống Java qua proxy mà không coi metadata kích thước bị thiếu là phản hồi rỗng.
getContentLengthLong() == -1 nghĩa là không có độ dài nội dung đã biết trong metadata hiện có. Tiếp tục đọc luồng và hiển thị số byte đã nhận hoặc tiến trình không xác định; đừng coi đó là phản hồi rỗng và đừng cấp phát bộ đệm có kích thước âm.
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;
}
}
Kết nối đã được cấu hình và output thuộc về bên gọi. Giữ thời gian chờ kết nối và đọc cùng mọi giới hạn kích thước của ứng dụng quanh vòng lặp này. Lỗi I/O là tải xuống thất bại, không phải hoàn tất thành công với ít byte hơn.
So sánh độ dài ở cùng một lớp. Mã hóa chunked của HTTP/1.1 có thể thay thế Content-Length và được quá trình triển khai HTTP giải mã. Proxy có thể đóng khung lại. Giải nén cũng có thể làm số byte đã giải mã của ứng dụng khác với Content-Length đã mã hóa.
Nếu cả Transfer-Encoding và Content-Length cùng xuất hiện, đừng chọn một con số thuận tiện: đóng khung HTTP ưu tiên mã hóa truyền tải và coi sự kết hợp đó là lỗi có thể xảy ra. Hãy để việc phân tích đó cho một triển khai tuân thủ.
URL FTP qua cổng HTTP cần kiểm tra hành vi URLConnection cụ thể; nó không bảo đảm mọi trình truy cập tiêu đề HTTP đều hành xử như trên URL HTTP thông thường trong mọi JDK. Dùng API độ dài có giá trị long ở nơi metadata quan trọng, và xác thực thành phẩm đã hoàn tất theo độ dài hoặc checksum thực sự cần thiết. Đọc phần thân không làm xuất hiện tiêu đề trước đây không có.