diff options
author | Marcos Casagrande <marcoscvp90@gmail.com> | 2020-06-28 16:31:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-28 10:31:56 -0400 |
commit | 89ebe2079bf51ec55c89c093ab16c3179ccd43fe (patch) | |
tree | 6dc69537b2103a5e0b65676bcba00b7a068dfb5e | |
parent | 1c12098e4a4fbbf981574fafe5ac5a97294c17a0 (diff) |
fix(cli/body): Maximum call stack size exceeded error (#6537)
-rw-r--r-- | cli/js/web/body.ts | 4 | ||||
-rw-r--r-- | cli/tests/unit/body_test.ts | 23 |
2 files changed, 25 insertions, 2 deletions
diff --git a/cli/js/web/body.ts b/cli/js/web/body.ts index 8f5b48ad8..8530154b3 100644 --- a/cli/js/web/body.ts +++ b/cli/js/web/body.ts @@ -35,7 +35,7 @@ function validateBodyType(owner: Body, bodySource: BodyInit | null): boolean { ); } -function concatenate(...arrays: Uint8Array[]): ArrayBuffer { +function concatenate(arrays: Uint8Array[]): ArrayBuffer { let totalLength = 0; for (const arr of arrays) { totalLength += arr.length; @@ -73,7 +73,7 @@ async function bufferFromStream( } } - return concatenate(...parts); + return concatenate(parts); } export const BodyUsedError = diff --git a/cli/tests/unit/body_test.ts b/cli/tests/unit/body_test.ts index df824e1ae..d0423f7de 100644 --- a/cli/tests/unit/body_test.ts +++ b/cli/tests/unit/body_test.ts @@ -79,3 +79,26 @@ unitTest({ perms: {} }, async function bodyURLSearchParams(): Promise<void> { const text = await body.text(); assertEquals(text, "hello=world"); }); + +unitTest(async function bodyArrayBufferMultipleParts(): Promise<void> { + const parts: Uint8Array[] = []; + let size = 0; + for (let i = 0; i <= 150000; i++) { + const part = new Uint8Array([1]); + parts.push(part); + size += part.length; + } + + let offset = 0; + const stream = new ReadableStream({ + pull(controller): void { + // parts.shift() takes forever: https://github.com/denoland/deno/issues/5259 + const chunk = parts[offset++]; + if (!chunk) return controller.close(); + controller.enqueue(chunk); + }, + }); + + const body = buildBody(stream); + assertEquals((await body.arrayBuffer()).byteLength, size); +}); |