Merge "Fixes missing socket attribute error during init_poolmanager"
This commit is contained in:
@@ -938,10 +938,6 @@ class TCPKeepAliveAdapter(requests.adapters.HTTPAdapter):
|
||||
(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),
|
||||
# Turn on TCP Keep-Alive
|
||||
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
|
||||
# Set the maximum number of keep-alive probes
|
||||
(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4),
|
||||
# Send keep-alive probes every 15 seconds
|
||||
(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15),
|
||||
]
|
||||
|
||||
# Some operating systems (e.g., OSX) do not support setting
|
||||
@@ -952,6 +948,23 @@ class TCPKeepAliveAdapter(requests.adapters.HTTPAdapter):
|
||||
(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)
|
||||
]
|
||||
|
||||
# TODO(claudiub): Windows does not contain the TCP_KEEPCNT and
|
||||
# TCP_KEEPINTVL socket attributes. Instead, it contains
|
||||
# SIO_KEEPALIVE_VALS, which can be set via ioctl, which should be
|
||||
# set once it is available in requests.
|
||||
# https://msdn.microsoft.com/en-us/library/dd877220%28VS.85%29.aspx
|
||||
if hasattr(socket, 'TCP_KEEPCNT'):
|
||||
socket_options += [
|
||||
# Set the maximum number of keep-alive probes
|
||||
(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
|
||||
]
|
||||
|
||||
if hasattr(socket, 'TCP_KEEPINTVL'):
|
||||
socket_options += [
|
||||
# Send keep-alive probes every 15 seconds
|
||||
(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15)
|
||||
]
|
||||
|
||||
# After waiting 60 seconds, and then sending a probe once every 15
|
||||
# seconds 4 times, these options should ensure that a connection
|
||||
# hands for no longer than 2 minutes before a ConnectionError is
|
||||
|
@@ -280,6 +280,43 @@ class SessionTests(utils.TestCase):
|
||||
self.assertEqual(1, logger.debug.call_count)
|
||||
|
||||
|
||||
class TCPKeepAliveAdapter(utils.TestCase):
|
||||
|
||||
@mock.patch.object(client_session, 'socket')
|
||||
@mock.patch('requests.adapters.HTTPAdapter.init_poolmanager')
|
||||
def test_init_poolmanager_all_options(self, mock_parent_init_poolmanager,
|
||||
mock_socket):
|
||||
# properties expected to be in socket.
|
||||
mock_socket.TCP_KEEPIDLE = mock.sentinel.TCP_KEEPIDLE
|
||||
mock_socket.TCP_KEEPCNT = mock.sentinel.TCP_KEEPCNT
|
||||
mock_socket.TCP_KEEPINTVL = mock.sentinel.TCP_KEEPINTVL
|
||||
desired_opts = [mock_socket.TCP_KEEPIDLE, mock_socket.TCP_KEEPCNT,
|
||||
mock_socket.TCP_KEEPINTVL]
|
||||
|
||||
adapter = client_session.TCPKeepAliveAdapter()
|
||||
adapter.init_poolmanager()
|
||||
|
||||
call_args, call_kwargs = mock_parent_init_poolmanager.call_args
|
||||
called_socket_opts = call_kwargs['socket_options']
|
||||
call_options = [opt for (protocol, opt, value) in called_socket_opts]
|
||||
for opt in desired_opts:
|
||||
self.assertIn(opt, call_options)
|
||||
|
||||
@mock.patch.object(client_session, 'socket')
|
||||
@mock.patch('requests.adapters.HTTPAdapter.init_poolmanager')
|
||||
def test_init_poolmanager(self, mock_parent_init_poolmanager, mock_socket):
|
||||
spec = ['IPPROTO_TCP', 'TCP_NODELAY', 'SOL_SOCKET', 'SO_KEEPALIVE']
|
||||
mock_socket.mock_add_spec(spec)
|
||||
adapter = client_session.TCPKeepAliveAdapter()
|
||||
adapter.init_poolmanager()
|
||||
|
||||
call_args, call_kwargs = mock_parent_init_poolmanager.call_args
|
||||
called_socket_opts = call_kwargs['socket_options']
|
||||
call_options = [opt for (protocol, opt, value) in called_socket_opts]
|
||||
self.assertEqual([mock_socket.TCP_NODELAY, mock_socket.SO_KEEPALIVE],
|
||||
call_options)
|
||||
|
||||
|
||||
class RedirectTests(utils.TestCase):
|
||||
|
||||
REDIRECT_CHAIN = ['http://myhost:3445/',
|
||||
|
Reference in New Issue
Block a user