Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[close #2371] Do not log EOFError #2384

Merged
merged 3 commits into from Sep 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions History.md
Expand Up @@ -9,6 +9,7 @@
* Prevent connections from entering Reactor after shutdown begins ([#2377])
* Fix error backtrace debug logging && Do not log request dump if it is not parsed ([#2376])
* Split TCP_CORK and TCP_INFO ([#2372])
* Do not log EOFError when a client connection is closed without write (#2384)

* Refactor
* Change Events#ssl_error signature from (error, peeraddr, peercert) to (error, ssl_socket) ([#2375])
Expand Down
4 changes: 3 additions & 1 deletion lib/puma/client.rb
Expand Up @@ -157,7 +157,9 @@ def try_to_finish
data = @io.read_nonblock(CHUNK_SIZE)
rescue IO::WaitReadable
return false
rescue SystemCallError, IOError, EOFError
rescue EOFError
# Swallow error, don't log
rescue SystemCallError, IOError
raise ConnectionError, "Connection error detected during read"
end

Expand Down
6 changes: 5 additions & 1 deletion lib/puma/server.rb
Expand Up @@ -246,7 +246,11 @@ def run(background=true)
client.close

@events.parse_error e, client
rescue ConnectionError, EOFError, ThreadPool::ForceShutdown => e
rescue EOFError => e
client.close

# Swallow, do not log
rescue ConnectionError, ThreadPool::ForceShutdown => e
client.close

@events.connection_error e, client
Expand Down
11 changes: 11 additions & 0 deletions test/test_puma_server.rb
Expand Up @@ -256,6 +256,17 @@ def test_doesnt_print_backtrace_in_production
assert_match(/HTTP\/1.0 500 Internal Server Error/, data)
end


def test_eof_on_connection_close_is_not_logged_as_an_error
server_run

new_connection.close # Make a connection and close without writing

@server.stop(true)
stderr = @events.stderr.string
assert stderr.empty?, "Expected stderr from server to be empty but it was #{stderr.inspect}"
end

def test_force_shutdown_custom_error_message
handler = lambda {|err, env, status| [500, {"Content-Type" => "application/json"}, ["{}\n"]]}
@server = Puma::Server.new @app, @events, {:lowlevel_error_handler => handler, :force_shutdown_after => 2}
Expand Down