summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcos Casagrande <marcoscvp90@gmail.com>2020-06-28 16:31:56 +0200
committerGitHub <noreply@github.com>2020-06-28 10:31:56 -0400
commit89ebe2079bf51ec55c89c093ab16c3179ccd43fe (patch)
tree6dc69537b2103a5e0b65676bcba00b7a068dfb5e
parent1c12098e4a4fbbf981574fafe5ac5a97294c17a0 (diff)
fix(cli/body): Maximum call stack size exceeded error (#6537)
-rw-r--r--cli/js/web/body.ts4
-rw-r--r--cli/tests/unit/body_test.ts23
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);
+});