From 09f95768f3f631fdf7bd93139105ffd948dd3ffd Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Tue, 24 Dec 2013 09:17:04 +0000 Subject: [PATCH] Fix infinite loop in Client.logs(stream=True) caused by connection close. --- docker/client.py | 9 ++++++++- tests/integration_test.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docker/client.py b/docker/client.py index bfbc326d..05a61d44 100644 --- a/docker/client.py +++ b/docker/client.py @@ -260,6 +260,9 @@ class Client(requests.Session): data = '' while size > 0: block = socket.recv(size) + if not block: + return None + data += block size -= len(block) return data @@ -272,7 +275,11 @@ class Client(requests.Session): _, length = struct.unpack('>BxxxL', header) if not length: break - yield recvall(socket, length).rstrip() + data = recvall(socket, length) + if data: + yield data + else: + break def attach(self, container): socket = self.attach_socket(container) diff --git a/tests/integration_test.py b/tests/integration_test.py index c81cbaa2..1fdde0e3 100644 --- a/tests/integration_test.py +++ b/tests/integration_test.py @@ -274,6 +274,23 @@ class TestLogs(BaseTestCase): logs = self.client.logs(id) 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): def runTest(self):