From 7e11ad1b451342556cf4b04a24edc9f0e1f4675d Mon Sep 17 00:00:00 2001 From: Will Jordan Date: Tue, 20 Apr 2021 10:30:16 -0700 Subject: [PATCH 1/2] Fix timing out when we get a slow request Fixes #2574 (regression in v5.0.3). Co-authored-by: Daniel Huckstep Co-authored-by: Will Jordan --- lib/puma/server.rb | 3 +++ test/test_puma_server.rb | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/lib/puma/server.rb b/lib/puma/server.rb index d0e09a341a..aa21a24690 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -295,6 +295,9 @@ def reactor_wakeup(client) @thread_pool << client elsif shutdown || client.timeout == 0 client.timeout! + else + client.set_timeout(@first_data_timeout) + false end rescue StandardError => e client_error(e, client) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 5e591171bf..edd7f4934d 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -398,6 +398,30 @@ def test_timeout_data_no_queue test_timeout_in_data_phase end + # https://github.com/puma/puma/issues/2574 + def test_no_timeout_after_data_received + @server.first_data_timeout = 1 + server_run + + sock = send_http "POST / HTTP/1.1\r\nHost: test.com\r\nContent-Type: text/plain\r\nContent-Length: 11\r\n\r\n" + sleep 0.5 + + sock << "hello" + sleep 0.5 + sock << "world" + sleep 0.5 + sock << "!" + + data = sock.gets + + assert_equal "HTTP/1.1 200 OK\r\n", data + end + + def test_no_timeout_after_data_received_no_queue + @server = Puma::Server.new @app, @events, queue_requests: false + test_no_timeout_after_data_received + end + def test_http_11_keep_alive_with_body server_run app: ->(env) { [200, {"Content-Type" => "plain/text"}, ["hello\n"]] } From 9b5604b7739db378ad89a2bdb443178eace86b58 Mon Sep 17 00:00:00 2001 From: Will Jordan Date: Tue, 20 Apr 2021 11:46:26 -0700 Subject: [PATCH 2/2] Update test_timeout_in_data_phase Complete request to ensure short timeout is used properly. --- test/test_puma_server.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index edd7f4934d..226e85167c 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -383,11 +383,13 @@ def test_status_hook_fires_when_server_changes_states end def test_timeout_in_data_phase - @server.first_data_timeout = 2 + @server.first_data_timeout = 1 server_run sock = send_http "POST / HTTP/1.1\r\nHost: test.com\r\nContent-Type: text/plain\r\nContent-Length: 5\r\n\r\n" + sock << "Hello" unless IO.select([sock], nil, nil, 1.15) + data = sock.gets assert_equal "HTTP/1.1 408 Request Timeout\r\n", data