From 3a3a8484069c9c6955fcb83ea761f9f74638175a Mon Sep 17 00:00:00 2001 From: Marcos Casagrande Date: Wed, 5 Oct 2022 13:01:24 +0200 Subject: [PATCH] fix(ext/cache): prevent cache insert if body is not fully written (#16138) --- 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 16996c8212..7bc372003a 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 c22390a6da..fa0b680378 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); } }