EOFError: достигнут конец файла с Net :: HTTP - PullRequest
140 голосов
/ 09 марта 2011

Я использую 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

Это, кажется, происходит только в случае API Facebook. Кроме того, я заметил, что в некоторых постах это может быть ошибкой в ​​Net :: HTTP.

Ответы [ 7 ]

252 голосов
/ 10 февраля 2012

Если в 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 .

5 голосов
/ 22 марта 2012

У меня была похожая проблема с запросом к службе без SSL.

В этом блоге смутно предлагалось попробовать URI, кодирующий URL, который передается в 'get': 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.start, поскольку хочу поддерживать HTTP-сеанс для нескольких запросов. Кроме этого, вы можете попробовать наиболее релевантную часть: URI.encode (url) внутри вызова get

3 голосов
/ 01 июля 2013

Я обнаруживаю, что периодически сталкиваюсь с такими проблемами, как Net :: HTTP и Net :: FTP, и когда я это делаю, окружение вызова тайм-аутом () делает все эти проблемы исчезающими. Так, где это будет иногда зависать в течение 3 минут или около того, а затем вызвать EOFError:

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

Это всегда исправляет для меня:

res = timeout(120) { Net::HTTP.post_form(uri, args) }
3 голосов
/ 22 ноября 2012

У меня была такая же проблема, ruby-1.8.7-p357, и я много чего перепробовал ...

Я наконец понял, что это происходит только при нескольких вызовах, использующих один и тот же экземпляр XMLRPC :: Client!

Так что теперь я восстанавливаю свой клиент при каждом вызове, и он просто работает: |

1 голос
/ 20 июня 2013

После некоторых исследований это произошло в библиотеке XMLRPC::Client в Ruby, которая использует NET::HTTP.Клиент использует метод start() в NET::HTTP, который сохраняет соединение открытым для будущих запросов.

Это произошло ровно через 30 секунд после последних запросов - поэтому я предполагаю, что сервер, к которому он подключается, закрываетсязапросы после этого времени.Я не уверен, какое значение по умолчанию для NET::HTTP, чтобы оставить запрос открытым, но я собираюсь протестировать с 60 секундами, чтобы увидеть, решит ли это проблему.

0 голосов
/ 25 апреля 2019

Я столкнулся с этим недавно и в конце концов обнаружил, что это было вызвано таймаутом сети от конечной точки, к которой мы подключались. К счастью для нас, мы смогли увеличить продолжительность тайм-аута.

Чтобы убедиться, что это была наша проблема (а на самом деле не проблема с net http), я сделал тот же запрос с помощью curl и подтвердил, что запрос был прерван.

0 голосов
/ 17 октября 2011

В 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...