170 votes

EOFError : problème de fin de fichier atteinte avec Net::HTTP

J'utilise ruby-1.8.7-p302/Rails 2.3.11. J'essaie d'utiliser FQL (Facebook API) pour obtenir des statistiques pour un lien. Voici mon code :

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

Et voici l'erreur :

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

Cela semble se produire uniquement dans le cas de l'API Facebook. Par ailleurs, j'ai vu qu'il était suggéré dans certains messages que cela pouvait être un bogue dans Net::HTTP.

3 votes

Avez-vous trouvé une solution à ce problème ? Je suis confronté à un problème similaire dans l'API SFDC.

304voto

Sur Max Points 726

Si l'URL utilise https au lieu de http, vous devez ajouter la ligne suivante :

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

Notez les http.use_ssl = true .

Le code le plus approprié pour gérer à la fois http et https sera similaire au code suivant.

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)

Voir la suite sur mon blog : Erreur EOFE : problème de fin de fichier atteinte lors de la publication d'un formulaire avec Net::HTTP .

0 votes

Merci, cela m'a aidé à comprendre la différence entre le http y req .

6 votes

Le lien vers l'article du blog est cassé, mais essayez ceci : web.archive.org/web/20150429191916/http://expressica.com/2012/

1 votes

Et si ce n'est pas https ?

6voto

Phil Points 504

J'ai eu un problème similaire avec une demande à un service non-SSL.

Ce blog suggère vaguement d'essayer de coder en URI l'URL qui est passée à 'get' : http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

J'ai tenté le coup, par désespoir, et mes essais limités semblent avoir réglé le problème. Mon nouveau code est le suivant :

@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) 

Notez que j'utilise @http.start car je veux maintenir la session HTTP sur plusieurs requêtes. En dehors de cela, vous pouvez essayer la partie la plus pertinente qui est : URI.encode(url) à l'intérieur de l'appel get

2 votes

Je voulais simplement fournir quelques informations supplémentaires à ce sujet, puisqu'il semble toujours utile. J'utilise cet URI codé sur un serveur de production depuis 4 mois et je peux confirmer qu'il a résolu le problème.

3voto

jobwat Points 1213

J'ai eu le même problème, ruby-1.8.7-p357, et j'ai essayé plein de choses en vain...

J'ai finalement réalisé que cela ne se produit que lors d'appels multiples utilisant la même instance de XMLRPC::Client !

Donc maintenant, je ré-instancie mon client à chaque appel et ça marche.

0voto

Vérifiez les guillemets par lesquels vous passez la chaîne, utilisez à la fois " et ' pour construire exactement ce que vous voulez passer.

-1voto

Nicolas Grenié Points 328

Dans Ruby on Rails, j'ai utilisé ce code, et il fonctionne parfaitement :

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']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X