@@ -351,6 +351,51 @@ def test_invalid_headers(self):
351351 with self .assertRaisesRegex (ValueError , 'Invalid header' ):
352352 conn .putheader (name , value )
353353
354+ def test_invalid_tunnel_headers (self ):
355+ cases = (
356+ ('Invalid\r \n Name' , 'ValidValue' ),
357+ ('Invalid\r Name' , 'ValidValue' ),
358+ ('Invalid\n Name' , 'ValidValue' ),
359+ ('\r \n InvalidName' , 'ValidValue' ),
360+ ('\r InvalidName' , 'ValidValue' ),
361+ ('\n InvalidName' , 'ValidValue' ),
362+ (' InvalidName' , 'ValidValue' ),
363+ ('\t InvalidName' , 'ValidValue' ),
364+ ('Invalid:Name' , 'ValidValue' ),
365+ (':InvalidName' , 'ValidValue' ),
366+ ('ValidName' , 'Invalid\r \n Value' ),
367+ ('ValidName' , 'Invalid\r Value' ),
368+ ('ValidName' , 'Invalid\n Value' ),
369+ ('ValidName' , 'InvalidValue\r \n ' ),
370+ ('ValidName' , 'InvalidValue\r ' ),
371+ ('ValidName' , 'InvalidValue\n ' ),
372+ )
373+ for name , value in cases :
374+ with self .subTest ((name , value )):
375+ conn = client .HTTPConnection ('example.com' )
376+ conn .set_tunnel ('tunnel' , headers = {
377+ name : value
378+ })
379+ conn .sock = FakeSocket ('' )
380+ with self .assertRaisesRegex (ValueError , 'Invalid header' ):
381+ conn ._tunnel () # Called in .connect()
382+
383+ def test_invalid_tunnel_host (self ):
384+ cases = (
385+ 'invalid\r .host' ,
386+ '\n invalid.host' ,
387+ 'invalid.host\r \n ' ,
388+ 'invalid.host\x00 ' ,
389+ 'invalid host' ,
390+ )
391+ for tunnel_host in cases :
392+ with self .subTest (tunnel_host ):
393+ conn = client .HTTPConnection ('example.com' )
394+ conn .set_tunnel (tunnel_host )
395+ conn .sock = FakeSocket ('' )
396+ with self .assertRaisesRegex (ValueError , 'Tunnel host can\' t contain control characters' ):
397+ conn ._tunnel () # Called in .connect()
398+
354399 def test_headers_debuglevel (self ):
355400 body = (
356401 b'HTTP/1.1 200 OK\r \n '
0 commit comments