Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cheroot/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1904,7 +1904,7 @@ def _serve_unservicable(self):
# We can't just raise an exception because that will kill this
# thread, and prevent 503 errors from being sent to future
# connections.
self.server.error_log(
self.error_log(
repr(ex),
level=logging.ERROR,
traceback=True,
Expand Down
39 changes: 39 additions & 0 deletions cheroot/test/test_server.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"""Tests for the HTTP server."""

import logging
import os
import pathlib
import queue
Expand Down Expand Up @@ -127,6 +128,44 @@ def test_stop_interrupts_serve():
assert not serve_thread.is_alive()


def test_unservicable_conn_logs_unexpected_response_errors(monkeypatch):
"""Check that unexpected 503 response errors are logged."""
httpserver = HTTPServer(
bind_addr=(ANY_INTERFACE_IPV4, EPHEMERAL_PORT),
gateway=Gateway,
)
test_exception = RuntimeError('unexpected 503 response error')
close_calls = []
log_entries = []

def close_conn():
close_calls.append(None)
httpserver.ready = False

def simple_response(_request, _status):
raise test_exception

def log_error(*args, **kwargs):
log_entries.append((args, kwargs))

conn = types.SimpleNamespace(linger=False, close=close_conn)
httpserver.error_log = log_error
httpserver.ready = True
httpserver._unservicable_conns.put(conn)
monkeypatch.setattr(
'cheroot.server.HTTPRequest.simple_response',
simple_response,
)

httpserver._serve_unservicable()

assert log_entries == [
((repr(test_exception),), {'level': logging.ERROR, 'traceback': True}),
]
assert conn.linger is True
assert close_calls == [None]


@pytest.mark.parametrize(
'exc_cls',
(
Expand Down
Loading