diff --git a/History.md b/History.md index 91d737993f..e2a015a895 100644 --- a/History.md +++ b/History.md @@ -10,6 +10,7 @@ * Bugfixes * Your bugfix goes here (#Github Number) * Windows update extconf.rb for use with ssp and varied Ruby/MSYS2 combinations (#2069) + * Send 408 request timeout even when queue requests is disabled (#2119) * Refactor * Remove unused loader argument from Plugin initializer (#2095) diff --git a/lib/puma/client.rb b/lib/puma/client.rb index 62d3557273..8a37736aaf 100644 --- a/lib/puma/client.rb +++ b/lib/puma/client.rb @@ -243,10 +243,13 @@ def eagerly_finish send(:alias_method, :jruby_eagerly_finish, :eagerly_finish) end # IS_JRUBY - def finish + def finish(timeout) return true if @ready until try_to_finish - IO.select([@to_io], nil, nil) + unless IO.select([@to_io], nil, nil, timeout) + write_error(408) if in_data_phase + raise ConnectionError + end end true end diff --git a/lib/puma/server.rb b/lib/puma/server.rb index d532e258cc..c5579bb1b4 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -308,7 +308,7 @@ def run(background=true) if queue_requests process_now = client.eagerly_finish else - client.finish + client.finish(@first_data_timeout) process_now = true end rescue MiniSSL::SSLError => e diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 4321b9bf88..a43a3c974a 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -336,6 +336,11 @@ def test_timeout_in_data_phase assert_equal "HTTP/1.1 408 Request Timeout\r\n", data end + def test_timeout_data_no_queue + @server = Puma::Server.new @app, @events, queue_requests: false + test_timeout_in_data_phase + end + def test_http_11_keep_alive_with_body server_run app: ->(env) { [200, {"Content-Type" => "plain/text"}, ["hello\n"]] }