forked from veridatum-labs/earnproof-backend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrequest-shape.middleware.ts
More file actions
45 lines (41 loc) · 1.46 KB
/
Copy pathrequest-shape.middleware.ts
File metadata and controls
45 lines (41 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { PayloadTooLargeException } from "@nestjs/common";
import { NextFunction, Request, Response } from "express";
import { findPayloadShapeViolation } from "../limits/payload-shape";
import { PAYLOAD_SHAPE_LIMITS } from "../limits/request-limits";
import { ApiErrorCode } from "../dto/api-error.dto";
/**
* Rejects structurally abusive bodies immediately after parsing.
*
* Placement matters more than the check. As middleware it runs before guards,
* interceptors, pipes and the handler, so a hostile body is refused before
* authentication does database work, before the request-scoped machinery is
* built, and — critically — before class-transformer walks it, which is the
* step that a deeply nested body is designed to break.
*
* The exception carries the stable error code directly, so the global filter
* passes it through unchanged rather than classifying a 413 as an internal
* error.
*/
export function requestShapeMiddleware(
req: Request,
_res: Response,
next: NextFunction,
): void {
// Only parsed bodies are inspected. A GET has none, and a body the parser
// rejected never reaches here.
if (req.body === undefined || req.body === null) {
next();
return;
}
const violation = findPayloadShapeViolation(req.body, PAYLOAD_SHAPE_LIMITS);
if (violation) {
next(
new PayloadTooLargeException({
code: ApiErrorCode.PAYLOAD_TOO_LARGE,
message: violation.message,
}),
);
return;
}
next();
}