URLOpenPullStream和gzip内容下载 - 需要未压缩的数据

时间:2010-10-27 22:03:49

标签: c++ url download gzip urlmon

我正在使用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。这是一个已经发布并希望将更改保持在最低限度的产品。

1 个答案:

答案 0 :(得分: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中,头文件没有将内容编码显示为gzip。

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

Dunno:)