Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 14 additions & 28 deletions docker/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,40 +320,26 @@ def _multiplexed_buffer_helper(self, response):
walker = end
yield buf[start:end]

def _multiplexed_socket_stream_helper(self, response):
def _multiplexed_response_stream_helper(self, response):
"""A generator of multiplexed data blocks coming from a response
socket."""
socket = self._get_raw_response_socket(response)

def recvall(socket, size):
blocks = []
while size > 0:
if six.PY3:
block = socket._sock.recv(size)
else:
block = socket.recv(size)
if not block:
return None

blocks.append(block)
size -= len(block)
stream."""

sep = bytes() if six.PY3 else str()
data = sep.join(blocks)
return data
# Disable timeout on the underlying socket to prevent
# Read timed out(s) for long running processes
socket = self._get_raw_response_socket(response)
if six.PY3:
socket._sock.settimeout(None)
else:
socket.settimeout(None)

while True:
if six.PY3:
socket._sock.settimeout(None)
else:
socket.settimeout(None)
header = recvall(socket, STREAM_HEADER_SIZE_BYTES)
header = response.raw.read(STREAM_HEADER_SIZE_BYTES)
if not header:
break
_, length = struct.unpack('>BxxxL', header)
if not length:
break
data = recvall(socket, length)
data = response.raw.read(length)
if not data:
break
yield data
Expand Down Expand Up @@ -387,7 +373,7 @@ def stream_result():

sep = bytes() if six.PY3 else str()

return stream and self._multiplexed_socket_stream_helper(response) or \
return stream and self._multiplexed_response_stream_helper(response) or \
sep.join([x for x in self._multiplexed_buffer_helper(response)])

def attach_socket(self, container, params=None, ws=False):
Expand Down Expand Up @@ -604,7 +590,7 @@ def execute(self, container, cmd, detach=False, stdout=True, stderr=True,
data=data, stream=stream)
self._raise_for_status(res)
if stream:
return self._multiplexed_socket_stream_helper(res)
return self._multiplexed_response_stream_helper(res)
elif six.PY3:
return bytes().join(
[x for x in self._multiplexed_buffer_helper(res)]
Expand Down Expand Up @@ -774,7 +760,7 @@ def logs(self, container, stdout=True, stderr=True, stream=False,
url = self._url("/containers/{0}/logs".format(container))
res = self._get(url, params=params, stream=stream)
if stream:
return self._multiplexed_socket_stream_helper(res)
return self._multiplexed_response_stream_helper(res)
elif six.PY3:
return bytes().join(
[x for x in self._multiplexed_buffer_helper(res)]
Expand Down