@@ -371,6 +371,51 @@ def test_invalid_headers(self):
371371 with self .assertRaisesRegex (ValueError , 'Invalid header' ):
372372 conn .putheader (name , value )
373373
374+ def test_invalid_tunnel_headers (self ):
375+ cases = (
376+ ('Invalid\r \n Name' , 'ValidValue' ),
377+ ('Invalid\r Name' , 'ValidValue' ),
378+ ('Invalid\n Name' , 'ValidValue' ),
379+ ('\r \n InvalidName' , 'ValidValue' ),
380+ ('\r InvalidName' , 'ValidValue' ),
381+ ('\n InvalidName' , 'ValidValue' ),
382+ (' InvalidName' , 'ValidValue' ),
383+ ('\t InvalidName' , 'ValidValue' ),
384+ ('Invalid:Name' , 'ValidValue' ),
385+ (':InvalidName' , 'ValidValue' ),
386+ ('ValidName' , 'Invalid\r \n Value' ),
387+ ('ValidName' , 'Invalid\r Value' ),
388+ ('ValidName' , 'Invalid\n Value' ),
389+ ('ValidName' , 'InvalidValue\r \n ' ),
390+ ('ValidName' , 'InvalidValue\r ' ),
391+ ('ValidName' , 'InvalidValue\n ' ),
392+ )
393+ for name , value in cases :
394+ with self .subTest ((name , value )):
395+ conn = client .HTTPConnection ('example.com' )
396+ conn .set_tunnel ('tunnel' , headers = {
397+ name : value
398+ })
399+ conn .sock = FakeSocket ('' )
400+ with self .assertRaisesRegex (ValueError , 'Invalid header' ):
401+ conn ._tunnel () # Called in .connect()
402+
403+ def test_invalid_tunnel_host (self ):
404+ cases = (
405+ 'invalid\r .host' ,
406+ '\n invalid.host' ,
407+ 'invalid.host\r \n ' ,
408+ 'invalid.host\x00 ' ,
409+ 'invalid host' ,
410+ )
411+ for tunnel_host in cases :
412+ with self .subTest (tunnel_host ):
413+ conn = client .HTTPConnection ('example.com' )
414+ conn .set_tunnel (tunnel_host )
415+ conn .sock = FakeSocket ('' )
416+ with self .assertRaisesRegex (ValueError , 'Tunnel host can\' t contain control characters' ):
417+ conn ._tunnel () # Called in .connect()
418+
374419 def test_headers_debuglevel (self ):
375420 body = (
376421 b'HTTP/1.1 200 OK\r \n '
0 commit comments