EOFError: la fin du fichier a rencontré un problème 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. En outre, je l’ai vu suggéré dans certains articles, cela pourrait être un bogue dans Net :: HTTP.

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

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

Notez le http.use_ssl = true supplémentaire.

Et le code plus approprié qui traiterait à la fois http et https sera similaire à celui-ci.

 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 plus dans mon blog: EOFError : problème de fin de fichier atteint lors de la publication d’un formulaire avec Net :: HTTP .

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

Ce blog a suggéré vaguement d’essayer l’URI encodant l’URL transmise à ‘get’: http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

Je me suis attaqué à cela, basé sur le désespoir, et dans mes tests de limitation, cela semble avoir été corrigé pour moi. 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 souhaite conserver la session HTTP sur plusieurs requêtes. En dehors de cela, vous pouvez essayer la partie la plus pertinente qui soit: URI.encode (url) dans l’appel à recevoir

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

J’ai finalement réalisé que cela ne se produit que sur plusieurs appels utilisant la même instance XMLRPC :: Client!

Alors maintenant, je ré-installe mon client à chaque appel et ça marche: |

Je trouve que je rencontre régulièrement des problèmes avec Net :: HTTP et Net :: FTP, et lorsque je le fais, entourer l’appel avec un timeout () fait disparaître tous ces problèmes. Donc, où cela peut occasionnellement se bloquer pendant environ 3 minutes, puis élever une erreur EOFE:

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

Cela le fixe toujours pour moi:

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

Après quelques recherches, cela se passait dans la bibliothèque XMLRPC::Client de Ruby – qui utilise NET::HTTP . Le client utilise la méthode start() dans NET::HTTP qui maintient la connexion ouverte pour les demandes futures.

Cela s’est produit précisément 30 secondes après les dernières requêtes – Donc, je suppose ici que le serveur qu’il frappe ferme les requêtes après cette heure. Je ne suis pas sûr de la valeur par défaut de NET::HTTP pour garder la requête ouverte – mais je suis sur le sharepoint tester avec 60 secondes pour voir si cela résout le problème.

En rails j’ai utilisé ce code et ça marche 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'] 

J’espère que ça vous aide 🙂