EOFError: problema al final del archivo alcanzado con Net:: HTTP


Estoy usando ruby 1.8.7-p302/Rails 2.3.11. Estoy tratando de usar fql (facebook api) para obtener estadísticas de un enlace. Aquí está mi código:

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

Y aquí está el error:

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

Esto parece estar sucediendo solo en el caso de la api de facebook. También, lo vi sugerido en algún post esto podría ser un error en Net:: HTTP.

Author: Rahul Singh, 2011-03-09

6 answers

Si la URL utiliza https en lugar de http, debe agregar la siguiente línea:

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

Tenga en cuenta el adicional http.use_ssl = true.

Y el código más apropiado que manejaría tanto http como https será similar al siguiente.

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

Ver más en mi blog: EOFError: end of file reached issue when post a form with Net::HTTP.

 224
Author: Sur Max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-26 18:45:57

Tuve un problema similar con una solicitud a un servicio no SSL.

Este blog sugirió vagamente probar la codificación URI de la URL que se pasa a' get': http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

Lo intenté, basado en la desesperación, y en mis pruebas limitantes esto parece haberlo arreglado para mí. Mi nuevo código es:

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

Tenga en cuenta que uso @http.comience cuando quiera mantener la sesión HTTP a través de múltiples solicitudes. Distintos de eso, te gustaría probar la parte más relevante que es: URI.codificar (url) dentro de la llamada get

 5
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 23:59:30

Tuve el mismo problema, ruby-1.8.7-p357 ,intenté muchas cosas en vano...

Finalmente me di cuenta de que solo sucede en varias llamadas usando la misma instancia de XMLRPC::Client !

Así que ahora estoy re-instanciando mi cliente en cada llamada y simplemente funciona | /

 3
Author: jobwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-22 06:39:15

Encuentro que me encuentro con problemas de Net::HTTP y Net::FTP como este periódicamente, y cuando lo hago, rodeando la llamada con un timeout() hace que todos esos problemas desaparezcan. Así que cuando esto se cuelgue ocasionalmente durante 3 minutos más o menos y luego levante un EOFError:

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

Esto siempre lo arregla para mí:

res = timeout(120) { Net::HTTP.post_form(uri, args) }
 3
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-28 00:17:10

Después de hacer algunas investigaciones, esto estaba sucediendo en la biblioteca XMLRPC::Client de Ruby, que usa NET::HTTP. El cliente utiliza el método start() en NET::HTTP que mantiene la conexión abierta para futuras solicitudes.

Esto sucedió precisamente a los 30 segundos después de las últimas solicitudes, por lo que mi suposición aquí es que el servidor al que está golpeando está cerrando las solicitudes después de ese tiempo. No estoy seguro de cuál es el valor predeterminado para NET::HTTP para mantener la solicitud abierta , pero estoy a punto de probar con 60 segundos para ver si eso resuelve el problema. cuestión.

 1
Author: TJ Biddle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 15:54:20

En rails utilicé este código y funciona perfectamente

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

Espero que te ayude:)

 0
Author: Nicolas Grenié,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-17 18:31:27