diff --git a/lib/net/http.rb b/lib/net/http.rb index 8ac80a4f..101a669d 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -2350,7 +2350,10 @@ def transport_request(req) res } res.reading_body(@socket, req.response_body_permitted?) { - yield res if block_given? + if block_given? + count = max_retries # Don't restart in the middle of a download + yield res + end } rescue Net::OpenTimeout raise diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb index 53092ee0..f0f1bc2d 100644 --- a/test/net/http/test_http.rb +++ b/test/net/http/test_http.rb @@ -1234,6 +1234,16 @@ def test_http_retry_failed } end + def test_http_retry_failed_with_block + start {|http| + http.max_retries = 10 + called = 0 + assert_raise(Errno::ECONNRESET){ http.get('/'){called += 1; raise Errno::ECONNRESET} } + assert_equal 1, called + } + @log_tester = nil + end + def test_keep_alive_server_close def @server.run(sock) sock.close