exisjs 0.7.13 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +4 -37
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +3 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +10 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +9 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/database/lifecycle.d.ts +7 -0
- package/dist/database/lifecycle.d.ts.map +1 -1
- package/dist/database/lifecycle.js +30 -7
- package/dist/database/lifecycle.js.map +1 -1
- package/dist/decorators/caching.d.ts +2 -5
- package/dist/decorators/caching.d.ts.map +1 -1
- package/dist/decorators/caching.js +7 -61
- package/dist/decorators/caching.js.map +1 -1
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +5 -0
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/cron.d.ts +1 -0
- package/dist/decorators/cron.d.ts.map +1 -1
- package/dist/decorators/cron.js +4 -1
- package/dist/decorators/cron.js.map +1 -1
- package/dist/di/container.d.ts +1 -0
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +19 -3
- package/dist/di/container.js.map +1 -1
- package/dist/docs/ARCHITECTURE.md +117 -78
- package/dist/docs/BENCHMARKS.md +59 -26
- package/dist/docs/README.md +1 -1
- package/dist/docs/content/boundaries.mdx +2 -0
- package/dist/docs/content/cli/commands.mdx +1 -2
- package/dist/docs/content/cli/overview.mdx +1 -1
- package/dist/docs/content/config.mdx +22 -9
- package/dist/docs/content/cron.mdx +2 -2
- package/dist/docs/content/decorators.mdx +2 -2
- package/dist/docs/content/errors.mdx +22 -6
- package/dist/docs/content/installation.mdx +13 -8
- package/dist/docs/content/introduction.mdx +12 -12
- package/dist/docs/content/middleware.mdx +1 -1
- package/dist/docs/content/providers.mdx +4 -4
- package/dist/docs/content/requests.mdx +12 -1
- package/dist/docs/content/responses.mdx +44 -3
- package/dist/docs/content/routing.mdx +24 -0
- package/dist/docs/content/structure.mdx +4 -1
- package/dist/docs/content/testing.mdx +2 -0
- package/dist/docs/content/validation.mdx +16 -2
- package/dist/docs/reference/README.md +1 -1
- package/dist/docs/reference/config.mdx +1 -1
- package/dist/docs/reference/decorators.mdx +2 -2
- package/dist/docs/reference/di.mdx +1 -1
- package/dist/docs/reference/middleware.mdx +7 -5
- package/dist/docs/reference/sanitize.mdx +4 -4
- package/dist/docs/reference/validator.mdx +1 -1
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +31 -8
- package/dist/error/errors.js.map +1 -1
- package/dist/lib/start-server.js +24 -1
- package/dist/lib/start-server.js.map +1 -1
- package/dist/middleware/compression.d.ts +0 -12
- package/dist/middleware/compression.d.ts.map +1 -1
- package/dist/middleware/compression.js +52 -41
- package/dist/middleware/compression.js.map +1 -1
- package/dist/middleware/idempotency.d.ts +11 -6
- package/dist/middleware/idempotency.d.ts.map +1 -1
- package/dist/middleware/idempotency.js +5 -35
- package/dist/middleware/idempotency.js.map +1 -1
- package/dist/middleware/ip-filter.d.ts.map +1 -1
- package/dist/middleware/ip-filter.js +0 -16
- package/dist/middleware/ip-filter.js.map +1 -1
- package/dist/middleware/middleware.d.ts +2 -1
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +92 -56
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +19 -38
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +3 -1
- package/dist/middleware/security.js.map +1 -1
- package/dist/middleware/upload.d.ts.map +1 -1
- package/dist/middleware/upload.js +15 -7
- package/dist/middleware/upload.js.map +1 -1
- package/dist/response/index.d.ts +23 -0
- package/dist/response/index.d.ts.map +1 -1
- package/dist/response/index.js +28 -1
- package/dist/response/index.js.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/radix.d.ts +3 -16
- package/dist/router/radix.d.ts.map +1 -1
- package/dist/router/radix.js +135 -211
- package/dist/router/radix.js.map +1 -1
- package/dist/router/route-builder.d.ts +28 -0
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +2 -1
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +37 -44
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +153 -126
- package/dist/router/router.js.map +1 -1
- package/dist/router/scanner/boundary-loader.d.ts.map +1 -1
- package/dist/router/scanner/boundary-loader.js +7 -2
- package/dist/router/scanner/boundary-loader.js.map +1 -1
- package/dist/router/scanner/fs-scanner.d.ts.map +1 -1
- package/dist/router/scanner/fs-scanner.js +22 -0
- package/dist/router/scanner/fs-scanner.js.map +1 -1
- package/dist/router/scanner/functional-compiler.d.ts.map +1 -1
- package/dist/router/scanner/functional-compiler.js +9 -1
- package/dist/router/scanner/functional-compiler.js.map +1 -1
- package/dist/router/types.d.ts +6 -4
- package/dist/router/types.d.ts.map +1 -1
- package/dist/sanitize/index.d.ts +2 -3
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +15 -20
- package/dist/sanitize/index.js.map +1 -1
- package/dist/server/adapters/bun-adapter.d.ts +2 -1
- package/dist/server/adapters/bun-adapter.d.ts.map +1 -1
- package/dist/server/adapters/bun-adapter.js +22 -2
- package/dist/server/adapters/bun-adapter.js.map +1 -1
- package/dist/server/app.d.ts +2 -2
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +14 -7
- package/dist/server/app.js.map +1 -1
- package/dist/server/bootstrapper.d.ts +2 -2
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +21 -2
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/download.d.ts +22 -0
- package/dist/server/download.d.ts.map +1 -0
- package/dist/server/download.js +18 -0
- package/dist/server/download.js.map +1 -0
- package/dist/server/helpers/body-parser.d.ts +1 -1
- package/dist/server/helpers/body-parser.d.ts.map +1 -1
- package/dist/server/helpers/body-parser.js +126 -48
- package/dist/server/helpers/body-parser.js.map +1 -1
- package/dist/server/helpers/cookie.d.ts +6 -0
- package/dist/server/helpers/cookie.d.ts.map +1 -1
- package/dist/server/helpers/cookie.js +35 -0
- package/dist/server/helpers/cookie.js.map +1 -1
- package/dist/server/helpers/etag.d.ts.map +1 -1
- package/dist/server/helpers/etag.js +7 -2
- package/dist/server/helpers/etag.js.map +1 -1
- package/dist/server/helpers/index.d.ts +2 -1
- package/dist/server/helpers/index.d.ts.map +1 -1
- package/dist/server/helpers/index.js +5 -1
- package/dist/server/helpers/index.js.map +1 -1
- package/dist/server/helpers/ip.d.ts +13 -0
- package/dist/server/helpers/ip.d.ts.map +1 -1
- package/dist/server/helpers/ip.js +65 -54
- package/dist/server/helpers/ip.js.map +1 -1
- package/dist/server/helpers/json.d.ts +3 -0
- package/dist/server/helpers/json.d.ts.map +1 -0
- package/dist/server/helpers/json.js +43 -0
- package/dist/server/helpers/json.js.map +1 -0
- package/dist/server/helpers/upload-name.d.ts +9 -0
- package/dist/server/helpers/upload-name.d.ts.map +1 -0
- package/dist/server/helpers/upload-name.js +39 -0
- package/dist/server/helpers/upload-name.js.map +1 -0
- package/dist/server/request-handler.d.ts +0 -7
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +19 -46
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +3 -2
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +22 -16
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +20 -6
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +107 -34
- package/dist/server/response.js.map +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/reporter.d.mts.map +1 -1
- package/dist/testing/reporter.mjs +18 -0
- package/dist/testing/reporter.mjs.map +1 -1
- package/dist/utils/ttl-cache.d.ts +11 -0
- package/dist/utils/ttl-cache.d.ts.map +1 -0
- package/dist/utils/ttl-cache.js +42 -0
- package/dist/utils/ttl-cache.js.map +1 -0
- package/dist/validator/builder.d.ts +2 -2
- package/dist/validator/builder.js +2 -2
- package/dist/validator/compile.d.ts +3 -0
- package/dist/validator/compile.d.ts.map +1 -0
- package/dist/validator/compile.js +254 -0
- package/dist/validator/compile.js.map +1 -0
- package/dist/validator/engine.d.ts +1 -0
- package/dist/validator/engine.d.ts.map +1 -1
- package/dist/validator/engine.js +285 -317
- package/dist/validator/engine.js.map +1 -1
- package/dist/validator/error.d.ts +1 -0
- package/dist/validator/error.d.ts.map +1 -1
- package/dist/validator/error.js +11 -1
- package/dist/validator/error.js.map +1 -1
- package/dist/validator/rules.d.ts +64 -0
- package/dist/validator/rules.d.ts.map +1 -0
- package/dist/validator/rules.js +655 -0
- package/dist/validator/rules.js.map +1 -0
- package/dist/validator/tex-types.d.ts +4 -4
- package/dist/validator/tex-types.d.ts.map +1 -1
- package/dist/validator/text.d.ts +11 -0
- package/dist/validator/text.d.ts.map +1 -0
- package/dist/validator/text.js +69 -0
- package/dist/validator/text.js.map +1 -0
- package/package.json +56 -39
|
@@ -13,70 +13,83 @@ function normalizeIp(ip) {
|
|
|
13
13
|
}
|
|
14
14
|
return ip;
|
|
15
15
|
}
|
|
16
|
+
// Env overrides are read once; process.env access is slow on the hot path.
|
|
17
|
+
let envTrust;
|
|
18
|
+
function envTrustsProxy() {
|
|
19
|
+
if (envTrust === undefined) {
|
|
20
|
+
envTrust =
|
|
21
|
+
process.env.TRUST_PROXY === 'true' ||
|
|
22
|
+
process.env.EXIS_TRUST_PROXY === 'true';
|
|
23
|
+
}
|
|
24
|
+
return envTrust;
|
|
25
|
+
}
|
|
26
|
+
function isProxyTrusted(trustProxy) {
|
|
27
|
+
return Boolean(trustProxy) || envTrustsProxy();
|
|
28
|
+
}
|
|
29
|
+
function firstHeader(val) {
|
|
30
|
+
const v = Array.isArray(val) ? val[0] : val;
|
|
31
|
+
if (typeof v !== 'string')
|
|
32
|
+
return undefined;
|
|
33
|
+
const t = v.trim();
|
|
34
|
+
return t === '' ? undefined : t;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolves the client IP.
|
|
38
|
+
*
|
|
39
|
+
* - `trustProxy: false` -> socket address only.
|
|
40
|
+
* - `trustProxy: true` -> trust every hop: CDN headers (CF-Connecting-IP,
|
|
41
|
+
* True-Client-IP, X-Real-IP, X-Client-IP), else the left-most
|
|
42
|
+
* X-Forwarded-For entry. Only safe when every request passes through a
|
|
43
|
+
* proxy that overwrites these headers.
|
|
44
|
+
* - `trustProxy: N` -> trust the N closest hops, counting the socket peer
|
|
45
|
+
* (Express semantics). The client is the entry N steps back from the
|
|
46
|
+
* socket, so values a client prepends to X-Forwarded-For are ignored.
|
|
47
|
+
* CDN headers are not consulted, since any client can send them.
|
|
48
|
+
*/
|
|
16
49
|
function resolveIps(raw, trustProxy) {
|
|
17
|
-
const isTrusted = Boolean(trustProxy) ||
|
|
18
|
-
process.env.TRUST_PROXY === 'true' ||
|
|
19
|
-
process.env.EXIS_TRUST_PROXY === 'true';
|
|
20
50
|
const rawRemote = raw.socket?.remoteAddress ?? '127.0.0.1';
|
|
21
51
|
const remoteAddress = normalizeIp(rawRemote);
|
|
22
|
-
if (!
|
|
52
|
+
if (!isProxyTrusted(trustProxy)) {
|
|
23
53
|
return { ips: [], ip: remoteAddress };
|
|
24
54
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
55
|
+
const hops = typeof trustProxy === 'number' && trustProxy > 0 ? trustProxy : Infinity;
|
|
56
|
+
if (hops === Infinity) {
|
|
57
|
+
const h = raw.headers;
|
|
58
|
+
const direct = firstHeader(h['cf-connecting-ip']) ||
|
|
59
|
+
firstHeader(h['true-client-ip']) ||
|
|
60
|
+
firstHeader(h['x-real-ip']) ||
|
|
61
|
+
firstHeader(h['x-client-ip']);
|
|
62
|
+
if (direct) {
|
|
63
|
+
const ip = normalizeIp(direct);
|
|
33
64
|
return { ips: [ip], ip };
|
|
34
65
|
}
|
|
35
66
|
}
|
|
36
|
-
const trueClientIp = raw.headers['true-client-ip'];
|
|
37
|
-
if (trueClientIp) {
|
|
38
|
-
const rawVal = Array.isArray(trueClientIp) ? trueClientIp[0] : trueClientIp;
|
|
39
|
-
if (typeof rawVal === 'string' && rawVal.trim() !== '') {
|
|
40
|
-
const ip = normalizeIp(rawVal.trim());
|
|
41
|
-
return { ips: [ip], ip };
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const xRealIp = raw.headers['x-real-ip'];
|
|
45
|
-
if (xRealIp) {
|
|
46
|
-
const rawVal = Array.isArray(xRealIp) ? xRealIp[0] : xRealIp;
|
|
47
|
-
if (typeof rawVal === 'string' && rawVal.trim() !== '') {
|
|
48
|
-
const ip = normalizeIp(rawVal.trim());
|
|
49
|
-
return { ips: [ip], ip };
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const xClientIp = raw.headers['x-client-ip'];
|
|
53
|
-
if (xClientIp) {
|
|
54
|
-
const rawVal = Array.isArray(xClientIp) ? xClientIp[0] : xClientIp;
|
|
55
|
-
if (typeof rawVal === 'string' && rawVal.trim() !== '') {
|
|
56
|
-
const ip = normalizeIp(rawVal.trim());
|
|
57
|
-
return { ips: [ip], ip };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// 2. Parse standard X-Forwarded-For proxy chain
|
|
61
67
|
const xForwardedFor = raw.headers['x-forwarded-for'];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
if (!xForwardedFor)
|
|
69
|
+
return { ips: [], ip: remoteAddress };
|
|
70
|
+
const rawVal = Array.isArray(xForwardedFor)
|
|
71
|
+
? xForwardedFor.join(',')
|
|
72
|
+
: xForwardedFor;
|
|
73
|
+
const forwarded = [];
|
|
74
|
+
for (const part of rawVal.split(',')) {
|
|
75
|
+
const t = part.trim();
|
|
76
|
+
if (t !== '')
|
|
77
|
+
forwarded.push(normalizeIp(t));
|
|
68
78
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
79
|
+
if (forwarded.length === 0)
|
|
80
|
+
return { ips: [], ip: remoteAddress };
|
|
81
|
+
if (hops === Infinity) {
|
|
82
|
+
return { ips: forwarded, ip: forwarded[0] };
|
|
72
83
|
}
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
// Full chain as seen from the server: [...forwarded, socketPeer].
|
|
85
|
+
// Trusting N hops means the client sits at index (length - 1 - N).
|
|
86
|
+
const chainLen = forwarded.length + 1;
|
|
87
|
+
const clientIdx = Math.max(0, chainLen - 1 - hops);
|
|
88
|
+
const ips = forwarded.slice(clientIdx);
|
|
89
|
+
return { ips, ip: forwarded[clientIdx] };
|
|
75
90
|
}
|
|
76
91
|
function resolveProtocol(raw, trustProxy) {
|
|
77
|
-
const isTrusted =
|
|
78
|
-
process.env.TRUST_PROXY === 'true' ||
|
|
79
|
-
process.env.EXIS_TRUST_PROXY === 'true';
|
|
92
|
+
const isTrusted = isProxyTrusted(trustProxy);
|
|
80
93
|
const connection = raw.socket;
|
|
81
94
|
const isTls = connection?.encrypted || false;
|
|
82
95
|
let protocol = isTls ? 'https' : 'http';
|
|
@@ -103,9 +116,7 @@ function resolveProtocol(raw, trustProxy) {
|
|
|
103
116
|
return protocol;
|
|
104
117
|
}
|
|
105
118
|
function resolveHostname(raw, trustProxy) {
|
|
106
|
-
const isTrusted =
|
|
107
|
-
process.env.TRUST_PROXY === 'true' ||
|
|
108
|
-
process.env.EXIS_TRUST_PROXY === 'true';
|
|
119
|
+
const isTrusted = isProxyTrusted(trustProxy);
|
|
109
120
|
let host = raw.headers['x-forwarded-host'];
|
|
110
121
|
if (!host || !isTrusted) {
|
|
111
122
|
host = raw.headers.host || '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":";;AAEA,kCAQC;
|
|
1
|
+
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/json.ts"],"names":[],"mappings":"AA2BA,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAG7C;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAM5D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// JSON body parsing with prototype-pollution protection.
|
|
3
|
+
//
|
|
4
|
+
// V8's JSON.parse is ~7x faster than round-tripping through the native
|
|
5
|
+
// binding (string -> serde Value -> JS object). JSON.parse never pollutes a
|
|
6
|
+
// prototype by itself: "__proto__" becomes an own property. The danger is a
|
|
7
|
+
// later merge (Object.assign, spread into defaults, deep merge) copying that
|
|
8
|
+
// key, so we drop "__proto__" and "constructor" keys the same way the native
|
|
9
|
+
// parser did. The full walk only runs when the raw text could contain either
|
|
10
|
+
// key; a \u escape could spell one out, so it also triggers the walk.
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.stripPrototype = stripPrototype;
|
|
13
|
+
exports.secureJsonParse = secureJsonParse;
|
|
14
|
+
const SUSPECT = /__proto__|constructor|\\u/;
|
|
15
|
+
function strip(value) {
|
|
16
|
+
if (value === null || typeof value !== 'object')
|
|
17
|
+
return;
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
for (const item of value)
|
|
20
|
+
strip(item);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (Object.prototype.hasOwnProperty.call(value, '__proto__')) {
|
|
24
|
+
delete value.__proto__;
|
|
25
|
+
}
|
|
26
|
+
if (Object.prototype.hasOwnProperty.call(value, 'constructor')) {
|
|
27
|
+
delete value.constructor;
|
|
28
|
+
}
|
|
29
|
+
for (const k in value)
|
|
30
|
+
strip(value[k]);
|
|
31
|
+
}
|
|
32
|
+
function stripPrototype(value) {
|
|
33
|
+
strip(value);
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function secureJsonParse(text) {
|
|
37
|
+
const value = JSON.parse(text);
|
|
38
|
+
if (value !== null && typeof value === 'object' && SUSPECT.test(text)) {
|
|
39
|
+
strip(value);
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/server/helpers/json.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,sEAAsE;;AAmBtE,wCAGC;AAED,0CAMC;AA5BD,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAE3C,SAAS,KAAK,CAAC,KAAU;IACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAM;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC,SAAS,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC,WAAW,CAAA;IAC1B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,SAAgB,cAAc,CAAI,KAAQ;IACxC,KAAK,CAAC,KAAK,CAAC,CAAA;IACZ,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,eAAe,CAAc,IAAY;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,KAAK,CAAC,KAAK,CAAC,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function safeUploadName(fieldname: string, filename: string): string;
|
|
2
|
+
export declare function safeUploadPath(destDir: string, fieldname: string, filename: string): string;
|
|
3
|
+
export declare const DEFAULT_UPLOAD_LIMITS: {
|
|
4
|
+
files: number;
|
|
5
|
+
fields: number;
|
|
6
|
+
parts: number;
|
|
7
|
+
fieldSize: number;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=upload-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-name.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/upload-name.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAGD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAGD,eAAO,MAAM,qBAAqB;;;;;CAKjC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_UPLOAD_LIMITS = void 0;
|
|
7
|
+
exports.safeUploadName = safeUploadName;
|
|
8
|
+
exports.safeUploadPath = safeUploadPath;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
// The multipart field name and filename are client-controlled. Neither may
|
|
12
|
+
// reach the filesystem as-is: "../../x" in a field name used to escape the
|
|
13
|
+
// upload directory via path.join. Only a short alnum token of each survives,
|
|
14
|
+
// and the random part is a UUID instead of guessable Date.now()/Math.random().
|
|
15
|
+
function safeUploadName(fieldname, filename) {
|
|
16
|
+
const field = String(fieldname || 'file')
|
|
17
|
+
.replace(/[^A-Za-z0-9_-]/g, '_')
|
|
18
|
+
.slice(0, 64) || 'file';
|
|
19
|
+
const rawExt = node_path_1.default.extname(String(filename || '')).toLowerCase();
|
|
20
|
+
const ext = /^\.[a-z0-9]{1,16}$/.test(rawExt) ? rawExt : '';
|
|
21
|
+
return `${field}-${(0, node_crypto_1.randomUUID)()}${ext}`;
|
|
22
|
+
}
|
|
23
|
+
// Joins and verifies the result stays inside destDir
|
|
24
|
+
function safeUploadPath(destDir, fieldname, filename) {
|
|
25
|
+
const root = node_path_1.default.resolve(destDir);
|
|
26
|
+
const dest = node_path_1.default.resolve(root, safeUploadName(fieldname, filename));
|
|
27
|
+
if (node_path_1.default.dirname(dest) !== root) {
|
|
28
|
+
throw new Error('Refusing to write upload outside destination directory');
|
|
29
|
+
}
|
|
30
|
+
return dest;
|
|
31
|
+
}
|
|
32
|
+
// Applied when a route configures no limits of its own
|
|
33
|
+
exports.DEFAULT_UPLOAD_LIMITS = {
|
|
34
|
+
files: 10,
|
|
35
|
+
fields: 100,
|
|
36
|
+
parts: 200,
|
|
37
|
+
fieldSize: 1024 * 1024,
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=upload-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-name.js","sourceRoot":"","sources":["../../../src/server/helpers/upload-name.ts"],"names":[],"mappings":";;;;;;AAOA,wCAQC;AAGD,wCAWC;AA7BD,6CAAwC;AACxC,0DAA4B;AAE5B,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,SAAgB,cAAc,CAAC,SAAiB,EAAE,QAAgB;IAChE,MAAM,KAAK,GACT,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;SACxB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAA;IAC3B,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACjE,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,OAAO,GAAG,KAAK,IAAI,IAAA,wBAAU,GAAE,GAAG,GAAG,EAAE,CAAA;AACzC,CAAC;AAED,qDAAqD;AACrD,SAAgB,cAAc,CAC5B,OAAe,EACf,SAAiB,EACjB,QAAgB;IAEhB,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpE,IAAI,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,uDAAuD;AAC1C,QAAA,qBAAqB,GAAG;IACnC,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,IAAI,GAAG,IAAI;CACvB,CAAA"}
|
|
@@ -7,14 +7,7 @@ export declare class RequestHandler {
|
|
|
7
7
|
private app;
|
|
8
8
|
private _compiledPipeline?;
|
|
9
9
|
static activeRequests: number;
|
|
10
|
-
private _reqPool;
|
|
11
|
-
private _resPool;
|
|
12
|
-
private static readonly MAX_POOL_SIZE;
|
|
13
10
|
constructor(app: App<any>);
|
|
14
|
-
private _acquireReq;
|
|
15
|
-
private _acquireRes;
|
|
16
|
-
private _releaseReq;
|
|
17
|
-
private _releaseRes;
|
|
18
11
|
getCompiledPipeline(): Handler[];
|
|
19
12
|
inject(options: {
|
|
20
13
|
method?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAMvC,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAMvC,qBAAa,cAAc;IAIb,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,iBAAiB,CAAC,CAAW;IACrC,OAAc,cAAc,SAAI;gBAEZ,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAE1B,mBAAmB,IAAI,OAAO,EAAE;IAsB1B,MAAM,CAAC,OAAO,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,EAAE,GAAG,CAAA;QACV,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,GAAG,OAAO,CAAC,OAAO,mBAAmB,EAAE,YAAY,CAAC;IAwF9C,mBAAmB,CACxB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,IAAI,GACpB,IAAI;IA6BA,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;YAyDtD,gBAAgB;YAuChB,iBAAiB;CAuChC"}
|
|
@@ -49,37 +49,6 @@ const noop = () => {
|
|
|
49
49
|
class RequestHandler {
|
|
50
50
|
constructor(app) {
|
|
51
51
|
this.app = app;
|
|
52
|
-
// ─── Object Pools ───────────────────────────────────────────────────────────
|
|
53
|
-
// Recycle ExisRequest and ExisResponse objects instead of allocating new ones
|
|
54
|
-
// per request. This dramatically reduces V8 GC pressure under high load.
|
|
55
|
-
this._reqPool = [];
|
|
56
|
-
this._resPool = [];
|
|
57
|
-
}
|
|
58
|
-
_acquireReq(rawReq, res, trustProxy, bodyLimit) {
|
|
59
|
-
const pooled = this._reqPool.pop();
|
|
60
|
-
if (pooled) {
|
|
61
|
-
return pooled.init(rawReq, res, trustProxy, bodyLimit);
|
|
62
|
-
}
|
|
63
|
-
return new request_1.ExisRequest(rawReq, res, trustProxy, bodyLimit);
|
|
64
|
-
}
|
|
65
|
-
_acquireRes(rawRes) {
|
|
66
|
-
const pooled = this._resPool.pop();
|
|
67
|
-
if (pooled) {
|
|
68
|
-
return pooled.init(rawRes);
|
|
69
|
-
}
|
|
70
|
-
return new response_1.ExisResponse(rawRes);
|
|
71
|
-
}
|
|
72
|
-
_releaseReq(req) {
|
|
73
|
-
req.cleanup();
|
|
74
|
-
if (this._reqPool.length < RequestHandler.MAX_POOL_SIZE) {
|
|
75
|
-
this._reqPool.push(req);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
_releaseRes(res) {
|
|
79
|
-
res.req = undefined;
|
|
80
|
-
if (this._resPool.length < RequestHandler.MAX_POOL_SIZE) {
|
|
81
|
-
this._resPool.push(res);
|
|
82
|
-
}
|
|
83
52
|
}
|
|
84
53
|
getCompiledPipeline() {
|
|
85
54
|
if (this._compiledPipeline)
|
|
@@ -87,8 +56,12 @@ class RequestHandler {
|
|
|
87
56
|
this.app.applyBuiltins();
|
|
88
57
|
if (this.app.globalMiddleware.length === 0) {
|
|
89
58
|
this._compiledPipeline = [
|
|
90
|
-
(req, res) => this.app.getRouter().handle(req, res, () => {
|
|
91
|
-
|
|
59
|
+
(req, res, next) => this.app.getRouter().handle(req, res, (err) => {
|
|
60
|
+
// Route errors must reach the error handlers, not become a 404
|
|
61
|
+
if (err)
|
|
62
|
+
next(err);
|
|
63
|
+
else
|
|
64
|
+
(0, middleware_1.notFound)(req, res, noop);
|
|
92
65
|
}),
|
|
93
66
|
];
|
|
94
67
|
}
|
|
@@ -209,31 +182,32 @@ class RequestHandler {
|
|
|
209
182
|
}
|
|
210
183
|
handle(rawReq, rawRes) {
|
|
211
184
|
RequestHandler.activeRequests++;
|
|
212
|
-
|
|
213
|
-
|
|
185
|
+
// Fresh objects per request. Pooling them is unsafe: a handler that is
|
|
186
|
+
// still awaiting after the client disconnects would observe the next
|
|
187
|
+
// request's data once the object is recycled. Short-lived objects are
|
|
188
|
+
// cheap for V8's young generation, so pooling buys nothing measurable.
|
|
189
|
+
const res = new response_1.ExisResponse(rawRes);
|
|
190
|
+
const req = new request_1.ExisRequest(rawReq, res, this.app.options.trustProxy, this.app.options.bodyLimit);
|
|
214
191
|
res.req = req;
|
|
215
192
|
res.etagEnabled = this.app.options.etag === true;
|
|
216
193
|
req.log = this.app.log;
|
|
217
|
-
//
|
|
194
|
+
// Fired by res.end()'s completion callback, or by 'close' when the
|
|
195
|
+
// client disconnects before the response finished.
|
|
218
196
|
let isDone = false;
|
|
219
197
|
const onDone = () => {
|
|
220
198
|
if (isDone)
|
|
221
199
|
return;
|
|
222
200
|
isDone = true;
|
|
223
|
-
if (RequestHandler.activeRequests > 0)
|
|
201
|
+
if (RequestHandler.activeRequests > 0)
|
|
224
202
|
RequestHandler.activeRequests--;
|
|
225
|
-
}
|
|
226
|
-
this._releaseReq(req);
|
|
227
|
-
this._releaseRes(res);
|
|
228
203
|
};
|
|
229
204
|
res._onDone = onDone;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
else if (typeof rawRes.on === 'function') {
|
|
205
|
+
// Covers clients that disconnect before res.end(); 'close' fires at most
|
|
206
|
+
// once, so a plain listener avoids the once() wrapper allocation
|
|
207
|
+
if (typeof rawRes.on === 'function')
|
|
234
208
|
rawRes.on('close', onDone);
|
|
235
|
-
}
|
|
236
209
|
const pipeline = this._compiledPipeline || this.getCompiledPipeline();
|
|
210
|
+
(0, middleware_1.assignRequestId)(req, res);
|
|
237
211
|
this._executeWithContext(req, res, () => {
|
|
238
212
|
if (this.app.hooks.request.length === 0 &&
|
|
239
213
|
this.app.hooks.response.length === 0) {
|
|
@@ -310,5 +284,4 @@ class RequestHandler {
|
|
|
310
284
|
}
|
|
311
285
|
exports.RequestHandler = RequestHandler;
|
|
312
286
|
RequestHandler.activeRequests = 0;
|
|
313
|
-
RequestHandler.MAX_POOL_SIZE = 2048;
|
|
314
287
|
//# sourceMappingURL=request-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-handler.js","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,0DAAiE;AACjE,uCAAuC;AACvC,yCAAyC;AACzC,uCAA4D;AAC5D,6CAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"request-handler.js","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/server/request.d.ts
CHANGED
|
@@ -23,7 +23,8 @@ export declare class ExisRequest<TBody = unknown, TQuery = Record<string, string
|
|
|
23
23
|
private _abortController?;
|
|
24
24
|
get signal(): AbortSignal;
|
|
25
25
|
set signal(val: AbortSignal);
|
|
26
|
-
|
|
26
|
+
private _diCacheMap?;
|
|
27
|
+
get _diCache(): Map<any, any>;
|
|
27
28
|
private _urlStr;
|
|
28
29
|
private _qIdx;
|
|
29
30
|
private _path?;
|
|
@@ -34,7 +35,7 @@ export declare class ExisRequest<TBody = unknown, TQuery = Record<string, string
|
|
|
34
35
|
private _protocol?;
|
|
35
36
|
private _hostname?;
|
|
36
37
|
private _method?;
|
|
37
|
-
private _onClose
|
|
38
|
+
private _onClose?;
|
|
38
39
|
cleanup(): void;
|
|
39
40
|
constructor(raw: IncomingMessage, res: ExisResponse, trustProxy?: boolean | number, bodyLimit?: number);
|
|
40
41
|
init(raw: IncomingMessage, res: ExisResponse, trustProxy?: boolean | number, bodyLimit?: number): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/server/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/server/request.ts"],"names":[],"mappings":"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"}
|
package/dist/server/request.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ExisRequest = void 0;
|
|
4
4
|
const errors_1 = require("../error/errors");
|
|
5
|
-
const
|
|
5
|
+
const json_1 = require("./helpers/json");
|
|
6
|
+
const cookie_1 = require("./helpers/cookie");
|
|
6
7
|
const helpers_1 = require("./helpers");
|
|
7
8
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
8
9
|
const accepts = require('accepts');
|
|
@@ -21,6 +22,16 @@ class ExisRequest {
|
|
|
21
22
|
if (!this._abortController) {
|
|
22
23
|
this._abortController = new AbortController();
|
|
23
24
|
this._signal = this._abortController.signal;
|
|
25
|
+
if (!this._onClose) {
|
|
26
|
+
this._onClose = () => {
|
|
27
|
+
if (!this.res.raw.writableEnded && !this.res.headersSent) {
|
|
28
|
+
if (this._abortController &&
|
|
29
|
+
!this._abortController.signal.aborted) {
|
|
30
|
+
this._abortController.abort();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
24
35
|
if (typeof this.raw?.once === 'function') {
|
|
25
36
|
this.raw.once('close', this._onClose);
|
|
26
37
|
}
|
|
@@ -33,8 +44,11 @@ class ExisRequest {
|
|
|
33
44
|
set signal(val) {
|
|
34
45
|
this._signal = val;
|
|
35
46
|
}
|
|
47
|
+
get _diCache() {
|
|
48
|
+
return this._diCacheMap || (this._diCacheMap = new Map());
|
|
49
|
+
}
|
|
36
50
|
cleanup() {
|
|
37
|
-
if (this._abortController) {
|
|
51
|
+
if (this._abortController && this._onClose) {
|
|
38
52
|
if (typeof this.raw?.removeListener === 'function') {
|
|
39
53
|
this.raw.removeListener('close', this._onClose);
|
|
40
54
|
}
|
|
@@ -44,7 +58,7 @@ class ExisRequest {
|
|
|
44
58
|
this._abortController = undefined;
|
|
45
59
|
this._signal = undefined;
|
|
46
60
|
}
|
|
47
|
-
this.
|
|
61
|
+
this._diCacheMap?.clear();
|
|
48
62
|
this.user = undefined;
|
|
49
63
|
this.session = undefined;
|
|
50
64
|
this.body = undefined;
|
|
@@ -70,14 +84,6 @@ class ExisRequest {
|
|
|
70
84
|
this.trustProxy = trustProxy;
|
|
71
85
|
this.bodyLimit = bodyLimit;
|
|
72
86
|
this.files = [];
|
|
73
|
-
this._diCache = new Map();
|
|
74
|
-
this._onClose = () => {
|
|
75
|
-
if (!this.res.raw.writableEnded && !this.res.headersSent) {
|
|
76
|
-
if (this._abortController && !this._abortController.signal.aborted) {
|
|
77
|
-
this._abortController.abort();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
87
|
this._urlStr = raw.url ?? '/';
|
|
82
88
|
this._qIdx = this._urlStr.indexOf('?');
|
|
83
89
|
}
|
|
@@ -97,7 +103,7 @@ class ExisRequest {
|
|
|
97
103
|
this.session = undefined;
|
|
98
104
|
this.requestId = undefined;
|
|
99
105
|
this.tenantId = undefined;
|
|
100
|
-
this.
|
|
106
|
+
this._diCacheMap?.clear();
|
|
101
107
|
this._urlStr = raw.url ?? '/';
|
|
102
108
|
this._qIdx = this._urlStr.indexOf('?');
|
|
103
109
|
this._path = undefined;
|
|
@@ -148,7 +154,7 @@ class ExisRequest {
|
|
|
148
154
|
if (this._cookies !== undefined)
|
|
149
155
|
return this._cookies;
|
|
150
156
|
const cookieHeader = this.raw.headers.cookie;
|
|
151
|
-
const parsed = cookieHeader ? (0,
|
|
157
|
+
const parsed = cookieHeader ? (0, cookie_1.parseCookies)(cookieHeader) : {};
|
|
152
158
|
this._cookies = parsed;
|
|
153
159
|
return parsed;
|
|
154
160
|
}
|
|
@@ -255,7 +261,7 @@ class ExisRequest {
|
|
|
255
261
|
return this.body;
|
|
256
262
|
}
|
|
257
263
|
try {
|
|
258
|
-
this.body = (0,
|
|
264
|
+
this.body = (0, json_1.secureJsonParse)(this.rawBody);
|
|
259
265
|
return this.body;
|
|
260
266
|
}
|
|
261
267
|
catch {
|
|
@@ -268,7 +274,7 @@ class ExisRequest {
|
|
|
268
274
|
if (!this.rawBody)
|
|
269
275
|
await this.text();
|
|
270
276
|
const fields = qs.parse(this.rawBody || '');
|
|
271
|
-
this.body = (0,
|
|
277
|
+
this.body = (0, json_1.stripPrototype)(fields);
|
|
272
278
|
return {
|
|
273
279
|
fields: this.body,
|
|
274
280
|
files: {},
|
|
@@ -330,7 +336,7 @@ class ExisRequest {
|
|
|
330
336
|
if (!contentType.includes('boundary=')) {
|
|
331
337
|
throw errors_1.HttpError.badRequest('Missing multipart boundary.');
|
|
332
338
|
}
|
|
333
|
-
const res = await (0, helpers_1.streamMultipartUpload)(this.raw, destDir);
|
|
339
|
+
const res = await (0, helpers_1.streamMultipartUpload)(this.raw, destDir, this.bodyLimit);
|
|
334
340
|
this.body = res.fields;
|
|
335
341
|
return res;
|
|
336
342
|
}
|