我正在尝试使用Gnip,它要求我使用基本身份验证连接到PowerTrack的HTTPS流。我觉得这应该是相当微不足道的,所以我希望一些比我聪明的rubyist开发者能指出我明显的错误。
下面是我的ruby 1.9.3代码的相关部分:
require 'eventmachine'
require 'em-http'
require 'json'
usage = "#{$0} <user> <password>"
abort usage unless user = ARGV.shift
abort usage unless password = ARGV.shift
GNIP_STREAMING_URL = 'https://stream.gnip.com:443/foo/bar/prod.json'
http = EM::HttpRequest.new(GNIP_STREAMING_URL)
EventMachine.run do
s = http.get(:head => { 'Authorization' => [user, password], 'accept' => 'application/json', 'Accept-Encoding' => 'gzip,deflate' }, :keepalive => true, :connect_timeout => 0, :inactivity_timeout => 0)
buffer = ""
s.stream do |chunk|
buffer << chunk
while line = buffer.slice!(/.+\r?\n/)
puts JSON.parse(line)
end
end
end流是连接的(我的Gnip仪表板报告了一个连接),但随后只是缓冲,从不输出任何内容。事实上,它似乎从未进入过s.stream do..块。请注意,这是一个GZip编码流。
请注意,这是可行的:
curl --compressed -uusername $GNIP_STREAMING_URL编辑:我相信这是隐含的,但我不能给出任何登录凭证或实际的URL,所以不要问;)
编辑#2:如果我知道如何对URL的凭证进行编码,yajl-ruby可能会起作用(简单的URL编码似乎不起作用,因为我无法使用Gnip进行身份验证)。
编辑#3:@rweald发现em-http不支持流式gzip,我在这里创建了一个GitHub问题。
编辑#4:我已经在em-http-request中分支并修复了这个问题,如果你想以这种方式使用em-http,你可以指向my fork。该补丁已经被合并到维护者的repo中,并将在下一个版本中工作。
编辑#5:我的修复已经发布在em-http-request 1.0.3中,所以这应该不再是问题。
发布于 2012-02-22 13:13:21
问题出在em-http-request中。如果你看看https://github.com/igrigorik/em-http-request/blob/master/lib/em-http/decoders.rb
您将注意到GZIP解压程序不能进行流解压缩:( https://github.com/igrigorik/em-http-request/blob/master/lib/em-http/decoders.rb#L100
如果您希望能够使用em-http-request读取流,则需要修复底层的流gzip问题
发布于 2012-03-06 05:45:05
我一直在使用这个Gist中的一些代码库来连接Gnip控制台。https://gist.github.com/1468622
发布于 2012-02-22 06:21:35
看起来使用https://github.com/brianmario/yajl-ruby可以很好地解决这个问题
https://stackoverflow.com/questions/9346848
复制相似问题