EOFError: fin de fichier atteinte d'un problème avec Net::HTTP
Je suis à l'aide de ruby 1.8.7-p302/Rails de 2.3.11. Je suis en train 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
Ce qui semble se produire uniquement dans le cas de l'Facebook API. Aussi, j'ai vu qu'il est suggéré dans certains post, cela pourrait être un bug dans Net::HTTP.
- Avez-vous trouvé une solution pour cela? Je suis confronté à un problème similaire dans SFDC API.
Vous devez vous connecter pour publier un commentaire.
Si l'URL est à l'aide de https au lieu de http, vous devez ajouter la ligne suivante:
Note plus
http.use_ssl = true
.Et le plus approprié code qui permettrait de gérer à la fois les protocoles http et https sera similaire à celle-ci.
Voir plus dans mon blog: EOFError: fin de fichier atteinte problème lors du post d'un formulaire avec Net::HTTP.
http
etreq
.J'ai eu un problème similaire avec une demande à un non-SSL service.
Ce blog vaguement suggéré d'essayer URI de l'encodage de l'URL qui est passé à "get": http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
J'ai pris un coup à lui, basé sur le désespoir, et dans mon limitant les tests il semble que se fixe pour moi. Mon nouveau code:
Noter que j'utilise @http.commencer comme je veux maintenir la session HTTP sur de multiples demandes. Autre que cela, vous pourriez essayer la partie la plus pertinente qui est: URI.coder(url) à l'intérieur de l'obtenir de l'appel
Je trouve que je dirige en Net::HTTP et Net::FTP ce type de problèmes, périodiquement, et quand je le fais, dans les environs de l'appel avec un timeout() rend tous ces problèmes disparaissent. Alors, où cela va parfois se bloquer pendant 3 minutes, puis soulever une EOFError:
Cela corrige toujours pour moi:
J'ai eu le même problème, ruby 1.8.7-p357, et j'ai essayé des tas de choses en vain...
J'ai finalement réalisé qu'il ne se produit que sur les appels multiples à l'aide de la même XMLRPC::instance de Client!
Alors maintenant, je suis en train de redéfinir l'instanciation de mon client à chaque appel et il fonctionne, tout simplement:|
Après avoir fait quelques recherches, ce qui se passait dans Ruby
XMLRPC::Client
bibliothèque - qui utiliseNET::HTTP
. Le client utilise lestart()
méthode dansNET::HTTP
qui maintient ouverte pour de futures demandes.Ce qui s'est passé précisément à 30 secondes après la dernière demande - donc mon hypothèse ici est que le serveur c'est frappant, c'est la clôture des demandes après cette date. Je ne suis pas sûr de ce que la valeur par défaut est de
NET::HTTP
à maintenir la demande de l'ouvrir, mais je suis sur le point de tester avec 60 secondes pour voir si cela résout le problème.En Ruby on Rails, j'ai utilisé ce code et il fonctionne parfaitement:
Je suis tombé sur cette récemment et a finalement trouvé que c'était causé par un délai d'attente réseau à partir du point de terminaison nous avons été frapper. Heureusement pour nous, nous avons été en mesure d'augmenter la durée d'expiration.
Pour vérifier cela a été notre problème (et en fait pas un problème avec net http), j'ai fait la même demande avec curl et a confirmé que la demande a été résilié.