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

ruby-changes:40685

From: naruse <ko1@a...>
Date: Fri, 27 Nov 2015 23:08:04 +0900 (JST)
Subject: [ruby-changes:40685] naruse:r52764 (trunk): * lib/net/http.rb (connect): detect closed connection and reconnect

naruse	2015-11-27 23:07:35 +0900 (Fri, 27 Nov 2015)

  New Revision: 52764

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=52764

  Log:
    * lib/net/http.rb (connect): detect closed connection and reconnect
      If the server closes a keep-alive http connection, the client socket
      reaches EOF. To avoid an EOFError, detect the closed connection and
      reconnect.
      Added test to ensure HTTP#post succeeds even if the
      keep-alive-connection has been closed by the server.
      by Kristian Hanekamp <kris.hanekamp@g...>
      https://github.com/ruby/ruby/pull/1089 fix GH-1089

  Modified files:
    trunk/ChangeLog
    trunk/lib/net/http.rb
    trunk/test/net/http/test_http.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 52763)
+++ ChangeLog	(revision 52764)
@@ -1,3 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Nov 27 19:19:44 2015  NARUSE, Yui  <naruse@r...>
+
+	* lib/net/http.rb (connect): detect closed connection and reconnect
+	  If the server closes a keep-alive http connection, the client socket
+	  reaches EOF. To avoid an EOFError, detect the closed connection and
+	  reconnect.
+	  Added test to ensure HTTP#post succeeds even if the
+	  keep-alive-connection has been closed by the server.
+	  by Kristian Hanekamp <kris.hanekamp@g...>
+	  https://github.com/ruby/ruby/pull/1089 fix GH-1089
+
 Thu Nov 26 21:36:40 2015  Nobuyoshi Nakada  <nobu@r...>
 
 	* compile.c (iseq_peephole_optimize): enable tail call
Index: lib/net/http.rb
===================================================================
--- lib/net/http.rb	(revision 52763)
+++ lib/net/http.rb	(revision 52764)
@@ -1473,10 +1473,16 @@ module Net   #:nodoc: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L1473
     def begin_transport(req)
       if @socket.closed?
         connect
-      elsif @last_communicated && @last_communicated + @keep_alive_timeout < Process.clock_gettime(Process::CLOCK_MONOTONIC)
-        D 'Conn close because of keep_alive_timeout'
-        @socket.close
-        connect
+      elsif @last_communicated
+        if @last_communicated + @keep_alive_timeout < Process.clock_gettime(Process::CLOCK_MONOTONIC)
+          D 'Conn close because of keep_alive_timeout'
+          @socket.close
+          connect
+        elsif @socket.io.wait_readable(0) && @socket.eof?
+          D "Conn close because of EOF"
+          @socket.close
+          connect
+        end
       end
 
       if not req.response_body_permitted? and @close_on_empty_response
Index: test/net/http/test_http.rb
===================================================================
--- test/net/http/test_http.rb	(revision 52763)
+++ test/net/http/test_http.rb	(revision 52764)
@@ -896,6 +896,23 @@ class TestNetHTTPKeepAlive < Test::Unit: https://github.com/ruby/ruby/blob/trunk/test/net/http/test_http.rb#L896
     }
   end
 
+  def test_server_closed_connection_auto_reconnect
+    start {|http|
+      res = http.get('/')
+      http.keep_alive_timeout = 5
+      assert_kind_of Net::HTTPResponse, res
+      assert_kind_of String, res.body
+      sleep 1.5
+      assert_nothing_raised {
+        # Net::HTTP should detect the closed connection before attempting the
+        # request, since post requests cannot be retried.
+        res = http.post('/', 'query=foo', 'content-type' => 'application/x-www-form-urlencoded')
+      }
+      assert_kind_of Net::HTTPResponse, res
+      assert_kind_of String, res.body
+    }
+  end
+
   def test_keep_alive_get_auto_retry
     start {|http|
       res = http.get('/')

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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