Skip to content

Commit e6cc701

Browse files
committed
Increase http.client.HTTPConnection test coverage.
Added a new tunnel test to verify setting of _tunnel_host, _tunnel_port, _tunnel_headers attributes on HTTPConnection object.
1 parent ff37cfe commit e6cc701

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

Lib/test/test_httplib.py

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,47 +1041,64 @@ def test_getting_header_defaultint(self):
10411041
self.assertEqual(header, 42)
10421042

10431043
class 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
10871104
def test_main(verbose=None):

0 commit comments

Comments
 (0)