处理HTTP内容编码“deflate”

15

在处理HTTP Content-Encoding设置为deflate的URLConnection流时,应该使用哪种InputStream类型?

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

对于Content-Encoding为"deflate",我尝试使用InflaterInputStreamDeflaterInputStream,但是出现了以下错误:

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

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


天啊,我遇到了同样的情况。原始压缩没有一个头文件,所以无法知道它是什么。我以为我的代码有问题,一遍又一遍地检查...该死。在此之后,我建议我使用的存档管理器支持解码原始压缩数据,这样我就可以尝试用存档管理器打开它,然后我就会知道:“哦!我的代码没问题!这是deflate!” - user26742873
2个回答

24

在HTTP/1.1中,Content-encoding: deflate实际上是指DEFLATE压缩算法,由RFC 1951定义,并采用RFC 1950规定的zlib数据格式进行封装。

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

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

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

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

这两个RFC都似乎提到了Zlib,但我猜可能是不同的版本? - Joel
2
6.2.2.2 压缩编码“deflate”格式被定义为“zlib”数据格式([RFC1950])中使用的“deflate”压缩机制([RFC1951]中描述)。注意:一些不正确的实现会发送没有zlib包装器的“deflate”压缩数据。-- http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p1-messaging-11.html#rfc.section.6.2.2.2 - Julian Reschke
5
RFCs提供了如何编写混乱、误导的技术文档的绝佳范例。 - Muxecoid

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接