From f4654b6398caa8b493dc54c3b2533d5f9818d35b Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 2 Mar 2024 11:24:04 +0100 Subject: [PATCH 1/2] Don't set connection close headers when they are already set on the Response --- h11/_connection.py | 5 +++-- h11/tests/test_connection.py | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/h11/_connection.py b/h11/_connection.py index e37d82a..d479bb8 100644 --- a/h11/_connection.py +++ b/h11/_connection.py @@ -648,8 +648,9 @@ def _clean_up_response_headers_for_sending(self, response: Response) -> Response # Make sure Connection: close is set connection = set(get_comma_header(headers, b"connection")) connection.discard(b"keep-alive") - connection.add(b"close") - headers = set_comma_header(headers, b"connection", sorted(connection)) + if b"close" not in connection: + connection.add(b"close") + headers = set_comma_header(headers, b"connection", sorted(connection)) return Response( headers=headers, diff --git a/h11/tests/test_connection.py b/h11/tests/test_connection.py index 01260dc..ae2d462 100644 --- a/h11/tests/test_connection.py +++ b/h11/tests/test_connection.py @@ -1118,3 +1118,8 @@ def test_special_exceptions_for_lost_connection_in_message_body() -> None: with pytest.raises(RemoteProtocolError) as excinfo: c.next_event() assert "incomplete chunked read" in str(excinfo.value) + +def test_ensure_connection_close_remains_untouched() -> None: + c = Connection(SERVER) + data = c.send(Response(status_code=200, headers=[(b"connection", b"close")])) # type: ignore[arg-type] + assert data == b"HTTP/1.1 200 \r\n" b"connection: close\r\n\r\n" From a76b5b1e4b5447fe395db0d24599879c614e1db7 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sun, 3 Mar 2024 09:29:59 +0100 Subject: [PATCH 2/2] Fix linter --- h11/tests/test_connection.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/h11/tests/test_connection.py b/h11/tests/test_connection.py index ae2d462..dde6765 100644 --- a/h11/tests/test_connection.py +++ b/h11/tests/test_connection.py @@ -1119,7 +1119,8 @@ def test_special_exceptions_for_lost_connection_in_message_body() -> None: c.next_event() assert "incomplete chunked read" in str(excinfo.value) + def test_ensure_connection_close_remains_untouched() -> None: c = Connection(SERVER) - data = c.send(Response(status_code=200, headers=[(b"connection", b"close")])) # type: ignore[arg-type] + data = c.send(Response(status_code=200, headers=[(b"connection", b"close")])) assert data == b"HTTP/1.1 200 \r\n" b"connection: close\r\n\r\n"