1

我正在使用 URLOpenPullStream 以及 IBindStatusCallback 和 IHttpNegotiate 回调来处理协商、状态和数据消息。我遇到的问题是内容是 gzip(例如 Content-Encoding: gzip)。我通过 OnDataAvailable 接收的数据是压缩的。我需要未压缩的数据。我正在使用 BINDF_PULLDATA | BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE 绑定标志。我读过一些帖子说它应该支持 gzip 格式。

我最初尝试更改 Accept-Encoding 请求标头以指定我不想要 gzip 但没有成功。我可以在BeginningTransaction 中更改或添加标头,但无法更改Accept-Content。我能够更改 User-Agent,并且能够添加新的标头,因此该过程有效,但由于某种原因它不会覆盖 Accept-Content。

其他选择是自己解压缩数据。在使用 C++ gzip 库的快速测试中,我能够解压缩内容。所以,这可能是一种选择。如果这是我需要做的,那么检测它的最佳方法是 gzip。我注意到我收到了一个带有 BINDSTATUS_MIMETYPEAVAILABLE 的 OnProgress 事件,并且文本设置为“application/x-gzip-compressed”。这是我应该如何检测它吗?

寻找任何解决方案来解决这个问题!我确实想继续使用 URLOpenPullStream。这是一个已发布的产品,希望将更改保持在最低限度。

4

1 回答 1

1

经过更多研究,我将回答我自己的问题。似乎我遇到问题的网站正在返回不正确的内容,其中 IE、FF 和 URLOpenPullStream 无法将其识别为有效的 gzip 内容。标题似乎很好,例如


  HTTP/1.1 200 OK
  Content-Type: text/html; charset=iso-8859-1
  Content-Encoding: none
  Server: Microsoft-IIS/6.0
  MSNSERVER: H: COL102-W41 V: 15.4.317.921 D: 2010-09-21T20:29:43
  Vary: Accept-Encoding
  Content-Encoding: gzip
  Content-Length: 4258
  Date: Wed, 27 Oct 2010 20:48:15 GMT
  Connection: keep-alive
  Set-Cookie: xidseq=4; domain=.live.com; path=/
  Set-Cookie: LD=; domain=.live.com; expires=Wed, 27-Oct-2010 19:08:15 GMT;   path=/
  Cache-Control: no-cache, no-store
  Pragma: no-cache
  Expires: -1
  Expires: -1

但是 URLOpenPullStream 只是以原始压缩格式下载的,如果您尝试访问该站点,IE 会报告错误,并且 FF 显示垃圾。

在对返回有效 gzip 内容的站点(例如 www.webcompression.org)进行测试后,IE、FF 和 URLOpenPullStream 工作正常。因此,看来 URLOpenPullStream 确实支持 gzip 内容。在这种情况下,它是透明的。在 OnDataAvailable 中,我收到了未压缩的数据,而在 OnResponse 中,标头没有将 Content-Encoding 显示为 gzip。

不幸的是,这仍然没有解决我的问题。我通过检查 OnResponse 事件中的响应标头来解决。如果 Content-Encoding 是 gzip,那么我设置一个标志,下载完成后,使用 zlib gzip 例程解压缩内容。这似乎工作正常。这对于我的罕见情况应该没问题,因为通常我不应该在 OnResponse 标头中收到 Content-Encoding : gzip,因为 URLOpenPullStream 透明地处理解压缩。

不知道 :)

于 2010-10-31T19:45:54.277 回答