基本認証を使用してJSONのHTTPSストリームに接続する必要があるGnipPowerTrackAPIを使用しようとしています。これはかなり些細なことだと思うので、私より賢いルビイストが私の明らかな間違いを指摘できることを望んでいます。
これが私のルビー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
ストリームは接続しますが(My Gnipダッシュボードは接続を応答します)、バッファリングするだけで、何も出力しません。実際、それは決してs.stream do..
ブロックに入らないようです。これはGZipでエンコードされたストリームであることに注意してください。
これが機能することに注意してください。
curl --compressed -uusername $GNIP_STREAMING_URL
編集:これはちょっと暗黙的だと思いますが、ログイン資格や実際のURLを提供することはできないので、尋ねないでください;)
編集#2:URLのクレデンシャルをエンコードする方法を理解できれば、yajl-rubyはおそらく機能します(Gnipでの認証に失敗したため、単純なURLエンコードは機能しないようです)。
編集#3:@rwealdは、em-httpがストリーミングgzipをサポートしていないことを発見しました。ここで、GitHubの問題を作成しました。
編集#4:私はこれをem-http-requestでフォークして修正しました。このようにem-httpを使用したい場合は、私のフォークを指すことができます。パッチはメンテナのリポジトリにマージされており、次のリリースで機能する予定です。
編集#5:私の修正はem-http-request 1.0.3で公開されているので、これはもはや問題ではないはずです。