From 7a1180c7457b9ac79d4fa37e296a74e0e6655f79 Mon Sep 17 00:00:00 2001 From: drbrain Date: Fri, 24 Feb 2012 01:10:07 +0000 Subject: * lib/net/http.rb (Net::HTTP#transport_request): Fix infinite loop upon EOFError or Errno::ECONNRESET where count is reset to 0. * test/net/http/test_http.rb (class TestNetHTTPKeepAlive): Test for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34779 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/net/http.rb | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) (limited to 'lib/net') diff --git a/lib/net/http.rb b/lib/net/http.rb index b6e5de0a54..690690ae28 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -1343,33 +1343,35 @@ module Net #:nodoc: def transport_request(req) count = 0 - begin_transport req - res = catch(:response) { - req.exec @socket, @curr_http_version, edit_path(req.path) - begin - res = HTTPResponse.read_new(@socket) - end while res.kind_of?(HTTPContinue) - res.reading_body(@socket, req.response_body_permitted?) { - yield res if block_given? + begin + begin_transport req + res = catch(:response) { + req.exec @socket, @curr_http_version, edit_path(req.path) + begin + res = HTTPResponse.read_new(@socket) + end while res.kind_of?(HTTPContinue) + res.reading_body(@socket, req.response_body_permitted?) { + yield res if block_given? + } + res } + end_transport req, res res - } - end_transport req, res - res - rescue EOFError, Errno::ECONNRESET => exception - if count == 0 && IDEMPOTENT_METHODS_.include?(req.method) - count += 1 + rescue EOFError, Errno::ECONNRESET => exception + if count == 0 && IDEMPOTENT_METHODS_.include?(req.method) + count += 1 + @socket.close if @socket and not @socket.closed? + D "Conn close because of error #{exception}, and retry" + retry + end + D "Conn close because of error #{exception}" + @socket.close if @socket and not @socket.closed? + raise + rescue => exception + D "Conn close because of error #{exception}" @socket.close if @socket and not @socket.closed? - D "Conn close because of error #{exception}, and retry" - retry + raise exception end - D "Conn close because of error #{exception}" - @socket.close if @socket and not @socket.closed? - raise - rescue => exception - D "Conn close because of error #{exception}" - @socket.close if @socket and not @socket.closed? - raise exception end def begin_transport(req) -- cgit v1.2.3