EOFError: конец файла достиг проблемы с Net:: HTTP


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

6 125

6 ответов:

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

У меня была аналогичная проблема с запросом на службу без 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.начните, как я хочу, чтобы поддерживать сеанс HTTP более несколько запросов. Кроме того, вы можете попробовать наиболее актуальную часть, которая является: URI.кодирование(адрес) внутри get call

У меня была та же проблема, ruby-1.8.7-p357 ,пробовал кучу вещей напрасно...

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

Итак, теперь я повторно создаю экземпляр моего клиента при каждом вызове, и он просто работает :/

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

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

это всегда помогало мне:

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

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

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

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

надеюсь, что это поможет вам :)