From e2990be264776d4d17e0fa982f74e1ad54624d0d Mon Sep 17 00:00:00 2001 From: Marcos Casagrande Date: Mon, 3 Oct 2022 06:18:59 +0200 Subject: fix(ext/cache): close resource on error (#16129) --- cli/tests/unit/cache_api_test.ts | 24 +++++++++++++++++++++++- ext/cache/01_cache.js | 16 +++++++++------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/cli/tests/unit/cache_api_test.ts b/cli/tests/unit/cache_api_test.ts index 8b84bfc6d..16996c821 100644 --- a/cli/tests/unit/cache_api_test.ts +++ b/cli/tests/unit/cache_api_test.ts @@ -106,7 +106,7 @@ Deno.test(async function cachePutReaderLock() { response, ); - assertRejects( + await assertRejects( async () => { await response.arrayBuffer(); }, @@ -116,3 +116,25 @@ Deno.test(async function cachePutReaderLock() { await promise; }); + +Deno.test(async function cachePutResourceLeak() { + const cacheName = "cache-v1"; + const cache = await caches.open(cacheName); + + const stream = new ReadableStream({ + start(controller) { + controller.error(new Error("leak")); + }, + }); + + await assertRejects( + async () => { + await cache.put( + new Request("https://example.com/"), + new Response(stream), + ); + }, + Error, + "leak", + ); +}); diff --git a/ext/cache/01_cache.js b/ext/cache/01_cache.js index c2843cedb..c22390a6d 100644 --- a/ext/cache/01_cache.js +++ b/ext/cache/01_cache.js @@ -141,15 +141,17 @@ }, ); if (reader) { - while (true) { - const { value, done } = await reader.read(); - if (done) { - await core.shutdown(rid); - core.close(rid); - break; - } else { + try { + while (true) { + const { value, done } = await reader.read(); + if (done) { + break; + } await core.write(rid, value); } + } finally { + await core.shutdown(rid); + core.close(rid); } } // Step 12-19: TODO(@satyarohith): do the insertion in background. -- cgit v1.2.3