From 08c0a7ae664de2ef91a1f5fa3082f123eae0693b Mon Sep 17 00:00:00 2001 From: Marcos Casagrande Date: Mon, 3 Oct 2022 19:56:58 +0200 Subject: [PATCH] fix(ext/cache): prevent cache insert if body is not fully written --- cli/tests/unit/cache_api_test.ts | 29 ++++++++++++++++++++++++++++- ext/cache/01_cache.js | 2 +- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/cli/tests/unit/cache_api_test.ts b/cli/tests/unit/cache_api_test.ts index 16996c8212cf12..7bc372003aef86 100644 --- a/cli/tests/unit/cache_api_test.ts +++ b/cli/tests/unit/cache_api_test.ts @@ -130,7 +130,7 @@ Deno.test(async function cachePutResourceLeak() { await assertRejects( async () => { await cache.put( - new Request("https://example.com/"), + new Request("https://example.com/leak"), new Response(stream), ); }, @@ -138,3 +138,30 @@ Deno.test(async function cachePutResourceLeak() { "leak", ); }); + +Deno.test(async function cachePutFailedBody() { + const cacheName = "cache-v1"; + const cache = await caches.open(cacheName); + + const request = new Request("https://example.com/failed-body"); + const stream = new ReadableStream({ + start(controller) { + controller.error(new Error("corrupt")); + }, + }); + + await assertRejects( + async () => { + await cache.put( + request, + new Response(stream), + ); + }, + Error, + "corrupt", + ); + + const response = await cache.match(request); + // if it fails to read the body, the cache should be empty + assertEquals(response, undefined); +}); diff --git a/ext/cache/01_cache.js b/ext/cache/01_cache.js index c22390a6dae121..fa0b680378542d 100644 --- a/ext/cache/01_cache.js +++ b/ext/cache/01_cache.js @@ -145,12 +145,12 @@ while (true) { const { value, done } = await reader.read(); if (done) { + await core.shutdown(rid); break; } await core.write(rid, value); } } finally { - await core.shutdown(rid); core.close(rid); } }