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

답변:


281

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로 양식을 게시 할 때 파일 끝에 도달했습니다 .


덕분에이 날 사이의 차이를 이해하는 데 도움 httpreq.
guptron

6
블로그 게시물 링크가 끊어졌지만 시도해보십시오. web.archive.org/web/20150429191916/http://expressica.com/2012/…
Henrik N

https가 아닌 경우 어떻게합니까?
Jwan622

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 call 내부에서 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
결과는 어떻습니까?
Peter Mortensen

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']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.