处理HTTP ContentEncoding"deflate"

Joe*_*oel 12 java http content-encoding http-compression

应该使用什么InputStream类型来处理将HTTP Content-Encoding设置为deflate的 URLConnection流?

对于gzip或zip的Content-Encoding,我使用GZIPInputStream,没问题.

对于"deflate"的Content-Encoding,我尝试过使用InflaterInputStreamDeflaterInputStream,但是我得到了

java.util.zip.ZipException:java.util.zip.InflaterInputStream.read中的未知压缩方法(InflaterInputStream.java:147)

我的理解是"deflate"编码是指Zlib压缩,根据文档,这应该由InflaterInputStream处理.

Gro*_*uez 22

在HTTP/1.1,Content-encoding: deflate实际上指的是DEFLATE压缩算法,如通过定义RFC 1951,包裹在ZLIB数据格式,通过限定RFC 1950.

然而,一些供应商只是实现了RFC 1951定义的DEFLATE算法,完全忽略了RFC 1950(没有zlib头文件).

其他人也遇到了同样的问题:

为了解决这个问题,尝试实例化使用参数设置创建的InflaterInputStream传递:Inflaternowraptrue

in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
Run Code Online (Sandbox Code Playgroud)

  • RFC是如何编写令人困惑,误导性技术文档的绝佳示例. (3认同)
  • "6.2.2.2 Deflate 编码 "deflate" 格式被定义为在 "zlib" 数据格式 ([RFC1950]) 中使用的 "deflate" 压缩机制(在 [RFC1951] 中描述)。注意:一些不正确的实现会发送 "deflate" " 没有 zlib 包装器的压缩数据。" -- http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p1-messaging-11.html#rfc.section.6.2.2.2 (2认同)