From fbba66caa5cdc301208a76994e48c41f2e5eb6b1 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Sun, 20 Feb 2022 13:03:00 +0100 Subject: [PATCH] Docker wrapper now waits for chunked responses --- src/build.v | 2 +- src/docker/docker.v | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/build.v b/src/build.v index f3834fd..47c6710 100644 --- a/src/build.v +++ b/src/build.v @@ -3,6 +3,6 @@ module main import docker fn build() { - println(docker.pull('archlinux', 'latest') or { panic('yeetus') }) + println(docker.pull('nginx', 'latest') or { panic('yeetus') }) // println(docker.containers() or { panic('heet') }) } diff --git a/src/docker/docker.v b/src/docker/docker.v index 0fcb058..b134bc2 100644 --- a/src/docker/docker.v +++ b/src/docker/docker.v @@ -23,12 +23,31 @@ fn send(req &string) ?http.Response { // Write the request to the socket s.write_string(req) ? + + s.wait_for_write() ? + + mut c := 0 mut buf := []byte{len: docker.buf_len} mut res := []byte{} - mut c := 0 + for { + c = s.read(mut buf) or { return error('Failed to read data from socket.') } + res << buf[..c] - for res.len < 5 && res#[-4..] != [0, '\r', `\n`, `\r`, `\n`] { + if c < docker.buf_len { + break + } + } + + // If the response isn't a chunked reply, we return early + parsed := http.parse_response(res.bytestr()) ? + + if parsed.header.get(http.CommonHeader.transfer_encoding) or { '' } != 'chunked' { + return parsed + } + + // We loop until we've encountered the end of the chunked response + for res.len < 5 || res#[-5..] != [byte(`0`), `\r`, `\n`, `\r`, `\n`] { // Wait for the server to respond s.wait_for_write() ? @@ -42,8 +61,6 @@ fn send(req &string) ?http.Response { } } - println(res) - // Decode chunked response return http.parse_response(res.bytestr())