mirror of https://github.com/docker/docker-py.git
Keep unix socket alive with python3
This commit is contained in:
parent
9b166eea75
commit
2d34c38c4d
|
@ -274,18 +274,19 @@ class Client(requests.Session):
|
||||||
def _get_raw_response_socket(self, response):
|
def _get_raw_response_socket(self, response):
|
||||||
self._raise_for_status(response)
|
self._raise_for_status(response)
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
sock = response.raw._fp.fp.raw._sock
|
sock = response.raw._fp.fp.raw
|
||||||
|
sock._response = response
|
||||||
else:
|
else:
|
||||||
sock = response.raw._fp.fp._sock
|
sock = response.raw._fp.fp._sock
|
||||||
try:
|
try:
|
||||||
# Keep a reference to the response to stop it being garbage
|
# Keep a reference to the response to stop it being garbage
|
||||||
# collected. If the response is garbage collected, it will close
|
# collected. If the response is garbage collected, it will
|
||||||
# TLS sockets.
|
# close TLS sockets.
|
||||||
sock._response = response
|
sock._response = response
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# UNIX sockets can't have attributes set on them, but that's fine
|
# UNIX sockets can't have attributes set on them, but that's
|
||||||
# because we won't be doing TLS over them
|
# fine because we won't be doing TLS over them
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return sock
|
return sock
|
||||||
|
|
||||||
|
@ -324,7 +325,10 @@ class Client(requests.Session):
|
||||||
def recvall(socket, size):
|
def recvall(socket, size):
|
||||||
blocks = []
|
blocks = []
|
||||||
while size > 0:
|
while size > 0:
|
||||||
block = socket.recv(size)
|
if six.PY3:
|
||||||
|
block = socket._sock.recv(size)
|
||||||
|
else:
|
||||||
|
block = socket.recv(size)
|
||||||
if not block:
|
if not block:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -336,7 +340,10 @@ class Client(requests.Session):
|
||||||
return data
|
return data
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
socket.settimeout(None)
|
if six.PY3:
|
||||||
|
socket._sock.settimeout(None)
|
||||||
|
else:
|
||||||
|
socket.settimeout(None)
|
||||||
header = recvall(socket, STREAM_HEADER_SIZE_BYTES)
|
header = recvall(socket, STREAM_HEADER_SIZE_BYTES)
|
||||||
if not header:
|
if not header:
|
||||||
break
|
break
|
||||||
|
|
|
@ -870,6 +870,17 @@ class TestExecuteCommandStreaming(BaseTestCase):
|
||||||
self.assertEqual(res, expected)
|
self.assertEqual(res, expected)
|
||||||
|
|
||||||
|
|
||||||
|
class TestRunContainerStreaming(BaseTestCase):
|
||||||
|
def runTest(self):
|
||||||
|
container = self.client.create_container('busybox', '/bin/sh',
|
||||||
|
detach=True, stdin_open=True)
|
||||||
|
id = container['Id']
|
||||||
|
self.client.start(id)
|
||||||
|
self.tmp_containers.append(id)
|
||||||
|
socket = self.client.attach_socket(container, ws=False)
|
||||||
|
self.assertTrue(socket.fileno() > -1)
|
||||||
|
|
||||||
|
|
||||||
class TestPauseUnpauseContainer(BaseTestCase):
|
class TestPauseUnpauseContainer(BaseTestCase):
|
||||||
def runTest(self):
|
def runTest(self):
|
||||||
container = self.client.create_container('busybox', ['sleep', '9999'])
|
container = self.client.create_container('busybox', ['sleep', '9999'])
|
||||||
|
|
Loading…
Reference in New Issue