【问题标题】:Handling HTTP ContentEncoding "deflate"处理 HTTP ContentEncoding “deflate”
【发布时间】:2011-04-25 07:56:45
【问题描述】:

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

对于 gzip 或 zip 的内容编码,我使用 GZIPInputStream,没问题。

对于“deflate”的内容编码,我尝试使用 InflaterInputStreamDeflaterInputStream 但我得到了

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

我的理解是“deflate”编码是指Zlib压缩,根据docs这应该由InflaterInputStream处理。

【问题讨论】:

  • 天哪,我遇到了同样的情况。原始 deflate 没有一个标题,所以没有办法知道它是什么。我以为我的代码不正确,检查检查检查......该死的。在此之后,我建议使用存档管理器来支持解码原始 deflate 数据,这样我就可以尝试使用存档管理器打开它,我会知道“哦!我的代码很好!这就是 deflate!”。

标签: java http http-compression content-encoding


【解决方案1】:

在 HTTP/1.1 中,Content-encoding: deflate 实际上是指 DEFLATE 压缩算法,由RFC 1951 定义,包装在 zlib 数据格式中,由RFC 1950 定义。

然而,一些供应商只是按照 RFC 1951 的定义实现了 DEFLATE 算法,完全忽略了 RFC 1950(无 zlib 标头)。

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

为了解决这个问题,请尝试实例化 InflaterInputStream,并传递一个 Inflater,该 nowrap 参数设置为 true

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

【讨论】:

  • 两个 RFC 似乎都引用了 Zlib,但我猜是不同的版本?
  • "6.2.2.2 Deflate 编码 "deflate" 格式被定义为在 "zlib" 数据格式 ([RFC1950]) 中使用的 "deflate" 压缩机制(在 [RFC1951] 中描述)。注意:一些不正确的实现在没有 zlib 包装器的情况下发送“deflate”压缩数据。” -- greenbytes.de/tech/webdav/…
  • RFC 是如何编写令人困惑、具有误导性的技术文档的绝佳示例。
【解决方案2】:

不幸的是,将 InflaterInputStream 与 Inflater 对象一起使用并不总能产生正确的解压缩。我必须检测标头并告诉 Inflater 有效载荷的偏移量在哪里。

http://thushw.blogspot.com/2014/05/decoding-html-pages-with-content.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2021-10-10
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多