2010-10-14 29 views
11

InputStream loại nên được sử dụng để xử lý dòng URLConnection đã HTTP ContentEncoding thiết lập để deflate?Xử lý HTTP ContentEncoding "deflate"

Để mã hóa nội dung của gzip hoặc zip Tôi sử dụng GZIPInputStream, không có vấn đề gì.

Đối với một Content-Encoding của "deflate" Tôi đã cố gắng sử dụng InflaterInputStreamDeflaterInputStream nhưng tôi nhận

java.util.zip.ZipException: unknown phương pháp nén tại java.util .zip.InflaterInputStream.read (InflaterInputStream.java:147)

Hiểu biết của tôi là mã hóa "deflate" đề cập đến Zlib nén và theo docs điều này sẽ được xử lý bởi InflaterInputStream.

Trả lời

22

Trong HTTP/1.1, Content-encoding: deflate thực sự đề cập đến các thuật toán nén Deflate, theo định nghĩa của RFC 1951, bọc trong các định dạng dữ liệu zlib, theo định nghĩa của RFC 1950.

Tuy nhiên một số nhà cung cấp chỉ thực hiện thuật toán DEFLATE như được định nghĩa RFC 1951, hoàn toàn bỏ qua RFC 1950 (không có tiêu đề zlib).

Những người khác đã bị ảnh hưởng bởi vấn đề tương tự:

Để làm việc xung quanh này, cố gắng nhanh chóng InflaterInputStream đi qua một Inflater đã được tạo ra với các Thông số nowrap được đặt thành true:

in = new InflaterInputStream(conn.getInputStream()), new Inflater(true)); 
+0

Cả RFC dường như tham khảo Zlib, nhưng tôi đoán các phiên bản khác nhau? – Joel

+0

"6.2.2.2 Định nghĩa mã hóa Định dạng" giảm kích thước "được định nghĩa là cơ chế nén" giảm tốc "(được mô tả trong [RFC1951]) được sử dụng bên trong định dạng dữ liệu" zlib "([RFC1950]) Lưu ý: Không chính xác triển khai gửi dữ liệu nén "deflate" mà không có trình bao bọc zlib. " - http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p1-messaging-11.html#rfc.section.6.2.2.2 –

+0

Đề xuất của bạn để vượt qua Inflater đã hoạt động! Cảm ơn. – Joel

Các vấn đề liên quan