mirror of https://github.com/docker/docker-py.git
Fix infinite loop in Client.logs(stream=True) caused by connection close.
This commit is contained in:
parent
20a2c23bc2
commit
09f95768f3
|
|
@ -260,6 +260,9 @@ class Client(requests.Session):
|
||||||
data = ''
|
data = ''
|
||||||
while size > 0:
|
while size > 0:
|
||||||
block = socket.recv(size)
|
block = socket.recv(size)
|
||||||
|
if not block:
|
||||||
|
return None
|
||||||
|
|
||||||
data += block
|
data += block
|
||||||
size -= len(block)
|
size -= len(block)
|
||||||
return data
|
return data
|
||||||
|
|
@ -272,7 +275,11 @@ class Client(requests.Session):
|
||||||
_, length = struct.unpack('>BxxxL', header)
|
_, length = struct.unpack('>BxxxL', header)
|
||||||
if not length:
|
if not length:
|
||||||
break
|
break
|
||||||
yield recvall(socket, length).rstrip()
|
data = recvall(socket, length)
|
||||||
|
if data:
|
||||||
|
yield data
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
def attach(self, container):
|
def attach(self, container):
|
||||||
socket = self.attach_socket(container)
|
socket = self.attach_socket(container)
|
||||||
|
|
|
||||||
|
|
@ -274,6 +274,23 @@ class TestLogs(BaseTestCase):
|
||||||
logs = self.client.logs(id)
|
logs = self.client.logs(id)
|
||||||
self.assertEqual(logs, snippet + '\n')
|
self.assertEqual(logs, snippet + '\n')
|
||||||
|
|
||||||
|
class TestLogsStreaming(BaseTestCase):
|
||||||
|
def runTest(self):
|
||||||
|
snippet = 'Flowering Nights (Sakuya Iyazoi)'
|
||||||
|
container = self.client.create_container(
|
||||||
|
'busybox', 'echo {0}'.format(snippet)
|
||||||
|
)
|
||||||
|
id = container['Id']
|
||||||
|
self.client.start(id)
|
||||||
|
self.tmp_containers.append(id)
|
||||||
|
logs = ''
|
||||||
|
for chunk in self.client.logs(id, stream=True):
|
||||||
|
logs += chunk
|
||||||
|
|
||||||
|
exitcode = self.client.wait(id)
|
||||||
|
self.assertEqual(exitcode, 0)
|
||||||
|
|
||||||
|
self.assertEqual(logs, snippet + '\n')
|
||||||
|
|
||||||
class TestLogsWithDictInsteadOfId(BaseTestCase):
|
class TestLogsWithDictInsteadOfId(BaseTestCase):
|
||||||
def runTest(self):
|
def runTest(self):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue