From 344227f6d778f9104a99243ccd6da50e7c5d6272 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Jun 2022 20:59:24 -0400 Subject: [PATCH 1/3] stream request bodies --- packages/kit/src/node/index.js | 56 ++++++++++++++-------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/packages/kit/src/node/index.js b/packages/kit/src/node/index.js index 1b30bd113389..7bd022b7558a 100644 --- a/packages/kit/src/node/index.js +++ b/packages/kit/src/node/index.js @@ -2,51 +2,41 @@ import * as set_cookie_parser from 'set-cookie-parser'; /** @param {import('http').IncomingMessage} req */ function get_raw_body(req) { - return new Promise((fulfil, reject) => { - const h = req.headers; + const h = req.headers; - if (!h['content-type']) { - return fulfil(null); - } + if (!h['content-type']) { + return null; + } - req.on('error', reject); + const length = Number(h['content-length']); - const length = Number(h['content-length']); + // https://github.com/jshttp/type-is/blob/c1f4388c71c8a01f79934e68f630ca4a15fffcd6/index.js#L81-L95 + if (isNaN(length) && h['transfer-encoding'] == null) { + return null; + } - // https://github.com/jshttp/type-is/blob/c1f4388c71c8a01f79934e68f630ca4a15fffcd6/index.js#L81-L95 - if (isNaN(length) && h['transfer-encoding'] == null) { - return fulfil(null); - } + return new ReadableStream({ + start(controller) { + req.on('error', (error) => { + controller.error(error); + }); - let data = new Uint8Array(length || 0); + let size = 0; - if (length > 0) { - let offset = 0; req.on('data', (chunk) => { - const new_len = offset + Buffer.byteLength(chunk); + size += chunk.length; - if (new_len > length) { - return reject({ - status: 413, - reason: 'Exceeded "Content-Length" limit' - }); + if (size > length) { + controller.error(new Error('content-length exceeded')); } - data.set(chunk, offset); - offset = new_len; + controller.enqueue(chunk); }); - } else { - req.on('data', (chunk) => { - const new_data = new Uint8Array(data.length + chunk.length); - new_data.set(data, 0); - new_data.set(chunk, data.length); - data = new_data; + + req.on('end', () => { + controller.close(); }); } - - req.on('end', () => { - fulfil(data); - }); }); } @@ -67,7 +57,7 @@ export async function getRequest(base, req) { return new Request(base + req.url, { method: req.method, headers, - body: await get_raw_body(req) // TODO stream rather than buffer + body: get_raw_body(req) }); } From eb0c35f3726b49a012571f5275b2dca75612cc1d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Jun 2022 21:25:41 -0400 Subject: [PATCH 2/3] changeset --- .changeset/afraid-flowers-train.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/afraid-flowers-train.md diff --git a/.changeset/afraid-flowers-train.md b/.changeset/afraid-flowers-train.md new file mode 100644 index 000000000000..04a68bfd502f --- /dev/null +++ b/.changeset/afraid-flowers-train.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Stream request bodies From 3662de181339f69fd639d07ebcdde06e2223bf70 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 29 Jun 2022 13:35:42 -0400 Subject: [PATCH 3/3] Update packages/kit/src/node/index.js Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- packages/kit/src/node/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/src/node/index.js b/packages/kit/src/node/index.js index 7bd022b7558a..ca634b44c1aa 100644 --- a/packages/kit/src/node/index.js +++ b/packages/kit/src/node/index.js @@ -10,6 +10,7 @@ function get_raw_body(req) { const length = Number(h['content-length']); + // check if no request body // https://github.com/jshttp/type-is/blob/c1f4388c71c8a01f79934e68f630ca4a15fffcd6/index.js#L81-L95 if (isNaN(length) && h['transfer-encoding'] == null) { return null;