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