6

基本認証を使用して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で公開されているので、これはもはや問題ではないはずです。

4

4 に答える 4

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 の問題を修正する必要があります。

于 2012-02-22T05:13:20.953 に答える
1

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

于 2012-03-05T21:45:04.530 に答える
0

https://github.com/brianmario/yajl-rubyを使用すると、これをうまく解決できるようです。

于 2012-02-21T22:21:34.773 に答える
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

接続が切断されたときに再接続し、さまざまな種類の障害を適切に処理するものが欲しいのですが。

于 2012-02-26T17:55:09.037 に答える