mirror of https://github.com/docker/docker-py.git
Don't set socket timeout if it's already disabled when streaming
Signed-off-by: Kevin Frommelt <kevin.frommelt@gmail.com>
This commit is contained in:
parent
b98e240958
commit
2826dd51e7
|
@ -291,14 +291,29 @@ class Client(
|
||||||
""" Depending on the combination of python version and whether we're
|
""" Depending on the combination of python version and whether we're
|
||||||
connecting over http or https, we might need to access _sock, which
|
connecting over http or https, we might need to access _sock, which
|
||||||
may or may not exist; or we may need to just settimeout on socket
|
may or may not exist; or we may need to just settimeout on socket
|
||||||
itself, which also may or may not have settimeout on it.
|
itself, which also may or may not have settimeout on it. To avoid
|
||||||
|
missing the correct one, we try both.
|
||||||
|
|
||||||
To avoid missing the correct one, we try both.
|
We also do not want to set the timeout if it is already disabled, as
|
||||||
|
you run the risk of changing a socket that was non-blocking to
|
||||||
|
blocking, for example when using gevent.
|
||||||
"""
|
"""
|
||||||
if hasattr(socket, "settimeout"):
|
sockets = [socket, getattr(socket, '_sock', None)]
|
||||||
socket.settimeout(None)
|
|
||||||
if hasattr(socket, "_sock") and hasattr(socket._sock, "settimeout"):
|
for s in sockets:
|
||||||
socket._sock.settimeout(None)
|
if not hasattr(s, 'settimeout'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
timeout = -1
|
||||||
|
|
||||||
|
if hasattr(s, 'gettimeout'):
|
||||||
|
timeout = s.gettimeout()
|
||||||
|
|
||||||
|
# Don't change the timeout if it is already disabled.
|
||||||
|
if timeout is None or timeout == 0.0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
s.settimeout(None)
|
||||||
|
|
||||||
def _get_result(self, container, stream, res):
|
def _get_result(self, container, stream, res):
|
||||||
cont = self.inspect_container(container)
|
cont = self.inspect_container(container)
|
||||||
|
|
|
@ -24,3 +24,47 @@ class ClientTest(base.BaseTestCase):
|
||||||
DOCKER_TLS_VERIFY='1')
|
DOCKER_TLS_VERIFY='1')
|
||||||
client = Client.from_env()
|
client = Client.from_env()
|
||||||
self.assertEqual(client.base_url, "https://192.168.59.103:2376")
|
self.assertEqual(client.base_url, "https://192.168.59.103:2376")
|
||||||
|
|
||||||
|
|
||||||
|
class DisableSocketTest(base.BaseTestCase):
|
||||||
|
class DummySocket(object):
|
||||||
|
def __init__(self, timeout=60):
|
||||||
|
self.timeout = timeout
|
||||||
|
|
||||||
|
def settimeout(self, timeout):
|
||||||
|
self.timeout = timeout
|
||||||
|
|
||||||
|
def gettimeout(self):
|
||||||
|
return self.timeout
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.client = Client()
|
||||||
|
|
||||||
|
def test_disable_socket_timeout(self):
|
||||||
|
"""Test that the timeout is disabled on a generic socket object."""
|
||||||
|
socket = self.DummySocket()
|
||||||
|
|
||||||
|
self.client._disable_socket_timeout(socket)
|
||||||
|
|
||||||
|
self.assertEqual(socket.timeout, None)
|
||||||
|
|
||||||
|
def test_disable_socket_timeout2(self):
|
||||||
|
"""Test that the timeouts are disabled on a generic socket object
|
||||||
|
and it's _sock object if present."""
|
||||||
|
socket = self.DummySocket()
|
||||||
|
socket._sock = self.DummySocket()
|
||||||
|
|
||||||
|
self.client._disable_socket_timeout(socket)
|
||||||
|
|
||||||
|
self.assertEqual(socket.timeout, None)
|
||||||
|
self.assertEqual(socket._sock.timeout, None)
|
||||||
|
|
||||||
|
def test_disable_socket_timout_non_blocking(self):
|
||||||
|
"""Test that a non-blocking socket does not get set to blocking."""
|
||||||
|
socket = self.DummySocket()
|
||||||
|
socket._sock = self.DummySocket(0.0)
|
||||||
|
|
||||||
|
self.client._disable_socket_timeout(socket)
|
||||||
|
|
||||||
|
self.assertEqual(socket.timeout, None)
|
||||||
|
self.assertEqual(socket._sock.timeout, 0.0)
|
||||||
|
|
Loading…
Reference in New Issue