def test_tunnel(self): # note the actual httplib.py has no tests for this functionality timeout = Timeout(total=None) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() self.addCleanup(conn.close) try: conn.set_tunnel(self.host, self.port) except AttributeError: # python 2.6 conn._set_tunnel(self.host, self.port) conn._tunnel = mock.Mock(return_value=None) pool._make_request(conn, 'GET', '/') conn._tunnel.assert_called_once_with() # test that it's not called when tunnel is not set timeout = Timeout(total=None) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() self.addCleanup(conn.close) conn._tunnel = mock.Mock(return_value=None) pool._make_request(conn, 'GET', '/') self.assertEqual(conn._tunnel.called, False)
def test_connect_timeout(self): url = "/" host, port = TARPIT_HOST, 80 timeout = Timeout(connect=SHORT_TIMEOUT) # Pool-global timeout pool = HTTPConnectionPool(host, port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() with pytest.raises(ConnectTimeoutError): pool._make_request(conn, "GET", url) # Retries retries = Retry(connect=0) with pytest.raises(MaxRetryError): pool.request("GET", url, retries=retries) # Request-specific connection timeouts big_timeout = Timeout(read=LONG_TIMEOUT, connect=LONG_TIMEOUT) pool = HTTPConnectionPool(host, port, timeout=big_timeout, retries=False) self.addCleanup(pool.close) conn = pool._get_conn() with pytest.raises(ConnectTimeoutError): pool._make_request(conn, "GET", url, timeout=timeout) pool._put_conn(conn) with pytest.raises(ConnectTimeoutError): pool.request("GET", url, timeout=timeout)
def test_timeout(self): url = '/sleep?seconds=0.005' timeout = 0.001 # Pool-global timeout pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) conn = pool._get_conn() with self.assertRaises(SocketTimeout): pool._make_request(conn, 'GET', url) pool._put_conn(conn) with self.assertRaises(TimeoutError): pool.request('GET', url) # Request-specific timeout pool = HTTPConnectionPool(self.host, self.port, timeout=0.5) conn = pool._get_conn() with self.assertRaises(SocketTimeout): pool._make_request(conn, 'GET', url, timeout=timeout) pool._put_conn(conn) with self.assertRaises(TimeoutError): pool.request('GET', url, timeout=timeout)
def test_nagle(self): """ Test that connections have TCP_NODELAY turned on """ # This test needs to be here in order to be run. socket.create_connection actually tries to # connect to the host provided so we need a dummyserver to be running. pool = HTTPConnectionPool(self.host, self.port) conn = pool._get_conn() pool._make_request(conn, 'GET', '/') tcp_nodelay_setting = conn.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) self.assertTrue(tcp_nodelay_setting)
def test_timeout_reset(self): """ If the read timeout isn't set, socket timeout should reset """ url = '/sleep?seconds=0.005' timeout = Timeout(connect=0.001) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) conn = pool._get_conn() try: pool._make_request(conn, 'GET', url) except ReadTimeoutError: self.fail("This request shouldn't trigger a read timeout.")
def test_nagle(self): """ Test that connections have TCP_NODELAY turned on """ pool = HTTPConnectionPool(self.host, self.port) conn = pool._get_conn() pool._make_request(conn, 'GET', '/') tcp_nodelay_setting = conn.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) assert tcp_nodelay_setting > 0, ("Expected TCP_NODELAY to be set on the " "socket (with value greater than 0) " "but instead was %s" % tcp_nodelay_setting)
def test_timeout_reset(self): """ If the read timeout isn't set, socket timeout should reset """ url = '/sleep?seconds=0.005' timeout = util.Timeout(connect=0.001) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) conn = pool._get_conn() try: pool._make_request(conn, 'GET', url) except ReadTimeoutError: self.fail("This request shouldn't trigger a read timeout.")
def test_nagle(self): """ Test that connections have TCP_NODELAY turned on """ # This test needs to be here in order to be run. socket.create_connection actually tries to # connect to the host provided so we need a dummyserver to be running. pool = HTTPConnectionPool(self.host, self.port) conn = pool._get_conn() pool._make_request(conn, 'GET', '/') tcp_nodelay_setting = conn.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) assert tcp_nodelay_setting > 0, ("Expected TCP_NODELAY to be set on the " "socket (with value greater than 0) " "but instead was %s" % tcp_nodelay_setting)
def test_total_applies_connect(self): host, port = TARPIT_HOST, 80 timeout = Timeout(total=None, connect=SHORT_TIMEOUT) pool = HTTPConnectionPool(host, port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() self.addCleanup(conn.close) with pytest.raises(ConnectTimeoutError): pool._make_request(conn, "GET", "/") timeout = Timeout(connect=3, read=5, total=SHORT_TIMEOUT) pool = HTTPConnectionPool(host, port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() self.addCleanup(conn.close) with pytest.raises(ConnectTimeoutError): pool._make_request(conn, "GET", "/")
def test_connect_timeout(self): url = '/' host, port = TARPIT_HOST, 80 timeout = Timeout(connect=SHORT_TIMEOUT) # Pool-global timeout pool = HTTPConnectionPool(host, port, timeout=timeout) conn = pool._get_conn() with self.assertRaises(ConnectTimeoutError) as cmgr: pool._make_request(conn, 'GET', url) self.assertEqual(cmgr.exception.args[1].split()[-1], 'timeout=%s)' % timeout.connect_timeout) # Retries retries = Retry(connect=0) self.assertRaises(MaxRetryError, pool.request, 'GET', url, retries=retries) # Request-specific connection timeouts big_timeout = Timeout(read=LONG_TIMEOUT, connect=LONG_TIMEOUT) pool = HTTPConnectionPool(host, port, timeout=big_timeout, retries=False) conn = pool._get_conn() with self.assertRaises(ConnectTimeoutError) as cmgr: pool._make_request(conn, 'GET', url, timeout=timeout) self.assertEqual(cmgr.exception.args[1].split()[-1], 'timeout=%s)' % timeout.connect_timeout) pool._put_conn(conn) with self.assertRaises(ConnectTimeoutError) as cmgr: pool.request('GET', url, timeout=timeout) self.assertEqual(cmgr.exception.args[1].split()[-1], 'timeout=%s)' % timeout.connect_timeout)
def test_tunnel(self): # note the actual httplib.py has no tests for this functionality timeout = Timeout(total=None) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() self.addCleanup(conn.close) conn.set_tunnel(self.host, self.port) conn._tunnel = mock.Mock(return_value=None) pool._make_request(conn, "GET", "/") conn._tunnel.assert_called_once_with() # test that it's not called when tunnel is not set timeout = Timeout(total=None) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout) self.addCleanup(pool.close) conn = pool._get_conn() self.addCleanup(conn.close) conn._tunnel = mock.Mock(return_value=None) pool._make_request(conn, "GET", "/") self.assertFalse(conn._tunnel.called)
def test_timeout(self): # Requests should time out when expected block_event = Event() ready_event = self.start_basic_handler(block_send=block_event, num=6) # Pool-global timeout timeout = Timeout(read=SHORT_TIMEOUT) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout, retries=False) wait_for_socket(ready_event) conn = pool._get_conn() with self.assertRaises(ReadTimeoutError) as cmgr: pool._make_request(conn, 'GET', '/') self.assertEqual(cmgr.exception.args[0].split()[-1], 'timeout=%s)' % timeout.read_timeout) pool._put_conn(conn) block_event.set() # Release request wait_for_socket(ready_event) block_event.clear() with self.assertRaises(ReadTimeoutError) as cmgr: pool.request('GET', '/') self.assertEqual(cmgr.exception.args[0].split()[-1], 'timeout=%s)' % timeout.read_timeout) block_event.set() # Release request # Request-specific timeouts should raise errors pool = HTTPConnectionPool(self.host, self.port, timeout=LONG_TIMEOUT, retries=False) conn = pool._get_conn() wait_for_socket(ready_event) now = time.time() with self.assertRaises(ReadTimeoutError) as cmgr: pool._make_request(conn, 'GET', '/', timeout=timeout) self.assertEqual(cmgr.exception.args[0].split()[-1], 'timeout=%s)' % timeout.read_timeout) delta = time.time() - now block_event.set() # Release request self.assertTrue( delta < LONG_TIMEOUT, "timeout was pool-level LONG_TIMEOUT rather than request-level SHORT_TIMEOUT" ) pool._put_conn(conn) wait_for_socket(ready_event) now = time.time() with self.assertRaises(ReadTimeoutError) as cmgr: pool.request('GET', '/', timeout=timeout) self.assertEqual(cmgr.exception.args[0].split()[-1], 'timeout=%s)' % timeout.read_timeout) delta = time.time() - now self.assertTrue( delta < LONG_TIMEOUT, "timeout was pool-level LONG_TIMEOUT rather than request-level SHORT_TIMEOUT" ) block_event.set() # Release request # Timeout int/float passed directly to request and _make_request should # raise a request timeout wait_for_socket(ready_event) with self.assertRaises(ReadTimeoutError) as cmgr: pool.request('GET', '/', timeout=SHORT_TIMEOUT) self.assertEqual(cmgr.exception.args[0].split()[-1], 'timeout=%s)' % SHORT_TIMEOUT) block_event.set() # Release request wait_for_socket(ready_event) conn = pool._new_conn() # FIXME: This assert flakes sometimes. Not sure why. with self.assertRaises(ReadTimeoutError) as cmgr: pool._make_request(conn, 'GET', '/', timeout=SHORT_TIMEOUT) block_event.set() # Release request self.assertEqual(cmgr.exception.args[0].split()[-1], 'timeout=%s)' % SHORT_TIMEOUT)
def test_timeout(self): # Requests should time out when expected block_event = Event() ready_event = self.start_basic_handler(block_send=block_event, num=6) # Pool-global timeout timeout = Timeout(read=SHORT_TIMEOUT) pool = HTTPConnectionPool(self.host, self.port, timeout=timeout, retries=False) self.addCleanup(pool.close) wait_for_socket(ready_event) conn = pool._get_conn() with pytest.raises(ReadTimeoutError): pool._make_request(conn, "GET", "/") pool._put_conn(conn) block_event.set() # Release request wait_for_socket(ready_event) block_event.clear() with pytest.raises(ReadTimeoutError): pool.request("GET", "/") block_event.set() # Release request # Request-specific timeouts should raise errors pool = HTTPConnectionPool(self.host, self.port, timeout=LONG_TIMEOUT, retries=False) self.addCleanup(pool.close) conn = pool._get_conn() wait_for_socket(ready_event) now = time.time() with pytest.raises(ReadTimeoutError): pool._make_request(conn, "GET", "/", timeout=timeout) delta = time.time() - now block_event.set() # Release request message = "timeout was pool-level LONG_TIMEOUT rather than request-level SHORT_TIMEOUT" assert delta < LONG_TIMEOUT, message pool._put_conn(conn) wait_for_socket(ready_event) now = time.time() with pytest.raises(ReadTimeoutError): pool.request("GET", "/", timeout=timeout) delta = time.time() - now message = "timeout was pool-level LONG_TIMEOUT rather than request-level SHORT_TIMEOUT" assert delta < LONG_TIMEOUT, message block_event.set() # Release request # Timeout int/float passed directly to request and _make_request should # raise a request timeout wait_for_socket(ready_event) with pytest.raises(ReadTimeoutError): pool.request("GET", "/", timeout=SHORT_TIMEOUT) block_event.set() # Release request wait_for_socket(ready_event) conn = pool._new_conn() # FIXME: This assert flakes sometimes. Not sure why. with pytest.raises(ReadTimeoutError): pool._make_request(conn, "GET", "/", timeout=SHORT_TIMEOUT) block_event.set() # Release request