Skip to content

Commit cc522bd

Browse files
committed
merge from 3.4
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.
2 parents 7d0e0c9 + e6cc701 commit cc522bd

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
@@ -1253,47 +1253,64 @@ def test_getting_header_defaultint(self):
12531253
self.assertEqual(header, 42)
12541254

12551255
class TunnelTests(TestCase):
1256-
1257-
def test_connect(self):
1256+
def setUp(self):
12581257
response_text = (
12591258
'HTTP/1.0 200 OK\r\n\r\n' # Reply to CONNECT
12601259
'HTTP/1.1 200 OK\r\n' # Reply to HEAD
12611260
'Content-Length: 42\r\n\r\n'
12621261
)
12631262

12641263
def create_connection(address, timeout=None, source_address=None):
1265-
return FakeSocket(response_text, host=address[0],
1266-
port=address[1])
1264+
return FakeSocket(response_text, host=address[0], port=address[1])
12671265

1268-
conn = client.HTTPConnection('proxy.com')
1269-
conn._create_connection = create_connection
1266+
self.host = 'proxy.com'
1267+
self.conn = client.HTTPConnection(self.host)
1268+
self.conn._create_connection = create_connection
12701269

1270+
def tearDown(self):
1271+
self.conn.close()
1272+
1273+
def test_set_tunnel_host_port_headers(self):
1274+
tunnel_host = 'destination.com'
1275+
tunnel_port = 8888
1276+
tunnel_headers = {'User-Agent': 'Mozilla/5.0 (compatible, MSIE 11)'}
1277+
self.conn.set_tunnel(tunnel_host, port=tunnel_port,
1278+
headers=tunnel_headers)
1279+
self.conn.request('HEAD', '/', '')
1280+
self.assertEqual(self.conn.sock.host, self.host)
1281+
self.assertEqual(self.conn.sock.port, client.HTTP_PORT)
1282+
self.assertEqual(self.conn._tunnel_host, tunnel_host)
1283+
self.assertEqual(self.conn._tunnel_port, tunnel_port)
1284+
self.assertEqual(self.conn._tunnel_headers, tunnel_headers)
1285+
1286+
def test_disallow_set_tunnel_after_connect(self):
12711287
# Once connected, we shouldn't be able to tunnel anymore
1272-
conn.connect()
1273-
self.assertRaises(RuntimeError, conn.set_tunnel,
1288+
self.conn.connect()
1289+
self.assertRaises(RuntimeError, self.conn.set_tunnel,
12741290
'destination.com')
12751291

1276-
# But if we close the connection, we're good
1277-
conn.close()
1278-
conn.set_tunnel('destination.com')
1279-
conn.request('HEAD', '/', '')
1280-
1281-
self.assertEqual(conn.sock.host, 'proxy.com')
1282-
self.assertEqual(conn.sock.port, 80)
1283-
self.assertIn(b'CONNECT destination.com', conn.sock.data)
1292+
def test_connect_with_tunnel(self):
1293+
self.conn.set_tunnel('destination.com')
1294+
self.conn.request('HEAD', '/', '')
1295+
self.assertEqual(self.conn.sock.host, self.host)
1296+
self.assertEqual(self.conn.sock.port, client.HTTP_PORT)
1297+
self.assertIn(b'CONNECT destination.com', self.conn.sock.data)
12841298
# issue22095
1285-
self.assertNotIn(b'Host: destination.com:None', conn.sock.data)
1286-
self.assertIn(b'Host: destination.com', conn.sock.data)
1299+
self.assertNotIn(b'Host: destination.com:None', self.conn.sock.data)
1300+
self.assertIn(b'Host: destination.com', self.conn.sock.data)
12871301

12881302
# This test should be removed when CONNECT gets the HTTP/1.1 blessing
1289-
self.assertNotIn(b'Host: proxy.com', conn.sock.data)
1303+
self.assertNotIn(b'Host: proxy.com', self.conn.sock.data)
1304+
1305+
def test_connect_put_request(self):
1306+
self.conn.set_tunnel('destination.com')
1307+
self.conn.request('PUT', '/', '')
1308+
self.assertEqual(self.conn.sock.host, self.host)
1309+
self.assertEqual(self.conn.sock.port, client.HTTP_PORT)
1310+
self.assertIn(b'CONNECT destination.com', self.conn.sock.data)
1311+
self.assertIn(b'Host: destination.com', self.conn.sock.data)
1312+
12901313

1291-
conn.close()
1292-
conn.request('PUT', '/', '')
1293-
self.assertEqual(conn.sock.host, 'proxy.com')
1294-
self.assertEqual(conn.sock.port, 80)
1295-
self.assertTrue(b'CONNECT destination.com' in conn.sock.data)
1296-
self.assertTrue(b'Host: destination.com' in conn.sock.data)
12971314

12981315
@support.reap_threads
12991316
def test_main(verbose=None):

0 commit comments

Comments
 (0)