EOFError:Net :: HTTP文件到达末尾问题


158

我正在使用ruby-1.8.7-p302 / Rails 2.3.11。我正在尝试使用FQL(Facebook API)来获取链接的统计信息。这是我的代码:

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

这是错误:

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

这似乎仅在使用Facebook API的情况下才发生。另外,我在某些帖子中看到它建议这可能是Net :: HTTP中的错误。


3
您找到解决方案了吗?我在SFDC API中面临类似的问题。
Nilesh

Answers:


281

如果URL使用https而不是http,则需要添加以下行:

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

请注意其他http.use_ssl = true

同时处理http和https的更合适的代码将类似于以下代码。

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)

在我的博客中查看更多内容:EOFError:使用Net :: HTTP发布表单时,文件结尾出现问题


谢谢,这帮助我了解了http和之间的区别req
guptron 2014年

6
该博客文章链接断开,但试试这个:web.archive.org/web/20150429191916/http://expressica.com/2012/...
亨里克ñ

如果不是https怎么办?
Jwan622 '18

5

我对非SSL服务的请求也遇到了类似的问题。

该博客模糊地建议尝试对传递给“ get”的URL进行URI编码:http : //www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

基于绝望,我对此进行了尝试,在极限测试中,这似乎已经为我解决了。我的新代码是:

@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会话,所以使用@ http.start。除此之外,您可能想尝试最相关的部分:get调用内的URI.encode(url)


2
我只是想对此提供一些其他反馈,因为它似乎仍然有用。我已经在生产服务器上使用此编码的URI运行了4个月,我可以确认它已解决问题。
Phil

3

我发现我经常遇到这样的Net :: HTTP和Net :: FTP问题,当我这样做时,用timeout()包围调用会使所有这些问题消失。因此,这偶尔会挂起3分钟左右,然后引发EOFError:

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

这总是为我解决:

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

3

我遇到了同样的问题,ruby-1.8.7-p357,并徒劳地尝试了很多东西。

我终于意识到,它仅在使用相同XMLRPC :: Client实例的多个调用上发生!

因此,现在我在每次通话时都要重新初始化我的客户,它可以正常工作:|


1

经过研究后,这发生在Ruby的XMLRPC::Client库中,该库使用NET::HTTP。客户端使用start()的方法,NET::HTTP这使开放以后的请求的连接。

这恰好发生在最后一个请求之后的30秒-因此,我的假设是,所命中的服务器将在该时间之后关闭请求。我不确定NET::HTTP将请求保持打开状态的默认值是什么-但我将用60秒的时间进行测试,看看是否可以解决问题。


1
结果如何?
彼得·莫滕森

1

我最近遇到了这个问题,最终发现这是由我们命中的端点的网络超时引起的。对我们来说幸运的是,我们能够增加超时时间。

为了验证这是我们的问题(实际上不是net http的问题),我使用curl发出了相同的请求,并确认该请求已终止。


-1

在Ruby on Rails中,我使用了以下代码,它可以完美地工作:

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']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.