ruby-changes:22793
From: drbrain <ko1@a...>
Date: Tue, 28 Feb 2012 13:51:49 +0900 (JST)
Subject: [ruby-changes:22793] drbrain:r34842 (trunk): * lib/net/http.rb: Retry HTTP requests for additional network errors.
drbrain 2012-02-28 13:51:37 +0900 (Tue, 28 Feb 2012) New Revision: 34842 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34842 Log: * lib/net/http.rb: Retry HTTP requests for additional network errors. Introduce OpenTimeout subclass of Timeout::Error. [Bug #6001] * test/net/http/test_http.rb: Reduce timeout to 0.01s for faster test * test/net/http/test_https.rb: ditto Modified files: trunk/ChangeLog trunk/lib/net/http.rb trunk/test/net/http/test_http.rb trunk/test/net/http/test_https.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34841) +++ ChangeLog (revision 34842) @@ -1,3 +1,10 @@ +Tue Feb 28 13:51:12 2012 Eric Hodel <drbrain@s...> + + * lib/net/http.rb: Retry HTTP requests for additional network errors. + Introduce OpenTimeout subclass of Timeout::Error. [Bug #6001] + * test/net/http/test_http.rb: Reduce timeout to 0.01s for faster test + * test/net/http/test_https.rb: ditto + Tue Feb 28 11:44:49 2012 Nobuyoshi Nakada <nobu@r...> * configure.in (debugflags): check if -ggdb is accepted. Index: lib/net/http.rb =================================================================== --- lib/net/http.rb (revision 34841) +++ lib/net/http.rb (revision 34842) @@ -360,6 +360,9 @@ # class HTTP < Protocol + class OpenTimeout < Timeout::Error + end + # :stopdoc: Revision = %q$Revision$.split[1] HTTPVersion = '1.1' @@ -788,7 +791,9 @@ def connect D "opening connection to #{conn_address()}..." - s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) } + s = timeout(@open_timeout, OpenTimeout) { + TCPSocket.open(conn_address(), conn_port()) + } D "opened" if use_ssl? ssl_parameters = Hash.new @@ -824,7 +829,7 @@ end # Server Name Indication (SNI) RFC 3546 s.hostname = @address if s.respond_to? :hostname= - timeout(@open_timeout) { s.connect } + timeout(@open_timeout, OpenTimeout) { s.connect } if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE s.post_connection_check(@address) end @@ -1355,9 +1360,11 @@ } res } - end_transport req, res - res - rescue EOFError, Errno::ECONNRESET => exception + rescue IOError, EOFError, + Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE, + OpenSSL::SSL::SSLError, Timeout::Error => exception + raise if OpenTimeout === exception + if count == 0 && IDEMPOTENT_METHODS_.include?(req.method) count += 1 @socket.close if @socket and not @socket.closed? @@ -1367,11 +1374,14 @@ 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 + + end_transport req, res + res + rescue => exception + D "Conn close because of error #{exception}" + @socket.close if @socket and not @socket.closed? + raise exception end def begin_transport(req) Index: test/net/http/test_http.rb =================================================================== --- test/net/http/test_http.rb (revision 34841) +++ test/net/http/test_http.rb (revision 34842) @@ -195,13 +195,13 @@ def test_timeout_during_HTTP_session bug4246 = "expected the HTTP session to have timed out but have not. c.f. [ruby-core:34203]" - # listen for connections... but deliberately do not complete SSL handshake + # listen for connections... but deliberately do not read TCPServer.open('localhost', 0) {|server| port = server.addr[1] conn = Net::HTTP.new('localhost', port) - conn.read_timeout = 1 - conn.open_timeout = 1 + conn.read_timeout = 0.01 + conn.open_timeout = 0.01 th = Thread.new do assert_raise(Timeout::Error) { @@ -598,21 +598,19 @@ assert_kind_of Net::HTTPResponse, res assert_kind_of String, res.body sleep 1.5 - assert_nothing_raised { - res = http.get('/') - } + res = http.get('/') assert_kind_of Net::HTTPResponse, res assert_kind_of String, res.body } end - def test_keep_alive_EOF + def test_keep_alive_server_close def @server.run(sock) sock.close end start {|http| - assert_raises(EOFError,Errno::ECONNRESET) { + assert_raises(EOFError, Errno::ECONNRESET, IOError) { res = http.get('/') } } Index: test/net/http/test_https.rb =================================================================== --- test/net/http/test_https.rb (revision 34841) +++ test/net/http/test_https.rb (revision 34842) @@ -115,11 +115,11 @@ conn = Net::HTTP.new('localhost', port) conn.use_ssl = true - conn.read_timeout = 1 - conn.open_timeout = 1 + conn.read_timeout = 0.01 + conn.open_timeout = 0.01 th = Thread.new do - assert_raise(Timeout::Error) { + assert_raise(Net::HTTP::OpenTimeout) { conn.get('/') } end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/