をハングアップします。私はこのように感じるかなり些細でなければなりませんので、私は私が私の明白な間違いを指摘することができるよりも賢くているいくつかのrubyistを願っています。ここでEM-HTTPベーシック認証とgzipを持つストリームは、私は基本的な認証とJSONのHTTPSストリームに接続するために私を必要とGnip PowerTrackのAPIを消費しようとしてる
は私のルビー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のダッシュボードが接続をrepors)が、その後、単にバッファリングし、決して何かを出力します。実際には、s.stream do..
ブロックに入ることはないようです。これはGZipでエンコードされたストリームです。
これが動作することに注意してください:
curl --compressed -uusername $GNIP_STREAMING_URL
編集:私は、これはちょっと暗黙的であると確信しているが、私は任意のログインcredsをまたは実際のURLを与えることができないので、聞かないでください。)
編集#2:yajl-rubyは、URLの資格情報をエンコードする方法を理解できればおそらく動作します(単純なURLエンコーディングはGnipで認証に失敗すると動作しないようです)。
EDIT#3:@rwealdはEM-HTTPストリーミングGZIPをサポートしていないことが判明し、私はここでGitHubの問題を作成しました。
EDIT#4:em-http-requestでこれをフォークして修正しました。この方法でem-httpを使用する場合は、my forkを指すことができます。パッチはメンテナのレポに統合され、次のリリースで動作します。
EDIT#5:私の修正は、EM-HTTP要求1.0.3に掲載されているので、これはもはや問題ではないはずです。
ニースが見つかりました!おそらくem-http宝石を修正するかもしれません。そうでない場合、yajl-rubyまたはcurbを使用して接続を維持し、指数バックオフパターンで再接続する方法がありますか? –
昨日、実際にGNIPからgzip jsonをストリーミングできる回避策が見つかりました。私は今、コードをクリーンアップに取り組んでいて、あなたは私のgithubプロジェクトでそれを見ることができるでしょうhttps://github.com/rweald/gnip-stream – rweald
私はそれがそうするように修正を一般化できるはずだと思いますem-http-requestへのパッチとして追加することができます。私は週末に見ていきます。 – rweald