diff --git a/Lib/http/server.py b/Lib/http/server.py index 2fdfc78725ea4b..5463b84ff1c814 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -662,7 +662,8 @@ def log_message(self, format, *args): """ message = (format % args).translate(self._control_char_table) - t = _colorize.get_theme(tty_file=sys.stderr).http_server + stderr = sys.stderr + t = _colorize.get_theme(tty_file=stderr).http_server info = getattr(self, "_log_request_info", None) if info is not None: @@ -672,7 +673,9 @@ def log_message(self, format, *args): self._log_is_error = False message = f"{t.error}{message}{t.reset}" - sys.stderr.write( + if stderr is None: + return + stderr.write( f"{t.timestamp}{self.address_string()} - - " f"[{self.log_date_time_string()}]{t.reset} " f"{message}\n" diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 63f65a9c5cf47a..29ae639f388a53 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1052,6 +1052,24 @@ def verify_http_server_response(self, response): match = self.HTTPResponseMatch.search(response) self.assertIsNotNone(match) + @force_not_colorized + def test_request_without_stderr(self): + self.handler.client_address = ('127.0.0.1', 1337) + log_message = BaseHTTPRequestHandler.log_message.__get__(self.handler) + with mock.patch.object(self.handler, 'log_message', log_message): + for method, status in ((b'GET', b'200 OK'), + (b'UNKNOWN', b'501 Unsupported method')): + with self.subTest(method=method): + with mock.patch.object(sys, 'stderr', None): + result = self.send_typical_request( + method + b' / HTTP/1.1\r\n\r\n') + self.assertIn(status, result[0]) + self.assertIsNone(self.handler._log_request_info) + self.assertFalse(getattr(self.handler, '_log_is_error', False)) + with support.captured_stderr() as stderr: + self.handler.log_message('logging restored') + self.assertEndsWith(stderr.getvalue(), 'logging restored\n') + @force_not_colorized def test_unprintable_not_logged(self): # We call the method from the class directly as our Socketless diff --git a/Misc/NEWS.d/next/Library/2026-10-13-20-00-00.gh-issue-89057.eR4qPt.rst b/Misc/NEWS.d/next/Library/2026-10-13-20-00-00.gh-issue-89057.eR4qPt.rst new file mode 100644 index 00000000000000..17b6aec9718046 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-10-13-20-00-00.gh-issue-89057.eR4qPt.rst @@ -0,0 +1,2 @@ +Fix :class:`http.server.BaseHTTPRequestHandler` failing to send responses +when :data:`sys.stderr` is ``None``, for example when running with ``pythonw``.