6

をハングアップします。私はこのように感じるかなり些細でなければなりませんので、私は私が私の明白な間違いを指摘することができるよりも賢くているいくつかの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に掲載されているので、これはもはや問題ではないはずです。

答えて

2

問題はEM-HTTP要求内にある解決するhttps://github.com/brianmario/yajl-rubyを使用してのように見えます。あなたは 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

をストリーミングすることができませんあなたはストリームを読み取ることができると思った場合は、基礎となるストリーミングgzipで問題を解決する必要があるだろうことがわかりますEM-HTTP要求

+0

ニースが見つかりました!おそらくem-http宝石を修正するかもしれません。そうでない場合、yajl-rubyまたはcurbを使用して接続を維持し、指数バックオフパターンで再接続する方法がありますか? –

+0

昨日、実際にGNIPからgzip jsonをストリーミングできる回避策が見つかりました。私は今、コードをクリーンアップに取り組んでいて、あなたは私のgithubプロジェクトでそれを見ることができるでしょうhttps://github.com/rweald/gnip-stream – rweald

+0

私はそれがそうするように修正を一般化できるはずだと思いますem-http-requestへのパッチとして追加することができます。私は週末に見ていきます。 – rweald

0

が、これがうまく

+0

私はこのエラーが発生しないようにユーザー名とパスワードをエンコードする方法を理解できません: "lib/ruby​​/1.9.1/uri/generic.rb:411 :「check_user 'で:悪いコンポーネント(コンポーネントまたはユーザー・コンポーネントのUserInfo予想)」 –

+1

これは実際には文句を言わないのいずれかを助けます。 http_requestのyajl-rubyコードを見ると、応答がGNIP応答である "Chunked"でない場合にのみgzipがサポートされていることがわかります。 https://github.com/brianmario/yajl-ruby/blob/master/lib/yajl/http_stream.rb#L160 – rweald

0

を使用してGnipは、私がcurb使用を示唆し、ここで私は彼らの例から思い付いたものです:

require 'rubygems' 
require 'curb' 

# Usage: <script> username password url 
# prints data to stdout. 
usage = "#{$0} <user> <password> <url>" 
username, password, url = ARGV.first 3 

Curl::Easy.http_get url do |c| 
    c.http_auth_types = :basic 
    c.username = username 
    c.password = password 
    c.encoding = 'gzip' 
    c.on_body do |data| 
    puts data 
    data.size # required by curl's api. 
    end 
end 

接続が切断されたときに再接続し、さまざまなタイプの障害を正常に処理するものが欲しいですが。

1

私はGnipコンソールに接続するためにこのGistのコードベースを使用しています。 https://gist.github.com/1468622

+0

ありがとう!私は早くそれを見つけたが、あまりにも多くの時間を節約しただろうが、私は今gnip-stream gemにパッチを当てることができるかもしれません:) –

関連する問題