summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--lib/net/http.rb34
-rw-r--r--test/net/http/test_http.rb19
-rw-r--r--test/net/http/test_https.rb22
-rw-r--r--version.h2
5 files changed, 74 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 80b734d334..d6921e15f8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
diff --git a/version.h b/version.h
index 55653e8480..b87cd5859f 100644
--- a/version.h
+++ b/version.h
@@ -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