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