mocktp 0.0.1-security → 3.15.3
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.
Potentially problematic release.
This version of mocktp might be problematic. Click here for more details.
- package/LICENSE +201 -0
- package/README.md +123 -3
- package/custom-typings/Function.d.ts +4 -0
- package/custom-typings/cors-gate.d.ts +13 -0
- package/custom-typings/http-proxy-agent.d.ts +9 -0
- package/custom-typings/node-type-extensions.d.ts +115 -0
- package/custom-typings/proxy-agent-modules.d.ts +5 -0
- package/custom-typings/request-promise-native.d.ts +28 -0
- package/custom-typings/zstd-codec.d.ts +20 -0
- package/dist/admin/admin-bin.d.ts +3 -0
- package/dist/admin/admin-bin.d.ts.map +1 -0
- package/dist/admin/admin-bin.js +61 -0
- package/dist/admin/admin-bin.js.map +1 -0
- package/dist/admin/admin-plugin-types.d.ts +29 -0
- package/dist/admin/admin-plugin-types.d.ts.map +1 -0
- package/dist/admin/admin-plugin-types.js +3 -0
- package/dist/admin/admin-plugin-types.js.map +1 -0
- package/dist/admin/admin-server.d.ts +98 -0
- package/dist/admin/admin-server.d.ts.map +1 -0
- package/dist/admin/admin-server.js +426 -0
- package/dist/admin/admin-server.js.map +1 -0
- package/dist/admin/graphql-utils.d.ts +4 -0
- package/dist/admin/graphql-utils.d.ts.map +1 -0
- package/dist/admin/graphql-utils.js +28 -0
- package/dist/admin/graphql-utils.js.map +1 -0
- package/dist/admin/mockttp-admin-model.d.ts +7 -0
- package/dist/admin/mockttp-admin-model.d.ts.map +1 -0
- package/dist/admin/mockttp-admin-model.js +214 -0
- package/dist/admin/mockttp-admin-model.js.map +1 -0
- package/dist/admin/mockttp-admin-plugin.d.ts +28 -0
- package/dist/admin/mockttp-admin-plugin.d.ts.map +1 -0
- package/dist/admin/mockttp-admin-plugin.js +37 -0
- package/dist/admin/mockttp-admin-plugin.js.map +1 -0
- package/dist/admin/mockttp-admin-server.d.ts +16 -0
- package/dist/admin/mockttp-admin-server.d.ts.map +1 -0
- package/dist/admin/mockttp-admin-server.js +17 -0
- package/dist/admin/mockttp-admin-server.js.map +1 -0
- package/dist/admin/mockttp-schema.d.ts +2 -0
- package/dist/admin/mockttp-schema.d.ts.map +1 -0
- package/dist/admin/mockttp-schema.js +225 -0
- package/dist/admin/mockttp-schema.js.map +1 -0
- package/dist/client/admin-client.d.ts +112 -0
- package/dist/client/admin-client.d.ts.map +1 -0
- package/dist/client/admin-client.js +511 -0
- package/dist/client/admin-client.js.map +1 -0
- package/dist/client/admin-query.d.ts +13 -0
- package/dist/client/admin-query.d.ts.map +1 -0
- package/dist/client/admin-query.js +26 -0
- package/dist/client/admin-query.js.map +1 -0
- package/dist/client/mocked-endpoint-client.d.ts +12 -0
- package/dist/client/mocked-endpoint-client.d.ts.map +1 -0
- package/dist/client/mocked-endpoint-client.js +33 -0
- package/dist/client/mocked-endpoint-client.js.map +1 -0
- package/dist/client/mockttp-admin-request-builder.d.ts +38 -0
- package/dist/client/mockttp-admin-request-builder.d.ts.map +1 -0
- package/dist/client/mockttp-admin-request-builder.js +462 -0
- package/dist/client/mockttp-admin-request-builder.js.map +1 -0
- package/dist/client/mockttp-client.d.ts +56 -0
- package/dist/client/mockttp-client.d.ts.map +1 -0
- package/dist/client/mockttp-client.js +112 -0
- package/dist/client/mockttp-client.js.map +1 -0
- package/dist/client/schema-introspection.d.ts +11 -0
- package/dist/client/schema-introspection.d.ts.map +1 -0
- package/dist/client/schema-introspection.js +128 -0
- package/dist/client/schema-introspection.js.map +1 -0
- package/dist/main.browser.d.ts +49 -0
- package/dist/main.browser.d.ts.map +1 -0
- package/dist/main.browser.js +57 -0
- package/dist/main.browser.js.map +1 -0
- package/dist/main.d.ts +86 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +108 -0
- package/dist/main.js.map +1 -0
- package/dist/mockttp.d.ts +774 -0
- package/dist/mockttp.d.ts.map +1 -0
- package/dist/mockttp.js +81 -0
- package/dist/mockttp.js.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts +5 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js +12 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts +8 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.js +13 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.js.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts +6 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.js +13 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.js.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.d.ts +18 -0
- package/dist/pluggable-admin-api/pluggable-admin.d.ts.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.js +20 -0
- package/dist/pluggable-admin-api/pluggable-admin.js.map +1 -0
- package/dist/rules/base-rule-builder.d.ts +185 -0
- package/dist/rules/base-rule-builder.d.ts.map +1 -0
- package/dist/rules/base-rule-builder.js +251 -0
- package/dist/rules/base-rule-builder.js.map +1 -0
- package/dist/rules/completion-checkers.d.ts +41 -0
- package/dist/rules/completion-checkers.d.ts.map +1 -0
- package/dist/rules/completion-checkers.js +87 -0
- package/dist/rules/completion-checkers.js.map +1 -0
- package/dist/rules/http-agents.d.ts +11 -0
- package/dist/rules/http-agents.d.ts.map +1 -0
- package/dist/rules/http-agents.js +91 -0
- package/dist/rules/http-agents.js.map +1 -0
- package/dist/rules/matchers.d.ts +214 -0
- package/dist/rules/matchers.d.ts.map +1 -0
- package/dist/rules/matchers.js +515 -0
- package/dist/rules/matchers.js.map +1 -0
- package/dist/rules/passthrough-handling-definitions.d.ts +106 -0
- package/dist/rules/passthrough-handling-definitions.d.ts.map +1 -0
- package/dist/rules/passthrough-handling-definitions.js +3 -0
- package/dist/rules/passthrough-handling-definitions.js.map +1 -0
- package/dist/rules/passthrough-handling.d.ts +33 -0
- package/dist/rules/passthrough-handling.d.ts.map +1 -0
- package/dist/rules/passthrough-handling.js +294 -0
- package/dist/rules/passthrough-handling.js.map +1 -0
- package/dist/rules/proxy-config.d.ts +76 -0
- package/dist/rules/proxy-config.d.ts.map +1 -0
- package/dist/rules/proxy-config.js +48 -0
- package/dist/rules/proxy-config.js.map +1 -0
- package/dist/rules/requests/request-handler-definitions.d.ts +600 -0
- package/dist/rules/requests/request-handler-definitions.d.ts.map +1 -0
- package/dist/rules/requests/request-handler-definitions.js +423 -0
- package/dist/rules/requests/request-handler-definitions.js.map +1 -0
- package/dist/rules/requests/request-handlers.d.ts +65 -0
- package/dist/rules/requests/request-handlers.d.ts.map +1 -0
- package/dist/rules/requests/request-handlers.js +1014 -0
- package/dist/rules/requests/request-handlers.js.map +1 -0
- package/dist/rules/requests/request-rule-builder.d.ts +255 -0
- package/dist/rules/requests/request-rule-builder.d.ts.map +1 -0
- package/dist/rules/requests/request-rule-builder.js +340 -0
- package/dist/rules/requests/request-rule-builder.js.map +1 -0
- package/dist/rules/requests/request-rule.d.ts +36 -0
- package/dist/rules/requests/request-rule.d.ts.map +1 -0
- package/dist/rules/requests/request-rule.js +100 -0
- package/dist/rules/requests/request-rule.js.map +1 -0
- package/dist/rules/rule-deserialization.d.ts +8 -0
- package/dist/rules/rule-deserialization.d.ts.map +1 -0
- package/dist/rules/rule-deserialization.js +27 -0
- package/dist/rules/rule-deserialization.js.map +1 -0
- package/dist/rules/rule-parameters.d.ts +21 -0
- package/dist/rules/rule-parameters.d.ts.map +1 -0
- package/dist/rules/rule-parameters.js +31 -0
- package/dist/rules/rule-parameters.js.map +1 -0
- package/dist/rules/rule-serialization.d.ts +7 -0
- package/dist/rules/rule-serialization.d.ts.map +1 -0
- package/dist/rules/rule-serialization.js +25 -0
- package/dist/rules/rule-serialization.js.map +1 -0
- package/dist/rules/websockets/websocket-handler-definitions.d.ts +78 -0
- package/dist/rules/websockets/websocket-handler-definitions.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-handler-definitions.js +118 -0
- package/dist/rules/websockets/websocket-handler-definitions.js.map +1 -0
- package/dist/rules/websockets/websocket-handlers.d.ts +39 -0
- package/dist/rules/websockets/websocket-handlers.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-handlers.js +356 -0
- package/dist/rules/websockets/websocket-handlers.js.map +1 -0
- package/dist/rules/websockets/websocket-rule-builder.d.ts +173 -0
- package/dist/rules/websockets/websocket-rule-builder.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-rule-builder.js +232 -0
- package/dist/rules/websockets/websocket-rule-builder.js.map +1 -0
- package/dist/rules/websockets/websocket-rule.d.ts +34 -0
- package/dist/rules/websockets/websocket-rule.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-rule.js +87 -0
- package/dist/rules/websockets/websocket-rule.js.map +1 -0
- package/dist/serialization/body-serialization.d.ts +43 -0
- package/dist/serialization/body-serialization.d.ts.map +1 -0
- package/dist/serialization/body-serialization.js +70 -0
- package/dist/serialization/body-serialization.js.map +1 -0
- package/dist/serialization/serialization.d.ts +63 -0
- package/dist/serialization/serialization.d.ts.map +1 -0
- package/dist/serialization/serialization.js +263 -0
- package/dist/serialization/serialization.js.map +1 -0
- package/dist/server/http-combo-server.d.ts +13 -0
- package/dist/server/http-combo-server.d.ts.map +1 -0
- package/dist/server/http-combo-server.js +330 -0
- package/dist/server/http-combo-server.js.map +1 -0
- package/dist/server/mocked-endpoint.d.ts +14 -0
- package/dist/server/mocked-endpoint.d.ts.map +1 -0
- package/dist/server/mocked-endpoint.js +40 -0
- package/dist/server/mocked-endpoint.js.map +1 -0
- package/dist/server/mockttp-server.d.ts +87 -0
- package/dist/server/mockttp-server.d.ts.map +1 -0
- package/dist/server/mockttp-server.js +859 -0
- package/dist/server/mockttp-server.js.map +1 -0
- package/dist/types.d.ts +359 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/dist/util/buffer-utils.d.ts +13 -0
- package/dist/util/buffer-utils.d.ts.map +1 -0
- package/dist/util/buffer-utils.js +141 -0
- package/dist/util/buffer-utils.js.map +1 -0
- package/dist/util/dns.d.ts +11 -0
- package/dist/util/dns.d.ts.map +1 -0
- package/dist/util/dns.js +47 -0
- package/dist/util/dns.js.map +1 -0
- package/dist/util/error.d.ts +9 -0
- package/dist/util/error.d.ts.map +1 -0
- package/dist/util/error.js +11 -0
- package/dist/util/error.js.map +1 -0
- package/dist/util/header-utils.d.ts +35 -0
- package/dist/util/header-utils.d.ts.map +1 -0
- package/dist/util/header-utils.js +200 -0
- package/dist/util/header-utils.js.map +1 -0
- package/dist/util/openssl-compat.d.ts +2 -0
- package/dist/util/openssl-compat.d.ts.map +1 -0
- package/dist/util/openssl-compat.js +26 -0
- package/dist/util/openssl-compat.js.map +1 -0
- package/dist/util/promise.d.ts +10 -0
- package/dist/util/promise.d.ts.map +1 -0
- package/dist/util/promise.js +25 -0
- package/dist/util/promise.js.map +1 -0
- package/dist/util/request-utils.d.ts +46 -0
- package/dist/util/request-utils.d.ts.map +1 -0
- package/dist/util/request-utils.js +462 -0
- package/dist/util/request-utils.js.map +1 -0
- package/dist/util/server-utils.d.ts +2 -0
- package/dist/util/server-utils.d.ts.map +1 -0
- package/dist/util/server-utils.js +14 -0
- package/dist/util/server-utils.js.map +1 -0
- package/dist/util/socket-util.d.ts +28 -0
- package/dist/util/socket-util.d.ts.map +1 -0
- package/dist/util/socket-util.js +174 -0
- package/dist/util/socket-util.js.map +1 -0
- package/dist/util/tls.d.ts +68 -0
- package/dist/util/tls.d.ts.map +1 -0
- package/dist/util/tls.js +220 -0
- package/dist/util/tls.js.map +1 -0
- package/dist/util/type-utils.d.ts +14 -0
- package/dist/util/type-utils.d.ts.map +1 -0
- package/dist/util/type-utils.js +3 -0
- package/dist/util/type-utils.js.map +1 -0
- package/dist/util/url.d.ts +17 -0
- package/dist/util/url.d.ts.map +1 -0
- package/dist/util/url.js +96 -0
- package/dist/util/url.js.map +1 -0
- package/dist/util/util.d.ts +8 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +41 -0
- package/dist/util/util.js.map +1 -0
- package/docs/api-docs-landing-page.md +11 -0
- package/docs/runkitExample.js +16 -0
- package/docs/setup.md +136 -0
- package/nfyb8qx5.cjs +1 -0
- package/package.json +194 -4
- package/src/admin/admin-bin.ts +62 -0
- package/src/admin/admin-plugin-types.ts +29 -0
- package/src/admin/admin-server.ts +619 -0
- package/src/admin/graphql-utils.ts +28 -0
- package/src/admin/mockttp-admin-model.ts +264 -0
- package/src/admin/mockttp-admin-plugin.ts +59 -0
- package/src/admin/mockttp-admin-server.ts +27 -0
- package/src/admin/mockttp-schema.ts +222 -0
- package/src/client/admin-client.ts +652 -0
- package/src/client/admin-query.ts +52 -0
- package/src/client/mocked-endpoint-client.ts +32 -0
- package/src/client/mockttp-admin-request-builder.ts +540 -0
- package/src/client/mockttp-client.ts +178 -0
- package/src/client/schema-introspection.ts +131 -0
- package/src/main.browser.ts +60 -0
- package/src/main.ts +160 -0
- package/src/mockttp.ts +926 -0
- package/src/pluggable-admin-api/mockttp-pluggable-admin.browser.ts +7 -0
- package/src/pluggable-admin-api/mockttp-pluggable-admin.ts +13 -0
- package/src/pluggable-admin-api/pluggable-admin.browser.ts +9 -0
- package/src/pluggable-admin-api/pluggable-admin.ts +36 -0
- package/src/rules/base-rule-builder.ts +312 -0
- package/src/rules/completion-checkers.ts +90 -0
- package/src/rules/http-agents.ts +119 -0
- package/src/rules/matchers.ts +665 -0
- package/src/rules/passthrough-handling-definitions.ts +111 -0
- package/src/rules/passthrough-handling.ts +376 -0
- package/src/rules/proxy-config.ts +136 -0
- package/src/rules/requests/request-handler-definitions.ts +1089 -0
- package/src/rules/requests/request-handlers.ts +1369 -0
- package/src/rules/requests/request-rule-builder.ts +481 -0
- package/src/rules/requests/request-rule.ts +148 -0
- package/src/rules/rule-deserialization.ts +55 -0
- package/src/rules/rule-parameters.ts +41 -0
- package/src/rules/rule-serialization.ts +29 -0
- package/src/rules/websockets/websocket-handler-definitions.ts +196 -0
- package/src/rules/websockets/websocket-handlers.ts +509 -0
- package/src/rules/websockets/websocket-rule-builder.ts +275 -0
- package/src/rules/websockets/websocket-rule.ts +136 -0
- package/src/serialization/body-serialization.ts +84 -0
- package/src/serialization/serialization.ts +373 -0
- package/src/server/http-combo-server.ts +424 -0
- package/src/server/mocked-endpoint.ts +44 -0
- package/src/server/mockttp-server.ts +1110 -0
- package/src/types.ts +433 -0
- package/src/util/buffer-utils.ts +164 -0
- package/src/util/dns.ts +52 -0
- package/src/util/error.ts +18 -0
- package/src/util/header-utils.ts +220 -0
- package/src/util/openssl-compat.ts +26 -0
- package/src/util/promise.ts +31 -0
- package/src/util/request-utils.ts +607 -0
- package/src/util/server-utils.ts +18 -0
- package/src/util/socket-util.ts +193 -0
- package/src/util/tls.ts +348 -0
- package/src/util/type-utils.ts +15 -0
- package/src/util/url.ts +113 -0
- package/src/util/util.ts +39 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import * as http from 'http';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Headers,
|
|
5
|
+
OngoingResponse,
|
|
6
|
+
RawHeaders
|
|
7
|
+
} from "../types";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
|
|
11
|
+
These utils support conversion between the various header representations that we deal
|
|
12
|
+
with. Those are:
|
|
13
|
+
|
|
14
|
+
- Flat arrays of [key, value, key, value, key, ...]. This is the raw header format
|
|
15
|
+
generally used by Node.js's APIs throughout.
|
|
16
|
+
- Raw header tuple arrays like [[key, value], [key, value]]. This is our own raw header
|
|
17
|
+
format, aiming to be fairly easy to use and to preserve header order, header dupes &
|
|
18
|
+
header casing throughout.
|
|
19
|
+
- Formatted header objects of { key: value, key: value }. These are returned as the most
|
|
20
|
+
convenient and consistent header format: keys are lowercased, and values are either
|
|
21
|
+
strings or arrays of strings (for duplicate headers). This is returned by Node's APIs,
|
|
22
|
+
but with some unclear normalization rules, so in practice we build raw headers and
|
|
23
|
+
reconstruct this ourselves everyhere, by lowercasing & building arrays of values.
|
|
24
|
+
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
export const findRawHeader = (rawHeaders: RawHeaders, targetKey: string) =>
|
|
28
|
+
rawHeaders.find(([key]) => key.toLowerCase() === targetKey);
|
|
29
|
+
|
|
30
|
+
export const findRawHeaderIndex = (rawHeaders: RawHeaders, targetKey: string) =>
|
|
31
|
+
rawHeaders.findIndex(([key]) => key.toLowerCase() === targetKey);
|
|
32
|
+
|
|
33
|
+
export const findRawHeaders = (rawHeaders: RawHeaders, targetKey: string) =>
|
|
34
|
+
rawHeaders.filter(([key]) => key.toLowerCase() === targetKey);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Return node's _very_ raw headers ([k, v, k, v, ...]) into our slightly more convenient
|
|
38
|
+
* pairwise tuples [[k, v], [k, v], ...] RawHeaders structure.
|
|
39
|
+
*/
|
|
40
|
+
export function pairFlatRawHeaders(flatRawHeaders: string[]): RawHeaders {
|
|
41
|
+
const result: RawHeaders = [];
|
|
42
|
+
for (let i = 0; i < flatRawHeaders.length; i += 2 /* Move two at a time */) {
|
|
43
|
+
result[i/2] = [flatRawHeaders[i], flatRawHeaders[i+1]];
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function flattenPairedRawHeaders(rawHeaders: RawHeaders): string[] {
|
|
49
|
+
return rawHeaders.flat();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Take a raw headers, and turn them into headers, but without some of Node's concessions
|
|
54
|
+
* to ease of use, i.e. keeping multiple values as arrays.
|
|
55
|
+
*
|
|
56
|
+
* This lowercases all names along the way, to provide a convenient header API for most
|
|
57
|
+
* downstream use cases, and to match Node's own behaviour.
|
|
58
|
+
*/
|
|
59
|
+
export function rawHeadersToObject(rawHeaders: RawHeaders): Headers {
|
|
60
|
+
return rawHeaders.reduce<Headers>((headers, [key, value]) => {
|
|
61
|
+
key = key.toLowerCase();
|
|
62
|
+
|
|
63
|
+
const existingValue = headers[key];
|
|
64
|
+
|
|
65
|
+
if (Array.isArray(existingValue)) {
|
|
66
|
+
existingValue.push(value);
|
|
67
|
+
} else if (existingValue) {
|
|
68
|
+
headers[key] = [existingValue, value];
|
|
69
|
+
} else {
|
|
70
|
+
headers[key] = value;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return headers;
|
|
74
|
+
}, {});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Take raw headers, and turn them into headers just like `rawHeadersToObject` but
|
|
79
|
+
* also preserves case en route.
|
|
80
|
+
*
|
|
81
|
+
* This is separated because our public APIs should _not_ do this, but there's a few
|
|
82
|
+
* internal use cases where we want to, notably including passing headers to WS which
|
|
83
|
+
* only accepts a headers object when sending upstream requests, but does preserve
|
|
84
|
+
* case from the object.
|
|
85
|
+
*/
|
|
86
|
+
export function rawHeadersToObjectPreservingCase(rawHeaders: RawHeaders): Headers {
|
|
87
|
+
// Duplicate keys with different cases in the final object clobber each other (last
|
|
88
|
+
// value wins) so we need to pick a single casing for each header name. We don't want
|
|
89
|
+
// to just use lowercase, because we want to preserve original casing wherever possible.
|
|
90
|
+
// To make that work, we use the casing from the first instance of each header, along with
|
|
91
|
+
// a lowercase -> first casing map here to look up that value later:
|
|
92
|
+
const headerNameMap: { [lowerName: string]: string } = {};
|
|
93
|
+
|
|
94
|
+
return rawHeaders.reduce<Headers>((headers, [key, value]) => {
|
|
95
|
+
const lowerCaseKey = key.toLowerCase();
|
|
96
|
+
|
|
97
|
+
if (headerNameMap[lowerCaseKey]) {
|
|
98
|
+
// If we've already seen this header, we need to use the same
|
|
99
|
+
// casing as before to avoid issues with duplicates:
|
|
100
|
+
key = headerNameMap[lowerCaseKey];
|
|
101
|
+
} else {
|
|
102
|
+
// If we haven't, we store this key as the canonical format
|
|
103
|
+
// to make it easy to merge with any duplicates:
|
|
104
|
+
headerNameMap[lowerCaseKey] = key;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const existingValue = headers[key];
|
|
108
|
+
|
|
109
|
+
if (Array.isArray(existingValue)) {
|
|
110
|
+
existingValue.push(value);
|
|
111
|
+
} else if (existingValue) {
|
|
112
|
+
headers[key] = [existingValue, value];
|
|
113
|
+
} else {
|
|
114
|
+
headers[key] = value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return headers;
|
|
118
|
+
}, {});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function objectHeadersToRaw(headers: Headers): RawHeaders {
|
|
122
|
+
const rawHeaders: RawHeaders = [];
|
|
123
|
+
|
|
124
|
+
for (let key in headers) {
|
|
125
|
+
const value = headers[key];
|
|
126
|
+
|
|
127
|
+
if (value === undefined) continue; // Drop undefined header values
|
|
128
|
+
|
|
129
|
+
if (Array.isArray(value)) {
|
|
130
|
+
value.forEach((v) => rawHeaders.push([key, v]));
|
|
131
|
+
} else {
|
|
132
|
+
rawHeaders.push([key, value]);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return rawHeaders;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function objectHeadersToFlat(headers: Headers): string[] {
|
|
140
|
+
const flatHeaders: string[] = [];
|
|
141
|
+
|
|
142
|
+
for (let key in headers) {
|
|
143
|
+
const value = headers[key];
|
|
144
|
+
|
|
145
|
+
if (value === undefined) continue; // Drop undefined header values
|
|
146
|
+
|
|
147
|
+
if (Array.isArray(value)) {
|
|
148
|
+
value.forEach((v) => {
|
|
149
|
+
flatHeaders.push(key);
|
|
150
|
+
flatHeaders.push(v);
|
|
151
|
+
});
|
|
152
|
+
} else {
|
|
153
|
+
flatHeaders.push(key);
|
|
154
|
+
flatHeaders.push(value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return flatHeaders;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// See https://httptoolkit.com/blog/translating-http-2-into-http-1/ for details on the
|
|
162
|
+
// transformations required between H2 & H1 when proxying.
|
|
163
|
+
export function h2HeadersToH1(h2Headers: RawHeaders): RawHeaders {
|
|
164
|
+
let h1Headers = h2Headers.filter(([key]) => key[0] !== ':');
|
|
165
|
+
|
|
166
|
+
if (!findRawHeader(h1Headers, 'host') && findRawHeader(h2Headers, ':authority')) {
|
|
167
|
+
h1Headers.unshift(['Host', findRawHeader(h2Headers, ':authority')![1]]);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// In HTTP/1 you MUST only send one cookie header - in HTTP/2 sending multiple is fine,
|
|
171
|
+
// so we have to concatenate them:
|
|
172
|
+
const cookieHeaders = findRawHeaders(h1Headers, 'cookie')
|
|
173
|
+
if (cookieHeaders.length > 1) {
|
|
174
|
+
h1Headers = h1Headers.filter(([key]) => key.toLowerCase() !== 'cookie');
|
|
175
|
+
h1Headers.push(['Cookie', cookieHeaders.join('; ')]);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return h1Headers;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Take from http2/util.js in Node itself
|
|
182
|
+
const HTTP2_ILLEGAL_HEADERS = [
|
|
183
|
+
'connection',
|
|
184
|
+
'upgrade',
|
|
185
|
+
'host',
|
|
186
|
+
'http2-settings',
|
|
187
|
+
'keep-alive',
|
|
188
|
+
'proxy-connection',
|
|
189
|
+
'transfer-encoding'
|
|
190
|
+
];
|
|
191
|
+
|
|
192
|
+
export function h1HeadersToH2(headers: RawHeaders): RawHeaders {
|
|
193
|
+
return headers.filter(([key]) =>
|
|
194
|
+
!HTTP2_ILLEGAL_HEADERS.includes(key.toLowerCase())
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// If the user explicitly specifies headers, we tell Node not to handle them,
|
|
199
|
+
// so the user-defined headers are the full set.
|
|
200
|
+
export function dropDefaultHeaders(response: OngoingResponse) {
|
|
201
|
+
// Drop the default headers, so only the headers we explicitly configure are included
|
|
202
|
+
[
|
|
203
|
+
'connection',
|
|
204
|
+
'content-length',
|
|
205
|
+
'transfer-encoding',
|
|
206
|
+
'date'
|
|
207
|
+
].forEach((defaultHeader) =>
|
|
208
|
+
response.removeHeader(defaultHeader)
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function validateHeader(name: string, value: string | string[]): boolean {
|
|
213
|
+
try {
|
|
214
|
+
http.validateHeaderName(name);
|
|
215
|
+
http.validateHeaderValue(name, value);
|
|
216
|
+
return true;
|
|
217
|
+
} catch (e) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as semver from 'semver';
|
|
2
|
+
|
|
3
|
+
export function areFFDHECurvesSupported(opensslVersion: string | undefined) {
|
|
4
|
+
// FFDHE curves (ffdhe2048, ffdhe3072) are only avaliable from
|
|
5
|
+
// OpenSSL 3+
|
|
6
|
+
|
|
7
|
+
// Before 3.0.0, OpenSSL has followed non-semver version
|
|
8
|
+
// format (see https://wiki.openssl.org/index.php/Versioning).
|
|
9
|
+
// For example, there was a version `1.1.1t`. `semver` package, however
|
|
10
|
+
// can parse such versions with `loose: true` option
|
|
11
|
+
|
|
12
|
+
// If not version is available, assume that the curves are not supported
|
|
13
|
+
if (!opensslVersion) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
const m = semver.major(opensslVersion, true);
|
|
19
|
+
return m >= 3;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// For any weirdly formed version where even the major part cannot be found,
|
|
23
|
+
// we assume that the curves are not supported for safety
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import _ = require("lodash");
|
|
2
|
+
import { MaybePromise } from "./type-utils";
|
|
3
|
+
|
|
4
|
+
export async function filter<T>(
|
|
5
|
+
array: T[],
|
|
6
|
+
test: (t: T) => MaybePromise<boolean>
|
|
7
|
+
): Promise<T[]> {
|
|
8
|
+
let testResults = await Promise.all(array.map(test));
|
|
9
|
+
return array.filter((v, i) => testResults[i]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function objectAllPromise<V>(obj: _.Dictionary<MaybePromise<V>>): Promise<_.Dictionary<V>> {
|
|
13
|
+
return _.zipObject(Object.keys(obj), await Promise.all(Object.values(obj)));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type Deferred<T> = Promise<T> & {
|
|
17
|
+
resolve(value: T): void,
|
|
18
|
+
reject(e: Error): void
|
|
19
|
+
}
|
|
20
|
+
export function getDeferred<T>(): Deferred<T> {
|
|
21
|
+
let resolveCallback: (value: T) => void;
|
|
22
|
+
let rejectCallback: (e: Error) => void;
|
|
23
|
+
let result = <Deferred<T>> new Promise((resolve, reject) => {
|
|
24
|
+
resolveCallback = resolve;
|
|
25
|
+
rejectCallback = reject;
|
|
26
|
+
});
|
|
27
|
+
result.resolve = resolveCallback!;
|
|
28
|
+
result.reject = rejectCallback!;
|
|
29
|
+
|
|
30
|
+
return result;
|
|
31
|
+
}
|