diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-01-16 12:35:11 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-01-16 12:35:11 +0000 |
commit | 62941003a2f5314e80daf0c16e51881f0d177ff5 (patch) | |
tree | ee36b3bd9b748af7f755eb726fbf178d54a2d543 | |
parent | 829779e20c858b5be4dfb31b708ebb8f3a1832c3 (diff) |
merges r30520 from trunk into ruby_1_9_2.
--
* 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.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@30571 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | lib/net/http.rb | 34 | ||||
-rw-r--r-- | test/net/http/test_http.rb | 19 | ||||
-rw-r--r-- | test/net/http/test_https.rb | 22 | ||||
-rw-r--r-- | version.h | 2 |
5 files changed, 74 insertions, 15 deletions
@@ -1,3 +1,15 @@ +Wed Jan 12 16:25:12 2011 Yuki Sonoda (Yugui) <yugui@yugui.jp> + + * 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. + Sun Jan 9 16:31:53 2011 Yuki Sonoda (Yugui) <yugui@yugui.jp> * io.c (Kernel.#syscall): implemented on LP64/LLP64 environments too. diff --git a/lib/net/http.rb b/lib/net/http.rb index 8abbf60e58..ea5e449fcd 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -662,21 +662,27 @@ module Net #:nodoc: @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 - end - s.connect - if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE - s.post_connection_check(@address) + 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 end on_connect diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb index 6f40b79d76..bc87febbd9 100644 --- a/test/net/http/test_http.rb +++ b/test/net/http/test_http.rb @@ -173,6 +173,25 @@ module TestNetHTTP_version_1_1_methods assert_equal ["a=x1", "a=x2", "b=y"], res.body.split(/[;&]/).sort 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 diff --git a/test/net/http/test_https.rb b/test/net/http/test_https.rb index adb50c58fb..11bb4a1f1e 100644 --- a/test/net/http/test_https.rb +++ b/test/net/http/test_https.rb @@ -2,6 +2,7 @@ require "test/unit" 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 @@ -94,4 +95,25 @@ class TestNetHTTPS < Test::Unit::TestCase } assert_match(/hostname was 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) @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.2" -#define RUBY_PATCHLEVEL 151 +#define RUBY_PATCHLEVEL 152 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 |