[ruby-on-rails] 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

이것은 Facebook API의 경우에만 발생하는 것 같습니다. 또한 일부 게시물에서 이것이 Net :: HTTP의 버그 일 수 있음을 제안했습니다.



답변

URL이 http 대신 https를 사용하는 경우 다음 행을 추가해야합니다.

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이 아닌 서비스에 대한 요청과 비슷한 문제가있었습니다.

이 블로그는 ‘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 call 내부에서 URI.encode (url) 과 가장 관련이있는 부분을 시도하고 싶을 수도 있습니다.


답변

Net :: HTTP 및 Net :: FTP 문제가 주기적으로 발생한다는 것을 알았습니다. 그렇다면 timeout () 호출을 둘러싼 모든 문제가 사라집니다. 따라서이 위치가 3 분 정도 멈 추면 EOFError가 발생합니다.

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

이것은 항상 나를 위해 수정합니다.

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


답변

나는 ruby-1.8.7-p357과 같은 문제가 있었고 많은 것을 헛되이 시도했다 …

마침내 동일한 XMLRPC :: Client 인스턴스를 사용하는 여러 호출에서만 발생한다는 것을 깨달았습니다.

이제는 매번 호출 할 때마다 클라이언트를 다시 인스턴스화하고 작동합니다. |


답변

약간의 연구를 한 후에, 이것은 Ruby의 XMLRPC::Client라이브러리 에서 발생했습니다 NET::HTTP. 클라이언트는 향후 요청을 위해 연결을 열린 상태로 유지 하는 start()방법을 사용 NET::HTTP합니다.

이것은 마지막 요청 후 정확히 30 초에 일어 났으므로 여기서 내 가정은 그 서버가 그 시간 후에 요청을 닫고 있다고 가정합니다. NET::HTTP요청을 열어 두는 기본값이 무엇인지 확실하지 않지만 60 초로 테스트하여 문제가 해결되는지 확인하려고합니다.


답변

최근 에이 문제에 부딪 쳤고 결국 우리가 치고있는 엔드 포인트의 네트워크 시간 초과로 인한 것으로 나타났습니다. 다행히도 우리는 타임 아웃 시간을 늘릴 수있었습니다.

이것이 우리의 문제인지 (실제로 net http의 문제는 아님) 확인하기 위해 curl과 동일한 요청을하고 요청이 종료되었음을 확인했습니다.


답변

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