[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]