diff --git a/CHANGES/7895.bugfix b/CHANGES/7895.bugfix new file mode 100644 index 00000000000..557df294d71 --- /dev/null +++ b/CHANGES/7895.bugfix @@ -0,0 +1 @@ +Fixed messages being reported as upgraded without an Upgrade header in Python parser. -- by :user:`Dreamsorcerer` diff --git a/aiohttp/http_parser.py b/aiohttp/http_parser.py index b3462d5db55..48d014d0045 100644 --- a/aiohttp/http_parser.py +++ b/aiohttp/http_parser.py @@ -503,7 +503,8 @@ def parse_headers( close_conn = True elif v == "keep-alive": close_conn = False - elif v == "upgrade": + # https://www.rfc-editor.org/rfc/rfc9110.html#name-101-switching-protocols + elif v == "upgrade" and headers.get(hdrs.UPGRADE): upgrade = True # encoding diff --git a/tests/test_http_parser.py b/tests/test_http_parser.py index 8cbf3b4e774..cb3a8ef2a09 100644 --- a/tests/test_http_parser.py +++ b/tests/test_http_parser.py @@ -473,6 +473,15 @@ def test_conn_upgrade(parser: Any) -> None: assert upgrade +def test_bad_upgrade(parser: Any) -> None: + """Test not upgraded if missing Upgrade header.""" + text = b"GET /test HTTP/1.1\r\nconnection: upgrade\r\n\r\n" + messages, upgrade, tail = parser.feed_data(text) + msg = messages[0][0] + assert not msg.upgrade + assert not upgrade + + def test_compression_empty(parser: Any) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: \r\n\r\n" messages, upgrade, tail = parser.feed_data(text)