EOFError: Net :: HTTP ile dosyanın sonuna ulaşıldı


158

Ruby-1.8.7-p302 / Rails 2.3.11 kullanıyorum. Bir bağlantı için istatistik almak için FQL (Facebook API) kullanmaya çalışıyorum. İşte benim kod:

def stats(fb_post_url)
  url = BASE_URI + "?query=#{URI.encode("select like_count from link_stat where url=\"#{fb_post_url}\"")}"
  parsed_url = URI.parse(url)
  http = Net::HTTP.new(parsed_url.host, parsed_url.port)
  request = Net::HTTP::Get.new(parsed_url.request_uri)

  response = http.request(request)
  response.inspect
end

Ve işte hata:

EOFError: end of file reached
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `sysread'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:67:in `timeout'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:101:in `timeout'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:126:in `readline'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2028:in `read_status_line'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2017:in `read_new'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1051:in `request'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1037:in `request'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:543:in `start'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1035:in `request'
from /home/rahul/Work/Radr/lib/fb_stats.rb:13:in `stats'
from (irb):10

Bu sadece Facebook API'sında oluyor gibi görünüyor. Ayrıca, bazı yazılarda bu Net :: HTTP'de bir hata olabileceğini önerdim.


3
Bunun için bir çözüm buldunuz mu? SFDC API benzer bir sorunla karşı karşıyayım.
Nilesh

Yanıtlar:


281

URL http yerine https kullanıyorsa, aşağıdaki satırı eklemeniz gerekir:

parsed_url = URI.parse(url)
http = Net::HTTP.new(parsed_url.host, parsed_url.port)
http.use_ssl = true

Ek not http.use_ssl = true.

Ve hem http hem de https'yi işleyecek daha uygun kod aşağıdakine benzer olacaktır.

url = URI.parse(domain)
req = Net::HTTP::Post.new(url.request_uri)
req.set_form_data({'name'=>'Sur Max', 'email'=>'some@email.com'})
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == "https")
response = http.request(req)

Blogumda daha fazlasını gör: EOFError: Net :: HTTP ile form gönderirken dosya sonuna ulaşıldı .


Teşekkürler, bu httpve ile arasındaki farkı anlamama yardımcı oldu req.
guptron

6
Blog yayını bağlantısı koptu, ancak şunu deneyin: web.archive.org/web/20150429191916/http://expressica.com/2012/…
Henrik N

Ya https değilse?
Jwan622

5

SSL olmayan bir hizmet talebiyle benzer bir sorun yaşadım.

Bu blog, 'get' e geçirilen URL'yi kodlayan URI'yi denemeyi önerdi: http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

Çaresizliğe dayanarak bir çekim yaptım ve sınırlayıcı testlerimde bu benim için düzeltildi gibi görünüyor. Yeni kodum:

@http = Net::HTTP.new('domain.com')  
@http = @http.start    
url = 'http://domain.com/requested_url?blah=blah&etc=1'
req = Net::HTTP::Get.new(URI.encode(url))
req.basic_auth USERNAME, API_KEY
res = @http.request(req) 

HTTP oturumunu birden çok istek üzerinde tutmak istediğim için @ http.start kullandığımı unutmayın. Bunun dışında , get çağrısındaki en alakalı kısmı denemek isteyebilirsiniz: URI.encode (url)


2
Bu konuda bazı ek geri bildirimler vermek istedim, çünkü hala yararlı görünüyor. Bu kodlanmış URI'yi bir üretim sunucusunda 4 aydır kullanıyorum ve sorunun giderildiğini onaylayabilirim.
Phil

3

Bu tür Net :: HTTP ve Net :: FTP sorunları düzenli aralıklarla karşılaşıyorum ve bunu yaptığımda, bir timeout () ile çağrıyı çevreleyen tüm bu sorunları ortadan kaldırır. Bu, zaman zaman 3 dakika kadar asılacak ve sonra bir EOFError oluşturacak:

res = Net::HTTP.post_form(uri, args)

Bu her zaman benim için düzeltiyor:

res = timeout(120) { Net::HTTP.post_form(uri, args) }

3

Aynı problemim vardı, yakut-1.8.7-p357 ve boşuna bir sürü şey denedim ...

Sonunda sadece aynı XMLRPC :: Client örneğini kullanan birden fazla çağrıda gerçekleştiğini fark ettim!

Şimdi her çağrımda müvekkilim yeniden örnekleme ve sadece çalışıyor: |


1

Biraz araştırma yaptıktan sonra, Ruby'nin XMLRPC::Clientkütüphanesinde - kullanıyordu NET::HTTP. İstemci, gelecekteki istekler için bağlantıyı açık tutan start()yöntemi kullanır NET::HTTP.

Bu son isteklerden tam 30 saniye sonra oldu - bu yüzden benim varsayım vurduğu sunucunun o zamandan sonra istekleri kapatması. NET::HTTPİsteği açık tutmak için varsayılanın ne olduğundan emin değilim - ancak sorunun çözülüp çözülmediğini görmek için 60 saniye ile test etmek üzereyim.


1
Sonuç neydi?
Peter Mortensen

1

Son zamanlarda bununla karşılaştım ve sonunda bunun, vurduğumuz son noktadan bir ağ zaman aşımından kaynaklandığını buldum. Neyse ki bizim için zaman aşımı süresini artırabildik.

Bunun bizim sorunumuz olduğunu (ve aslında net http ile ilgili bir sorun olmadığını) doğrulamak için curl ile aynı isteği yaptım ve isteğin sonlandırıldığını doğruladım.


-1

Ruby on Rails'te bu kodu kullandım ve mükemmel çalışıyor:

req_profilepic = ActiveSupport::JSON.decode(open(URI.encode("https://graph.facebook.com/me/?fields=picture&type=large&access_token=#{fb_access_token}")))

profilepic_url = req_profilepic['picture']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.