2012-02-09 136 views
2

我需要帮助解压来自api的块数据。我连接到Gnip流api,它使用gzip压缩来返回json输出。当我尝试解压缩输出数据时,它会引发以下错误“Zlib :: DataError:不正确的标题检查”。Zlib解压缩抛出头错误 - Ruby

这可能是非常接近这个问题 - http://groups.google.com/group/nodejs/browse_thread/thread/32b9ee7f691a68d9

在这里,我附上我的代码片段供大家参考:

require 'rubygems' 
require 'curl' 
require 'stringio' 
require 'zlib' 
url = "https://stream.gnip.com:443/accounts/SomeGroup/publishers/twitter/streams/track/Prod.json" 
crl = Curl::Easy.new(url) 
crl.headers={"Authorization"=>"Basic dmVlcmFzd5kYXJhdmVsLRoaX1Z25hbmFzd5kYhbU4ZXJeC5b26GpbFnW0MzIy", "Accept-Encoding" => "deflate, gzip"} 
zstream = Zlib::Inflate.new 
crl.on_body { |data| zstream.inflate(data);} 
crl.http_get 

上面的代码总是返回“的Zlib :: DataError:不正确头检查” 。我知道gnip按块返回数据块,因此所需的gzip输出不会在第一个块中。 那么我怎样才能收集所有需要的gzip输出块并解压缩才能得到所需的单个json输出。

在此先感谢。 Veeraa。

回答

3

默认情况下,zlib正在查找zlib标头,而不是gzip标头。所以gzip头文件会导致错误的头文件检查。我不知道zlib的Ruby接口是什么样的,但你应该看看你是否可以指定要膨胀的流的类型。 zlib的膨胀支持zlib,gzip和raw deflate流。它还可以选择提供zlib和gzip流的自动检测。

+0

它看起来像'Zlib :: Inflate.new'的'window_bits'参数直接传递给zlib,因此它与zlib中的'windowBits'具有完全相同的含义。所以我会尝试31(最大窗口大小和gzip)或47(自动检测最大窗口大小)的值。 – L2G 2014-03-07 00:54:01