2011-03-09 1 views
108

ruby-1.8.7-p302/Rails 2.3.11을 사용하고 있습니다. 나는 fql (페이스 북 API)를 사용하여 링크에 대한 통계를 얻으려고합니다.EOFError : Net :: HTTP에서 파일 끝에 도달했습니다.

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의 경우에 발생하는 것으로 보인다. 또한 일부 게시물에서는 Net :: HTTP의 버그 일 수 있다고 제안했습니다. 레일에서

+2

당신은 이것에 대한 해결책을 찾으셨습니까을? 나는 SFDC API에서 비슷한 문제에 직면하고있다. – Nilesh

답변

193

을하는 데 도움이

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

희망, 당신은 다음 줄을 추가 할 필요가 완벽하게 작동합니다 :

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'=>'[email protected]'}) 
http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = (url.scheme == "https") 
response = http.request(req) 

내 블로그에 더 많은 내용 : EOFError: end of file reached issue when post a form with Net::HTTP.

+13

그 오류는 그보다 훨씬 더 명백 할 수 있습니다! –

+0

감사합니다. 이것은'http'와'req'의 차이를 이해하는 데 도움이되었습니다. – guptron

+2

블로그 게시물 링크가 깨졌지만 시도해보십시오. https://web.archive.org/web/20150429191916/http://expressica.com/2012/02/10/eoferror-end-of-file-reached- 문제가있는 경우와 이후에 양식이있는 경우 –

0

은이 코드를 사용하고 URL이 http가 아닌 HTTPS를 사용하는 경우 :

5

비 SSL 서비스 요청과 비슷한 문제가있었습니다.

이 블로그는 URI가 '수'에 전달되는 URL 인코딩 시도 막연하게 제안 : 나는 절망에 따라, 그것은에서 촬영을했다 http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

, 그리고 내 제한이 그것을 해결 한 것 같다 테스트 나를. 새로운 코드는 다음과 같습니다.

여러 요청에서 HTTP 세션을 유지하기 위해 @ http.start를 사용합니다. 그 외에도 다음과 같은 가장 관련있는 부분을 시도해보십시오. get.encode (url) get 호출 내

+1

나는 여전히 유용한 것으로 보이기 때문에 이것에 대한 몇 가지 추가 피드백을 제공하기를 원했습니다. 프로덕션 서버에서이 인코딩 된 URI를 사용하여 4 개월 동안 실행 중이며 문제가 해결되었음을 확인할 수 있습니다. – Phil

3

동일한 문제가 있었지만 ruby-1.8.7-p357, 많은 작업을 시도했습니다. 헛된 ...

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

이제 각 호출에서 클라이언트를 다시 인스턴스화하고 있습니다.

0

약간의 연구를 한 후 Ruby의 XMLRPC::Client 라이브러리에서 발생했습니다.이 라이브러리는 NET::HTTP을 사용합니다. 클라이언트는 NET::HTTP에서 start() 메서드를 사용하며 이후 요청에 대해 연결을 유지합니다.

마지막 요청 후 30 초가 지나면 정확히 이런 일이 일어났습니다. 여기 내 가정은 그 시간이 지나면 요청을 종료하는 서버라는 것입니다. 질문을 열어두기 위해 기본값 인 NET::HTTP이 무엇인지 잘 모르겠습니다. 그러나 문제가 해결되는지 60 초 동안 테스트하려고합니다.

3

Net :: HTTP 및 Net :: FTP 문제가 주기적으로 실행되는 것을 발견했습니다. 시간이 지나면 호출을 둘러싼 후 모든 문제가 사라집니다. 그래서 가끔 삼분 정도 멈춘 다음에서 EOFError 인상 곳 :

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

이 항상 나를 위해 그것을 해결

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