2012-02-19 15 views
6

Temel auth ile bir HTTPS JSON akışına bağlanmamı gerektiren Gnip PowerTrack API'sini tüketmeye çalışıyorum. Bunun oldukça önemsiz hissettirilmesini istiyorum, bu yüzden benden daha akıllı olan bazı rubyistlerin benim bariz hatama işaret edebileceğini umuyorum.em-http akışı

İşte ilgili kısımları benim yakut 1.9.3 kod: o zaman

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 

akışı bağlandığı (My Gnip pano bağlantı repors) ama sadece tamponlar ve bir şey çıkarır asla. Aslında, hiç s.stream do.. bloğuna girmemiş gibi görünüyor. Bunun bir GZip kodlanmış akışı olduğunu unutmayın.

Not Bu çalıştığını:

curl --compressed -uusername $GNIP_STREAMING_URL 

DÜZENLEME: Bu tür örtülü olduğundan emin değilim, ama herhangi bir giriş creds veya gerçek URL'yi dışarı veremez, o yüzden sorma;)

EDIT # 2: URL için kimlik bilgilerini nasıl kodlayacağımı anlayabilsem yajl-ruby büyük olasılıkla işe yarayacaktır (basit URL kodlaması Gnip ile kimlik doğrulaması başarısız olarak çalışacak gibi görünmüyor).

EDIT # 3: @rweald, em-http akış gzip'i desteklemediğini buldu, burada bir GitHub sorunu oluşturdum.

DÜZENLEME # 4: Bunu em-http-isteğinde belirttim ve düzelttim, em-http'u bu şekilde kullanmak istiyorsanız my fork işaretini verebilirsiniz. Yama, bakım şirketinin repo'yla birleştirildi ve bir sonraki sürümde çalışacak.

DÜZENLEME # 5: Düzeltmelerim em-http-request 1.0.3'te yayımlanmıştır, bu yüzden artık bir sorun olmamalıdır.

cevap

2

sorun em-http-istek içinde yatıyor çözecek https://github.com/brianmario/yajl-ruby kullanmak gibi görünüyor. Eğer https://github.com/igrigorik/em-http-request/blob/master/lib/em-http/decoders.rb

bakarsak Sen GZIP açıcı akışı dekompresyon :(yapamaz göreceksiniz https://github.com/igrigorik/em-http-request/blob/master/lib/em-http/decoders.rb#L100

Bir akımı okumak mümkün vermek isteseydiniz temel akışa gzip sorunu çözmek gerekir em-http-talebini

+0

Güzel Bul!Belki de em-http gemini düzeltiriz. Aksi halde, bağlantıyı canlı tutmak için yajl-yakut veya kaldırım kullanmanın bir yolu var mı ve sonra üstel bir geri çekilme modelinde yeniden bağlanmayı deneyin. –

+0

Evet, dün gerçekte gzip json'unu GNIP'den yayınlamaya izin verecek bir geçici çözüm buldum. Şimdi kodu temizlemeye çalışıyorum ve onu github projemde görebileceksiniz https://github.com/rweald/gnip-stream – rweald

+0

Sanırım düzeltmeyi de genelleştirebilmeliyim. em-http-isteği için bir yama olarak eklenebilir. Haftasonuna bir göz atacağım. – rweald

0

bu güzel

+0

Bu umut verici benziyordu, ama ben adını ve şifresini kodlamak anlamaya olamaz böyle bu hatayı alamadım: "lib/yakut/1.9.1/uri/generic.rb: 411 : 'check_user' içinde: hatalı bileşen (beklenen userinfo bileşeni veya kullanıcı bileşeni) " –

+1

Bu aslında ya yardım etmeyecektir. Http_request için yajl-ruby koduna bakarsanız, yanıt sadece GNIP yanıtının "Chunked" değilse gzip'i desteklediğini fark edeceksiniz. https://github.com/brianmario/yajl-ruby/blob/master/lib/yajl/http_stream.rb#L160 – rweald

0

kullanarak Gnip ben curb kullanmak önerdi ve burada onların örnekten ile geldi ne:

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 

Bağlantı kesildiğinde yeniden bağlanacak bir şey ister ve farklı türdeki hataları düzgün bir şekilde ele alırım.

1

Gnip konsoluna bağlanmak için bu Gist'in bazı kod tabanını kullanıyorum. https://gist.github.com/1468622

+0

Teşekkürler! Daha önce bu kadar zaman kazandırabilirdim ama şimdi gnip-stream gemini yama yapabilirim :) –