From ec66e42e736a76a832433cd9a58fec61ee77355b Mon Sep 17 00:00:00 2001 From: Eric Mastro Date: Fri, 4 Feb 2022 01:02:18 +1100 Subject: [PATCH] fix(rest): download unknown cid (#48) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Downloading a CID that is unknown to the network would wait for the blockexchange to try to get the data. However, a subsequent API call, eg upload for that CID, or a blockexchange timeout would cause the dagger node to crash, due to an attempt to complete a future that had already been completed. We were able to narrow this down to an attempt to call `resp.finish()` when the download block had already returned an `RestApiResponse` (and never sent any chunks to the response from the libp2p stream). Change the HTTP response code for an unknown cid from 400 to 404. Fix spelling mistake “cunk”. Co-authored-by: Michael Bradley Co-authored-by: Michael Bradley --- dagger/rest/api.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dagger/rest/api.nim b/dagger/rest/api.nim index 1c21eb74..7fd2549f 100644 --- a/dagger/rest/api.nim +++ b/dagger/rest/api.nim @@ -111,7 +111,7 @@ proc initRestApi*(node: DaggerNodeRef): RestRouter = if ( let retr = await node.retrieve(stream, id.get()); retr.isErr): - return RestApiResponse.error(Http400, retr.error.msg) + return RestApiResponse.error(Http404, retr.error.msg) await resp.prepareChunked() while not stream.atEof: @@ -124,15 +124,15 @@ proc initRestApi*(node: DaggerNodeRef): RestRouter = break bytes += buff.len - trace "Sending cunk", size = buff.len + trace "Sending chunk", size = buff.len await resp.sendChunk(addr buff[0], buff.len) + await resp.finish() except CatchableError as exc: trace "Excepting streaming blocks", exc = exc.msg return RestApiResponse.error(Http500) finally: trace "Sent bytes", cid = id.get(), bytes await stream.close() - await resp.finish() router.rawApi( MethodPost,