具有基本身份验证和gzip挂起的em-http流

Eri*_*lin 6 ruby basic-authentication eventmachine http-streaming gnip

我正在尝试使用Gnip PowerTrack API,它要求我使用基本身份验证连接到JSON的HTTPS流.我觉得这应该是相当微不足道的,所以我希望一个比我更聪明的红宝石能指出我明显的错误.

这是我的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
Run Code Online (Sandbox Code Playgroud)

流连接(My Gnip仪表板重新连接),但只是缓冲区,从不输出任何内容.事实上,似乎它永远不会进入s.stream do..障碍.请注意,这是一个GZip编码流.

请注意,这有效:

curl --compressed -uusername $GNIP_STREAMING_URL
Run Code Online (Sandbox Code Playgroud)

编辑:我确定这有点隐含,但我不能发出任何登录信用或实际的URL,所以不要问;)

编辑#2:yajl-ruby可能会起作用,如果我能弄清楚如何编码URL的凭证(简单的URL编码似乎不起作用,因为我使用Gnip验证失败).

编辑#3:@rweald发现em-http不支持流式gzip,我在这里创建了一个GitHub问题.

编辑#4:我已经在em-http-request中进行了分叉和修复,如果你想以这种方式使用em-http ,你可以指向我的分支.该补丁已合并到维护者的回购中,并将在下一版本中运行.

编辑#5:我的修补程序已在em-http-request 1.0.3中发布,因此这应该不再是一个问题.

小智 2

问题出在 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 问题