Skip to content

Commit 737160d

Browse files
Respond with status code 413 if request body is too large (#6936)
* Respond with status code 413 if request body is too large * Use the error method * Prevent arbitrary error messages from reaching users * Create strong-baboons-travel.md * Create five-tools-arrive.md Co-authored-by: Rich Harris <[email protected]>
1 parent 63bc2e2 commit 737160d

File tree

7 files changed

+24
-7
lines changed

7 files changed

+24
-7
lines changed

.changeset/five-tools-arrive.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@sveltejs/adapter-node": patch
3+
"@sveltejs/adapter-vercel": patch
4+
"@sveltejs/kit": patch
5+
---
6+
7+
Redact error message if `getRequest` fails

.changeset/strong-baboons-travel.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@sveltejs/kit": patch
3+
---
4+
5+
Respond with 413 if request body is too large

packages/adapter-node/src/handler.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const ssr = async (req, res) => {
5656
});
5757
} catch (err) {
5858
res.statusCode = err.status || 400;
59-
res.end(err.reason || 'Invalid request body');
59+
res.end('Invalid request body');
6060
return;
6161
}
6262

packages/adapter-vercel/files/serverless.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default async (req, res) => {
2323
request = await getRequest({ base: `https://${req.headers.host}`, request: req });
2424
} catch (err) {
2525
res.statusCode = err.status || 400;
26-
return res.end(err.reason || 'Invalid request body');
26+
return res.end('Invalid request body');
2727
}
2828

2929
setResponse(

packages/kit/src/exports/node/index.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as set_cookie_parser from 'set-cookie-parser';
2+
import { error } from '../index.js';
23

34
/**
45
* @param {import('http').IncomingMessage} req
@@ -27,7 +28,8 @@ function get_raw_body(req, body_size_limit) {
2728
if (!length) {
2829
length = body_size_limit;
2930
} else if (length > body_size_limit) {
30-
throw new Error(
31+
throw error(
32+
413,
3133
`Received content-length of ${length}, but only accept up to ${body_size_limit} bytes.`
3234
);
3335
}
@@ -45,6 +47,7 @@ function get_raw_body(req, body_size_limit) {
4547
return new ReadableStream({
4648
start(controller) {
4749
req.on('error', (error) => {
50+
cancelled = true;
4851
controller.error(error);
4952
});
5053

@@ -58,8 +61,10 @@ function get_raw_body(req, body_size_limit) {
5861

5962
size += chunk.length;
6063
if (size > length) {
61-
req.destroy(
62-
new Error(
64+
cancelled = true;
65+
controller.error(
66+
error(
67+
413,
6368
`request body size exceeded ${
6469
content_length ? "'content-length'" : 'BODY_SIZE_LIMIT'
6570
} of ${length}`

packages/kit/src/exports/vite/dev/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ export async function dev(vite, vite_config, svelte_config) {
397397
});
398398
} catch (/** @type {any} */ err) {
399399
res.statusCode = err.status || 400;
400-
return res.end(err.message || 'Invalid request body');
400+
return res.end('Invalid request body');
401401
}
402402

403403
const template = load_template(cwd, svelte_config);

packages/kit/src/exports/vite/preview/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export async function preview(vite, vite_config, svelte_config) {
137137
});
138138
} catch (/** @type {any} */ err) {
139139
res.statusCode = err.status || 400;
140-
return res.end(err.message || 'Invalid request body');
140+
return res.end('Invalid request body');
141141
}
142142

143143
setResponse(

0 commit comments

Comments
 (0)