[#41431] [ruby-trunk - Bug #5694][Open] Proc#arity doesn't take optional arguments into account. — Marc-Andre Lafortune <ruby-core@...>

27 messages 2011/12/01
[#41442] [ruby-trunk - Bug #5694] Proc#arity doesn't take optional arguments into account. — Thomas Sawyer <transfire@...> 2011/12/01

[#41443] Re: [ruby-trunk - Bug #5694] Proc#arity doesn't take optional arguments into account. — Yehuda Katz <wycats@...> 2011/12/01

Maybe we can add a new arity_range method that does this?

[#41496] [ruby-trunk - Bug #5714][Open] Unexpected error of STDIN#read with non-ascii input on Windows XP — Heesob Park <phasis@...>

22 messages 2011/12/06

[#41511] [ruby-trunk - Bug #5719][Open] Hash::[] can't handle 100000+ args — Nick Quaranto <nick@...>

13 messages 2011/12/07

[#41557] [ruby-trunk - Bug #5730][Open] Optinal block parameters assigns wrong — Yukihiro Matsumoto <matz@...>

14 messages 2011/12/08

[#41586] [ruby-trunk - Feature #5741][Open] Secure Erasure of Passwords — Martin Bosslet <Martin.Bosslet@...>

17 messages 2011/12/10

[#41672] [ruby-trunk - Feature #5767][Open] Cache expanded_load_path to reduce startup time — Yura Sokolov <funny.falcon@...>

13 messages 2011/12/15

[#41681] Documentation of the language itself (syntax, meanings, etc) — Rodrigo Rosenfeld Rosas <rr.rosas@...>

Since Ruby is built on top of simple concepts, most of the documentation

23 messages 2011/12/15
[#41683] Re: Documentation of the language itself (syntax, meanings, etc) — Gary Wright <gwtmp01@...> 2011/12/15

[#41686] Re: Documentation of the language itself (syntax, meanings, etc) — Rodrigo Rosenfeld Rosas <rr.rosas@...> 2011/12/16

Em 15-12-2011 19:23, Gary Wright escreveu:

[#41717] Feature : optional argument in File.join — Michel Demazure <michel@...>

In Windows, when using File.join, one often ends with a path containing

13 messages 2011/12/19
[#41719] Re: Feature : optional argument in File.join — Luis Lavena <luislavena@...> 2011/12/19

On Mon, Dec 19, 2011 at 6:09 AM, Michel Demazure <michel@demazure.com> wrot=

[#41720] Re: Feature : optional argument in File.join — Michel Demazure <michel@...> 2011/12/19

Luis Lavena wrote in post #1037331:

[#41728] [ruby-trunk - Feature #5781][Open] Query attributes (attribute methods ending in `?` mark) — Thomas Sawyer <transfire@...>

15 messages 2011/12/19

[#41799] Best way to separate implementation specific code? — Luis Lavena <luislavena@...>

Hello,

15 messages 2011/12/24
[#41800] Re: Best way to separate implementation specific code? — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/24

2011/12/24 Luis Lavena <luislavena@gmail.com>:

[#41811] Re: Best way to separate implementation specific code? — "U.Nakamura" <usa@...> 2011/12/26

Hello,

[#41817] Re: Best way to separate implementation specific code? — Luis Lavena <luislavena@...> 2011/12/26

On Sun, Dec 25, 2011 at 10:51 PM, U.Nakamura <usa@garbagecollect.jp> wrote:

[#41812] [ruby-trunk - Feature #5809][Open] Benchmark#bm: remove the label_width parameter — Benoit Daloze <redmine@...>

11 messages 2011/12/26

[ruby-core:41821] [ruby-trunk - Bug #5813][Assigned] net/http's EOFError and Keep-Alive

From: Yui NARUSE <naruse@...>
Date: 2011-12-27 05:56:53 UTC
List: ruby-core #41821
Issue #5813 has been reported by Yui NARUSE.

----------------------------------------
Bug #5813: net/http's EOFError and Keep-Alive
https://bugs.ruby-lang.org/issues/5813

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Yui NARUSE
Category: 
Target version: 
ruby -v: ruby 2.0.0dev (2011-12-21 trunk 34086) [x86_64-freebsd9.0]


[ruby-dev:39421] describes exceptions thrown by open-uri, and raise a question why net/http raises EOFError.

net/http sometimes raises EOFError.
I recently find it is because of Keep-Alive.
On HTTP/1.1, connections are Keep-Alive and a Keep-Alive connection has a timeout.
If a client of such connection doesn't send anything after some communication,
server closes the connection because of Keep-Alive timeout,
and the client's connection shall raise EOFError (sometimes it may be ECONNRESET).

HTTP/1.1 says a client should retry a request if the request is idempotent.
http://tools.ietf.org/html/rfc2616#section-8.1.4
http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-17#section-6.1.5
http://www.studyinghttp.net/connections
So I attached a patch to such retry to net/http.

FYI, this timeout of Keep-Alive, KeepAliveTimeout, is:
Apache in FreeBSD ports or pkgsrc is 5 seconds,
the on in Debian Packages or RPM is 15 seconds.

diff --git a/lib/net/http.rb b/lib/net/http.rb
index 879cfe0..13bd1a7 100644
--- a/lib/net/http.rb
+++ b/lib/net/http.rb
@@ -1332,7 +1332,10 @@ module Net   #:nodoc:
       res
     end
 
+    IDEMPOTENT_METHODS_ = %w/GET HEAD PUT DELETE OPTIONS TRACE/ # :nodoc:
+
     def transport_request(req)
+      count = 0
       begin_transport req
       res = catch(:response) {
         req.exec @socket, @curr_http_version, edit_path(req.path)
@@ -1346,6 +1349,16 @@ module Net   #:nodoc:
       }
       end_transport req, res
       res
+    rescue EOFError, Errno::ECONNRESET => exception
+      if count == 0 && IDEMPOTENT_METHODS_.include?(req.method)
+        count += 1
+        @socket.close if @socket and not @socket.closed?
+        D "Conn close because of error #{exception}, and retry"
+        retry
+      end
+      D "Conn close because of error #{exception}"
+      @socket.close if @socket and not @socket.closed?
+      raise
     rescue => exception
       D "Conn close because of error #{exception}"
       @socket.close if @socket and not @socket.closed?
diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb
index 1515854..2e7ab4e 100644
--- a/test/net/http/test_http.rb
+++ b/test/net/http/test_http.rb
@@ -564,3 +564,29 @@ class TestNetHTTPContinue < Test::Unit::TestCase
     assert_not_match(/HTTP\/1.1 100 continue/, @debug.string)
   end
 end
+
+class TestNetHTTPKeepAlive < Test::Unit::TestCase
+  CONFIG = {
+    'host' => '127.0.0.1',
+    'port' => 10081,
+    'proxy_host' => nil,
+    'proxy_port' => nil,
+    'RequestTimeout' => 0.1,
+  }
+
+  include TestNetHTTPUtils
+
+  def test_keep_alive_get
+    start {|http|
+      res = http.get('/')
+      assert_kind_of Net::HTTPResponse, res
+      assert_kind_of String, res.body
+      sleep 1
+      assert_nothing_raised {
+        res = http.get('/')
+      }
+      assert_kind_of Net::HTTPResponse, res
+      assert_kind_of String, res.body
+    }
+  end
+end
diff --git a/test/net/http/utils.rb b/test/net/http/utils.rb
index 50f616f..07e0b9f 100644
--- a/test/net/http/utils.rb
+++ b/test/net/http/utils.rb
@@ -51,6 +51,7 @@ module TestNetHTTPUtils
       :ServerType => Thread,
     }
     server_config[:OutputBufferSize] = 4 if config('chunked')
+    server_config[:RequestTimeout] = config('RequestTimeout') if config('RequestTimeout')
     if defined?(OpenSSL) and config('ssl_enable')
       server_config.update({
         :SSLEnable      => true,


-- 
http://redmine.ruby-lang.org

In This Thread

Prev Next