2012-02-09 76 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