@@ -63,6 +63,24 @@ def test_received_bad_host_header(self):
6363 self .assertTrue (self .parser .completed )
6464 self .assertIsInstance (self .parser .error , BadRequest )
6565
66+ def test_received_duplicate_host_header (self ):
67+ # RFC 9112: MUST reject HTTP/1.1 requests with more than one Host header
68+ data = b"GET / HTTP/1.1\r \n HOST: test1.com\r \n Host: test2.com\r \n \r \n "
69+ result = self .parser .received (data )
70+ self .assertEqual (result , len (data ))
71+ self .assertTrue (self .parser .completed )
72+ self .assertIsInstance (self .parser .error , BadRequest )
73+ self .assertTrue (self .parser .error .body .startswith ("Duplicate header:" ))
74+
75+ def test_received_duplicate_content_length_header (self ):
76+ # RFC 7230: MUST reject requests with duplicate Content-Length headers
77+ data = b"GET / HTTP/1.1\r \n Host: example.com\r \n Content-Length: 10\r \n Content-Length: 20\r \n \r \n "
78+ result = self .parser .received (data )
79+ self .assertEqual (result , len (data ))
80+ self .assertTrue (self .parser .completed )
81+ self .assertIsInstance (self .parser .error , BadRequest )
82+ self .assertTrue (self .parser .error .body .startswith ("Duplicate header:" ))
83+
6684 def test_received_bad_transfer_encoding (self ):
6785 data = (
6886 b"GET /foobar HTTP/1.1\r \n "
@@ -227,7 +245,7 @@ def test_parse_header_multiple_content_length(self):
227245 try :
228246 self .parser .parse_header (data )
229247 except ParsingError as e :
230- self .assertIn ( "Content-Length is invalid" , e .args [0 ])
248+ self .assertTrue ( e .args [0 ]. startswith ( "Duplicate header:" ) )
231249 else : # pragma: nocover
232250 self .assertTrue (False )
233251
0 commit comments