@@ -1041,47 +1041,64 @@ def test_getting_header_defaultint(self):
10411041 self .assertEqual (header , 42 )
10421042
10431043class TunnelTests (TestCase ):
1044-
1045- def test_connect (self ):
1044+ def setUp (self ):
10461045 response_text = (
10471046 'HTTP/1.0 200 OK\r \n \r \n ' # Reply to CONNECT
10481047 'HTTP/1.1 200 OK\r \n ' # Reply to HEAD
10491048 'Content-Length: 42\r \n \r \n '
10501049 )
10511050
10521051 def create_connection (address , timeout = None , source_address = None ):
1053- return FakeSocket (response_text , host = address [0 ],
1054- port = address [1 ])
1052+ return FakeSocket (response_text , host = address [0 ], port = address [1 ])
10551053
1056- conn = client .HTTPConnection ('proxy.com' )
1057- conn ._create_connection = create_connection
1054+ self .host = 'proxy.com'
1055+ self .conn = client .HTTPConnection (self .host )
1056+ self .conn ._create_connection = create_connection
10581057
1058+ def tearDown (self ):
1059+ self .conn .close ()
1060+
1061+ def test_set_tunnel_host_port_headers (self ):
1062+ tunnel_host = 'destination.com'
1063+ tunnel_port = 8888
1064+ tunnel_headers = {'User-Agent' : 'Mozilla/5.0 (compatible, MSIE 11)' }
1065+ self .conn .set_tunnel (tunnel_host , port = tunnel_port ,
1066+ headers = tunnel_headers )
1067+ self .conn .request ('HEAD' , '/' , '' )
1068+ self .assertEqual (self .conn .sock .host , self .host )
1069+ self .assertEqual (self .conn .sock .port , client .HTTP_PORT )
1070+ self .assertEqual (self .conn ._tunnel_host , tunnel_host )
1071+ self .assertEqual (self .conn ._tunnel_port , tunnel_port )
1072+ self .assertEqual (self .conn ._tunnel_headers , tunnel_headers )
1073+
1074+ def test_disallow_set_tunnel_after_connect (self ):
10591075 # Once connected, we shouldn't be able to tunnel anymore
1060- conn .connect ()
1061- self .assertRaises (RuntimeError , conn .set_tunnel ,
1076+ self . conn .connect ()
1077+ self .assertRaises (RuntimeError , self . conn .set_tunnel ,
10621078 'destination.com' )
10631079
1064- # But if we close the connection, we're good
1065- conn .close ()
1066- conn .set_tunnel ('destination.com' )
1067- conn .request ('HEAD' , '/' , '' )
1068-
1069- self .assertEqual (conn .sock .host , 'proxy.com' )
1070- self .assertEqual (conn .sock .port , 80 )
1071- self .assertIn (b'CONNECT destination.com' , conn .sock .data )
1080+ def test_connect_with_tunnel (self ):
1081+ self .conn .set_tunnel ('destination.com' )
1082+ self .conn .request ('HEAD' , '/' , '' )
1083+ self .assertEqual (self .conn .sock .host , self .host )
1084+ self .assertEqual (self .conn .sock .port , client .HTTP_PORT )
1085+ self .assertIn (b'CONNECT destination.com' , self .conn .sock .data )
10721086 # issue22095
1073- self .assertNotIn (b'Host: destination.com:None' , conn .sock .data )
1074- self .assertIn (b'Host: destination.com' , conn .sock .data )
1087+ self .assertNotIn (b'Host: destination.com:None' , self . conn .sock .data )
1088+ self .assertIn (b'Host: destination.com' , self . conn .sock .data )
10751089
10761090 # This test should be removed when CONNECT gets the HTTP/1.1 blessing
1077- self .assertNotIn (b'Host: proxy.com' , conn .sock .data )
1091+ self .assertNotIn (b'Host: proxy.com' , self .conn .sock .data )
1092+
1093+ def test_connect_put_request (self ):
1094+ self .conn .set_tunnel ('destination.com' )
1095+ self .conn .request ('PUT' , '/' , '' )
1096+ self .assertEqual (self .conn .sock .host , self .host )
1097+ self .assertEqual (self .conn .sock .port , client .HTTP_PORT )
1098+ self .assertIn (b'CONNECT destination.com' , self .conn .sock .data )
1099+ self .assertIn (b'Host: destination.com' , self .conn .sock .data )
1100+
10781101
1079- conn .close ()
1080- conn .request ('PUT' , '/' , '' )
1081- self .assertEqual (conn .sock .host , 'proxy.com' )
1082- self .assertEqual (conn .sock .port , 80 )
1083- self .assertTrue (b'CONNECT destination.com' in conn .sock .data )
1084- self .assertTrue (b'Host: destination.com' in conn .sock .data )
10851102
10861103@support .reap_threads
10871104def test_main (verbose = None ):
0 commit comments