From b517bd2b4cc5eb7f7a11a461b5f81711c9f5ed7f Mon Sep 17 00:00:00 2001 From: Matej Marusak Date: Mon, 11 Jul 2022 10:47:19 +0200 Subject: [PATCH] Reply from REST can come in pieces Maximum length on one message is 4096 characters. When the reply is longer than that it will come in multiple messages. In such case we need to connect them before trying to parse such message. This for example happens when there are multiple containers and `Stats` often are split into multiple messages. Fixes #1025 --- src/rest.js | 15 +++++++++++++-- test/check-application | 9 +++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/rest.js b/src/rest.js index a0b9f9613..e5173ed0a 100644 --- a/src/rest.js +++ b/src/rest.js @@ -20,12 +20,23 @@ function connect(address, system) { connection.monitor = function(options, callback, system, return_raw) { return new Promise((resolve, reject) => { + let buffer = ""; + http.request(options) .stream(data => { if (return_raw) callback(data); - else - callback(JSON.parse(data)); + else { + buffer += data; + + try { + const message = JSON.parse(buffer); + buffer = ""; + callback(message); + } catch { + // Ignore, we already stored it is buffer + } + } }) .catch((error, content) => { manage_error(reject, error, content); diff --git a/test/check-application b/test/check-application index d65886368..d43cbed5b 100755 --- a/test/check-application +++ b/test/check-application @@ -2122,6 +2122,15 @@ class TestApplication(testlib.MachineCase): self.execute(auth, f"podman inspect --format '{{{{.Id}}}}' {container_name_new}").strip() self.waitContainerRow(container_name_new) + def testMultipleContainers(self): + # Create 31 containers + for i in range(31): + self.execute(True, f"podman run -dt --name container{i} quay.io/libpod/busybox:latest") + + self.login() + + self.waitContainerRow("container30") + if __name__ == '__main__': testlib.test_main()