@@ -509,6 +509,24 @@ def test_conn_keep_alive_1_1(parser: HttpRequestParser) -> None:
509509 assert not msg .should_close
510510
511511
512+ def test_conn_close_comma_list (parser : HttpRequestParser ) -> None :
513+ text = b"GET /test HTTP/1.1\r \n connection: close, keep-alive\r \n \r \n "
514+ messages , upgrade , tail = parser .feed_data (text )
515+ msg = messages [0 ][0 ]
516+ assert msg .should_close
517+
518+
519+ def test_conn_close_multiple_headers (parser : HttpRequestParser ) -> None :
520+ text = (
521+ b"GET /test HTTP/1.1\r \n "
522+ b"connection: keep-alive\r \n "
523+ b"connection: close\r \n \r \n "
524+ )
525+ messages , upgrade , tail = parser .feed_data (text )
526+ msg = messages [0 ][0 ]
527+ assert msg .should_close
528+
529+
512530def test_conn_other_1_0 (parser : HttpRequestParser ) -> None :
513531 text = b"GET /test HTTP/1.0\r \n connection: test\r \n \r \n "
514532 messages , upgrade , tail = parser .feed_data (text )
@@ -609,6 +627,33 @@ def test_conn_upgrade(parser: HttpRequestParser) -> None:
609627 assert upgrade
610628
611629
630+ def test_conn_upgrade_comma_list (parser : HttpRequestParser ) -> None :
631+ text = (
632+ b"GET /test HTTP/1.1\r \n "
633+ b"connection: keep-alive, upgrade\r \n "
634+ b"upgrade: websocket\r \n \r \n "
635+ )
636+ messages , upgrade , tail = parser .feed_data (text )
637+ msg = messages [0 ][0 ]
638+ assert not msg .should_close
639+ assert msg .upgrade
640+ assert upgrade
641+
642+
643+ def test_conn_upgrade_multiple_headers (parser : HttpRequestParser ) -> None :
644+ text = (
645+ b"GET /test HTTP/1.1\r \n "
646+ b"connection: keep-alive\r \n "
647+ b"connection: upgrade\r \n "
648+ b"upgrade: websocket\r \n \r \n "
649+ )
650+ messages , upgrade , tail = parser .feed_data (text )
651+ msg = messages [0 ][0 ]
652+ assert not msg .should_close
653+ assert msg .upgrade
654+ assert upgrade
655+
656+
612657def test_bad_upgrade (parser : HttpRequestParser ) -> None :
613658 """Test not upgraded if missing Upgrade header."""
614659 text = b"GET /test HTTP/1.1\r \n connection: upgrade\r \n \r \n "
@@ -984,6 +1029,14 @@ def test_http_request_message_after_close(parser: HttpRequestParser) -> None:
9841029 parser .feed_data (text )
9851030
9861031
1032+ def test_http_request_message_after_close_comma_list (parser : HttpRequestParser ) -> None :
1033+ text = b"GET / HTTP/1.1\r \n Connection: close, keep-alive\r \n \r \n Invalid\r \n \r \n "
1034+ with pytest .raises (
1035+ http_exceptions .BadHttpMessage , match = "Data after `Connection: close`"
1036+ ):
1037+ parser .feed_data (text )
1038+
1039+
9871040def test_http_request_upgrade (parser : HttpRequestParser ) -> None :
9881041 text = (
9891042 b"GET /test HTTP/1.1\r \n "
0 commit comments