ruby-changes:18497
From: yugui <ko1@a...>
Date: Wed, 12 Jan 2011 16:26:29 +0900 (JST)
Subject: [ruby-changes:18497] Ruby:r30520 (trunk): * lib/net/http.rb (Net::HTTP#connect): makes it timeout during
yugui 2011-01-12 16:26:18 +0900 (Wed, 12 Jan 2011) New Revision: 30520 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30520 Log: * lib/net/http.rb (Net::HTTP#connect): makes it timeout during SSL handshake too. [ruby-core:34203] Patch by Marc Slemko. * test/net/http/test_http.rb (TestNetHTTP_v1_2#test_timeout_during_HTTP_session): test for [ruby-core:34203] * test/net/http/test_https.rb (TestNetHTTPS#test_timeout_during_SSL_handshake): 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 30519) +++ ChangeLog (revision 30520) @@ -1,3 +1,15 @@ +Wed Jan 12 16:25:12 2011 Yuki Sonoda (Yugui) <yugui@y...> + + * lib/net/http.rb (Net::HTTP#connect): makes it timeout during + SSL handshake too. [ruby-core:34203] + Patch by Marc Slemko. + + * test/net/http/test_http.rb (TestNetHTTP_v1_2#test_timeout_during_HTTP_session): + test for [ruby-core:34203] + + * test/net/http/test_https.rb (TestNetHTTPS#test_timeout_during_SSL_handshake): + ditto. + Wed Jan 12 16:24:53 2011 Yuki Sonoda (Yugui) <yugui@y...> * ext/readline/extconf.rb: new checks for RL_PROMPT_START_IGNORE Index: lib/net/http.rb =================================================================== --- lib/net/http.rb (revision 30519) +++ lib/net/http.rb (revision 30520) @@ -767,22 +767,28 @@ @socket.read_timeout = @read_timeout @socket.debug_output = @debug_output if use_ssl? - if proxy? - @socket.writeline sprintf('CONNECT %s:%s HTTP/%s', - @address, @port, HTTPVersion) - @socket.writeline "Host: #{@address}:#{@port}" - if proxy_user - credential = ["#{proxy_user}:#{proxy_pass}"].pack('m') - credential.delete!("\r\n") - @socket.writeline "Proxy-Authorization: Basic #{credential}" + begin + if proxy? + @socket.writeline sprintf('CONNECT %s:%s HTTP/%s', + @address, @port, HTTPVersion) + @socket.writeline "Host: #{@address}:#{@port}" + if proxy_user + credential = ["#{proxy_user}:#{proxy_pass}"].pack('m') + credential.delete!("\r\n") + @socket.writeline "Proxy-Authorization: Basic #{credential}" + end + @socket.writeline '' + HTTPResponse.read_new(@socket).value end - @socket.writeline '' - HTTPResponse.read_new(@socket).value + timeout(@open_timeout) { s.connect } + if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE + s.post_connection_check(@address) + end + rescue => exception + D "Conn close because of connect error #{exception}" + @socket.close if @socket and not @socket.closed? + raise exception end - s.connect - if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE - s.post_connection_check(@address) - end end on_connect end Index: test/net/http/test_http.rb =================================================================== --- test/net/http/test_http.rb (revision 30519) +++ test/net/http/test_http.rb (revision 30520) @@ -182,6 +182,25 @@ assert_equal data, res.entity end + 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 + TCPServer.open(0) {|server| + port = server.addr[1] + + conn = Net::HTTP.new('localhost', port) + conn.read_timeout = 1 + conn.open_timeout = 1 + + th = Thread.new do + assert_raise(Timeout::Error) { + conn.get('/') + } + end + assert th.join(10), bug4246 + } + end end Index: test/net/http/test_https.rb =================================================================== --- test/net/http/test_https.rb (revision 30519) +++ test/net/http/test_https.rb (revision 30520) @@ -2,6 +2,7 @@ begin require 'net/https' require 'stringio' + require 'timeout' require File.expand_path("../../openssl/utils", File.dirname(__FILE__)) require File.expand_path("utils", File.dirname(__FILE__)) rescue LoadError @@ -104,4 +105,25 @@ } assert_match(/hostname does not match/, ex.message) end + + def test_timeout_during_SSL_handshake + bug4246 = "expected the SSL connection to have timed out but have not. [ruby-core:34203]" + + # listen for connections... but deliberately do not complete SSL handshake + TCPServer.open(0) {|server| + port = server.addr[1] + + conn = Net::HTTP.new('localhost', port) + conn.use_ssl = true + conn.read_timeout = 1 + conn.open_timeout = 1 + + th = Thread.new do + assert_raise(Timeout::Error) { + conn.get('/') + } + end + assert th.join(10), bug4246 + } + end end if defined?(OpenSSL) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/