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,78 @@
|
|
|
1
|
+
import { ClientServerChannel, Serializable, SerializedProxyConfig } from "../../serialization/serialization";
|
|
2
|
+
import { Explainable, Headers } from "../../types";
|
|
3
|
+
import { ProxyConfig } from '../proxy-config';
|
|
4
|
+
import { PassThroughHandlerConnectionOptions, ForwardingOptions, PassThroughLookupOptions, CADefinition } from '../passthrough-handling-definitions';
|
|
5
|
+
import { CloseConnectionHandlerDefinition, ResetConnectionHandlerDefinition, TimeoutHandlerDefinition } from '../requests/request-handler-definitions';
|
|
6
|
+
export interface WebSocketHandlerDefinition extends Explainable, Serializable {
|
|
7
|
+
type: keyof typeof WsHandlerDefinitionLookup;
|
|
8
|
+
}
|
|
9
|
+
export type PassThroughWebSocketHandlerOptions = PassThroughHandlerConnectionOptions;
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export interface SerializedPassThroughWebSocketData {
|
|
14
|
+
type: 'ws-passthrough';
|
|
15
|
+
forwarding?: ForwardingOptions;
|
|
16
|
+
lookupOptions?: PassThroughLookupOptions;
|
|
17
|
+
proxyConfig?: SerializedProxyConfig;
|
|
18
|
+
ignoreHostCertificateErrors?: string[] | boolean;
|
|
19
|
+
extraCACertificates?: Array<{
|
|
20
|
+
cert: string;
|
|
21
|
+
} | {
|
|
22
|
+
certPath: string;
|
|
23
|
+
}>;
|
|
24
|
+
clientCertificateHostMap?: {
|
|
25
|
+
[host: string]: {
|
|
26
|
+
pfx: string;
|
|
27
|
+
passphrase?: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare class PassThroughWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
|
|
32
|
+
readonly type = "ws-passthrough";
|
|
33
|
+
readonly lookupOptions: PassThroughLookupOptions | undefined;
|
|
34
|
+
readonly proxyConfig?: ProxyConfig;
|
|
35
|
+
readonly forwarding?: ForwardingOptions;
|
|
36
|
+
readonly ignoreHostHttpsErrors: string[] | boolean;
|
|
37
|
+
readonly clientCertificateHostMap: {
|
|
38
|
+
[host: string]: {
|
|
39
|
+
pfx: Buffer;
|
|
40
|
+
passphrase?: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
readonly extraCACertificates: Array<CADefinition>;
|
|
44
|
+
constructor(options?: PassThroughWebSocketHandlerOptions);
|
|
45
|
+
explain(): string;
|
|
46
|
+
/**
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
serialize(channel: ClientServerChannel): SerializedPassThroughWebSocketData;
|
|
50
|
+
}
|
|
51
|
+
export declare class EchoWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
|
|
52
|
+
readonly type = "ws-echo";
|
|
53
|
+
explain(): string;
|
|
54
|
+
}
|
|
55
|
+
export declare class ListenWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
|
|
56
|
+
readonly type = "ws-listen";
|
|
57
|
+
explain(): string;
|
|
58
|
+
}
|
|
59
|
+
export declare class RejectWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
|
|
60
|
+
readonly statusCode: number;
|
|
61
|
+
readonly statusMessage: string;
|
|
62
|
+
readonly headers: Headers;
|
|
63
|
+
readonly body: Buffer | string;
|
|
64
|
+
readonly type = "ws-reject";
|
|
65
|
+
constructor(statusCode: number, statusMessage?: string, headers?: Headers, body?: Buffer | string);
|
|
66
|
+
explain(): string;
|
|
67
|
+
}
|
|
68
|
+
export { CloseConnectionHandlerDefinition, ResetConnectionHandlerDefinition, TimeoutHandlerDefinition };
|
|
69
|
+
export declare const WsHandlerDefinitionLookup: {
|
|
70
|
+
'ws-passthrough': typeof PassThroughWebSocketHandlerDefinition;
|
|
71
|
+
'ws-echo': typeof EchoWebSocketHandlerDefinition;
|
|
72
|
+
'ws-listen': typeof ListenWebSocketHandlerDefinition;
|
|
73
|
+
'ws-reject': typeof RejectWebSocketHandlerDefinition;
|
|
74
|
+
'close-connection': typeof CloseConnectionHandlerDefinition;
|
|
75
|
+
'reset-connection': typeof ResetConnectionHandlerDefinition;
|
|
76
|
+
timeout: typeof TimeoutHandlerDefinition;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=websocket-handler-definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-handler-definitions.d.ts","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handler-definitions.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EAGxB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACH,mCAAmC,EACnC,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACH,gCAAgC,EAChC,gCAAgC,EAChC,wBAAwB,EAC3B,MAAM,yCAAyC,CAAC;AAejD,MAAM,WAAW,0BAA2B,SAAQ,WAAW,EAAE,YAAY;IACzE,IAAI,EAAE,MAAM,OAAO,yBAAyB,CAAC;CAChD;AAED,MAAM,MAAM,kCAAkC,GAAG,mCAAmC,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,kCAAkC;IAC/C,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACzC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,2BAA2B,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,wBAAwB,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACvF;AAED,qBAAa,qCAAsC,SAAQ,YAAa,YAAW,0BAA0B;IACzG,QAAQ,CAAC,IAAI,oBAAoB;IAGjC,SAAgB,aAAa,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACpE,SAAgB,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1C,SAAgB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/C,SAAgB,qBAAqB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAM;IAC/D,SAAgB,wBAAwB,EAAE;QACtC,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACvD,CAAC;IAEF,SAAgB,mBAAmB,EAAE,KAAK,CAAC,YAAY,CAAC,CAAM;gBAElD,OAAO,GAAE,kCAAuC;IAkC5D,OAAO;IAMP;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,kCAAkC;CAuB9E;AAED,qBAAa,8BAA+B,SAAQ,YAAa,YAAW,0BAA0B;IAElG,QAAQ,CAAC,IAAI,aAAa;IAE1B,OAAO,IAAI,MAAM;CAGpB;AAED,qBAAa,gCAAiC,SAAQ,YAAa,YAAW,0BAA0B;IAEpG,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,IAAI,MAAM;CAGpB;AAED,qBAAa,gCAAiC,SAAQ,YAAa,YAAW,0BAA0B;aAKhF,UAAU,EAAE,MAAM;aAClB,aAAa,EAAE,MAAM;aACrB,OAAO,EAAE,OAAO;aAChB,IAAI,EAAE,MAAM,GAAG,MAAM;IANzC,QAAQ,CAAC,IAAI,eAAe;gBAGR,UAAU,EAAE,MAAM,EAClB,aAAa,GAAE,MAA6B,EAC5C,OAAO,GAAE,OAAY,EACrB,IAAI,GAAE,MAAM,GAAG,MAAW;IAK9C,OAAO;CAIV;AAID,OAAO,EACH,gCAAgC,EAChC,gCAAgC,EAChC,wBAAwB,EAC3B,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;CAQrC,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WsHandlerDefinitionLookup = exports.TimeoutHandlerDefinition = exports.ResetConnectionHandlerDefinition = exports.CloseConnectionHandlerDefinition = exports.RejectWebSocketHandlerDefinition = exports.ListenWebSocketHandlerDefinition = exports.EchoWebSocketHandlerDefinition = exports.PassThroughWebSocketHandlerDefinition = void 0;
|
|
4
|
+
const _ = require("lodash");
|
|
5
|
+
const url = require("url");
|
|
6
|
+
const common_tags_1 = require("common-tags");
|
|
7
|
+
const serialization_1 = require("../../serialization/serialization");
|
|
8
|
+
const request_handler_definitions_1 = require("../requests/request-handler-definitions");
|
|
9
|
+
Object.defineProperty(exports, "CloseConnectionHandlerDefinition", { enumerable: true, get: function () { return request_handler_definitions_1.CloseConnectionHandlerDefinition; } });
|
|
10
|
+
Object.defineProperty(exports, "ResetConnectionHandlerDefinition", { enumerable: true, get: function () { return request_handler_definitions_1.ResetConnectionHandlerDefinition; } });
|
|
11
|
+
Object.defineProperty(exports, "TimeoutHandlerDefinition", { enumerable: true, get: function () { return request_handler_definitions_1.TimeoutHandlerDefinition; } });
|
|
12
|
+
class PassThroughWebSocketHandlerDefinition extends serialization_1.Serializable {
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
super();
|
|
15
|
+
this.type = 'ws-passthrough';
|
|
16
|
+
this.ignoreHostHttpsErrors = [];
|
|
17
|
+
this.extraCACertificates = [];
|
|
18
|
+
// If a location is provided, and it's not a bare hostname, it must be parseable
|
|
19
|
+
const { forwarding } = options;
|
|
20
|
+
if (forwarding && forwarding.targetHost.includes('/')) {
|
|
21
|
+
const { protocol, hostname, port, path } = url.parse(forwarding.targetHost);
|
|
22
|
+
if (path && path.trim() !== "/") {
|
|
23
|
+
const suggestion = url.format({ protocol, hostname, port }) ||
|
|
24
|
+
forwarding.targetHost.slice(0, forwarding.targetHost.indexOf('/'));
|
|
25
|
+
throw new Error((0, common_tags_1.stripIndent) `
|
|
26
|
+
URLs for forwarding cannot include a path, but "${forwarding.targetHost}" does. ${''}Did you mean ${suggestion}?
|
|
27
|
+
`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
this.forwarding = options.forwarding;
|
|
31
|
+
this.ignoreHostHttpsErrors = options.ignoreHostHttpsErrors || [];
|
|
32
|
+
if (!Array.isArray(this.ignoreHostHttpsErrors) && typeof this.ignoreHostHttpsErrors !== 'boolean') {
|
|
33
|
+
throw new Error("ignoreHostHttpsErrors must be an array or a boolean");
|
|
34
|
+
}
|
|
35
|
+
this.lookupOptions = options.lookupOptions;
|
|
36
|
+
this.proxyConfig = options.proxyConfig;
|
|
37
|
+
this.extraCACertificates =
|
|
38
|
+
options.additionalTrustedCAs ||
|
|
39
|
+
options.trustAdditionalCAs ||
|
|
40
|
+
[];
|
|
41
|
+
this.clientCertificateHostMap = options.clientCertificateHostMap || {};
|
|
42
|
+
}
|
|
43
|
+
explain() {
|
|
44
|
+
return this.forwarding
|
|
45
|
+
? `forward the websocket to ${this.forwarding.targetHost}`
|
|
46
|
+
: 'pass the request through to the target host';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
serialize(channel) {
|
|
52
|
+
return {
|
|
53
|
+
type: this.type,
|
|
54
|
+
forwarding: this.forwarding,
|
|
55
|
+
lookupOptions: this.lookupOptions,
|
|
56
|
+
proxyConfig: (0, serialization_1.serializeProxyConfig)(this.proxyConfig, channel),
|
|
57
|
+
ignoreHostCertificateErrors: this.ignoreHostHttpsErrors,
|
|
58
|
+
extraCACertificates: this.extraCACertificates.map((certObject) => {
|
|
59
|
+
// We use toString to make sure that buffers always end up as
|
|
60
|
+
// as UTF-8 string, to avoid serialization issues. Strings are an
|
|
61
|
+
// easy safe format here, since it's really all just plain-text PEM
|
|
62
|
+
// under the hood.
|
|
63
|
+
if ('cert' in certObject) {
|
|
64
|
+
return { cert: certObject.cert.toString('utf8') };
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
return certObject;
|
|
68
|
+
}
|
|
69
|
+
}),
|
|
70
|
+
clientCertificateHostMap: _.mapValues(this.clientCertificateHostMap, ({ pfx, passphrase }) => ({ pfx: (0, serialization_1.serializeBuffer)(pfx), passphrase }))
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.PassThroughWebSocketHandlerDefinition = PassThroughWebSocketHandlerDefinition;
|
|
75
|
+
class EchoWebSocketHandlerDefinition extends serialization_1.Serializable {
|
|
76
|
+
constructor() {
|
|
77
|
+
super(...arguments);
|
|
78
|
+
this.type = 'ws-echo';
|
|
79
|
+
}
|
|
80
|
+
explain() {
|
|
81
|
+
return "echo all websocket messages";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.EchoWebSocketHandlerDefinition = EchoWebSocketHandlerDefinition;
|
|
85
|
+
class ListenWebSocketHandlerDefinition extends serialization_1.Serializable {
|
|
86
|
+
constructor() {
|
|
87
|
+
super(...arguments);
|
|
88
|
+
this.type = 'ws-listen';
|
|
89
|
+
}
|
|
90
|
+
explain() {
|
|
91
|
+
return "silently accept websocket messages without responding";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.ListenWebSocketHandlerDefinition = ListenWebSocketHandlerDefinition;
|
|
95
|
+
class RejectWebSocketHandlerDefinition extends serialization_1.Serializable {
|
|
96
|
+
constructor(statusCode, statusMessage = 'WebSocket rejected', headers = {}, body = '') {
|
|
97
|
+
super();
|
|
98
|
+
this.statusCode = statusCode;
|
|
99
|
+
this.statusMessage = statusMessage;
|
|
100
|
+
this.headers = headers;
|
|
101
|
+
this.body = body;
|
|
102
|
+
this.type = 'ws-reject';
|
|
103
|
+
}
|
|
104
|
+
explain() {
|
|
105
|
+
return `explicitly reject the websocket upgrade with status ${this.statusCode}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.RejectWebSocketHandlerDefinition = RejectWebSocketHandlerDefinition;
|
|
109
|
+
exports.WsHandlerDefinitionLookup = {
|
|
110
|
+
'ws-passthrough': PassThroughWebSocketHandlerDefinition,
|
|
111
|
+
'ws-echo': EchoWebSocketHandlerDefinition,
|
|
112
|
+
'ws-listen': ListenWebSocketHandlerDefinition,
|
|
113
|
+
'ws-reject': RejectWebSocketHandlerDefinition,
|
|
114
|
+
'close-connection': request_handler_definitions_1.CloseConnectionHandlerDefinition,
|
|
115
|
+
'reset-connection': request_handler_definitions_1.ResetConnectionHandlerDefinition,
|
|
116
|
+
'timeout': request_handler_definitions_1.TimeoutHandlerDefinition
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=websocket-handler-definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-handler-definitions.js","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handler-definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import net = require('net');
|
|
2
|
+
import * as http from 'http';
|
|
3
|
+
import { ClientServerChannel } from "../../serialization/serialization";
|
|
4
|
+
import { OngoingRequest } from "../../types";
|
|
5
|
+
import { CloseConnectionHandler, ResetConnectionHandler, TimeoutHandler } from '../requests/request-handlers';
|
|
6
|
+
import { RuleParameters } from '../rule-parameters';
|
|
7
|
+
import { EchoWebSocketHandlerDefinition, ListenWebSocketHandlerDefinition, PassThroughWebSocketHandlerDefinition, PassThroughWebSocketHandlerOptions, RejectWebSocketHandlerDefinition, SerializedPassThroughWebSocketData, WebSocketHandlerDefinition, WsHandlerDefinitionLookup } from './websocket-handler-definitions';
|
|
8
|
+
export interface WebSocketHandler extends WebSocketHandlerDefinition {
|
|
9
|
+
handle(request: OngoingRequest & http.IncomingMessage, socket: net.Socket, head: Buffer): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export { PassThroughWebSocketHandlerOptions };
|
|
12
|
+
export declare class PassThroughWebSocketHandler extends PassThroughWebSocketHandlerDefinition {
|
|
13
|
+
private wsServer?;
|
|
14
|
+
private initializeWsServer;
|
|
15
|
+
private _trustedCACertificates;
|
|
16
|
+
private trustedCACertificates;
|
|
17
|
+
handle(req: OngoingRequest, socket: net.Socket, head: Buffer): Promise<void>;
|
|
18
|
+
private connectUpstream;
|
|
19
|
+
/**
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
static deserialize(data: SerializedPassThroughWebSocketData, channel: ClientServerChannel, ruleParams: RuleParameters): any;
|
|
23
|
+
}
|
|
24
|
+
export declare class EchoWebSocketHandler extends EchoWebSocketHandlerDefinition {
|
|
25
|
+
private wsServer?;
|
|
26
|
+
private initializeWsServer;
|
|
27
|
+
handle(req: OngoingRequest & http.IncomingMessage, socket: net.Socket, head: Buffer): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export declare class ListenWebSocketHandler extends ListenWebSocketHandlerDefinition {
|
|
30
|
+
private wsServer?;
|
|
31
|
+
private initializeWsServer;
|
|
32
|
+
handle(req: OngoingRequest & http.IncomingMessage, socket: net.Socket, head: Buffer): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
export declare class RejectWebSocketHandler extends RejectWebSocketHandlerDefinition {
|
|
35
|
+
handle(req: OngoingRequest, socket: net.Socket, head: Buffer): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export { CloseConnectionHandler, ResetConnectionHandler, TimeoutHandler };
|
|
38
|
+
export declare const WsHandlerLookup: typeof WsHandlerDefinitionLookup;
|
|
39
|
+
//# sourceMappingURL=websocket-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-handlers.d.ts","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handlers.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,GAAG,QAAQ,KAAK,CAAC,CAAC;AAG5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,OAAO,EACH,mBAAmB,EAGtB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAEzD,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACjB,MAAM,8BAA8B,CAAC;AAetC,OAAO,EAA2B,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAS7E,OAAO,EACH,8BAA8B,EAC9B,gCAAgC,EAChC,qCAAqC,EACrC,kCAAkC,EAClC,gCAAgC,EAChC,kCAAkC,EAClC,0BAA0B,EAC1B,yBAAyB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,gBAAiB,SAAQ,0BAA0B;IAChE,MAAM,CAEF,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,EAE9C,MAAM,EAAE,GAAG,CAAC,MAAM,EAElB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAwHD,OAAO,EAAE,kCAAkC,EAAE,CAAC;AAE9C,qBAAa,2BAA4B,SAAQ,qCAAqC;IAElF,OAAO,CAAC,QAAQ,CAAC,CAAmB;IAEpC,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,sBAAsB,CAA0C;YAC1D,qBAAqB;IAU7B,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;YAwEpD,eAAe;IAwH7B;;OAEG;IACH,MAAM,CAAC,WAAW,CACd,IAAI,EAAE,kCAAkC,EACxC,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,cAAc,GAC3B,GAAG;CAYT;AAED,qBAAa,oBAAqB,SAAQ,8BAA8B;IAEpE,OAAO,CAAC,QAAQ,CAAC,CAAmB;IAEpC,OAAO,CAAC,kBAAkB;IASpB,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;CAQ5F;AAED,qBAAa,sBAAuB,SAAQ,gCAAgC;IAExE,OAAO,CAAC,QAAQ,CAAC,CAAmB;IAEpC,OAAO,CAAC,kBAAkB;IAUpB,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;CAQ5F;AAED,qBAAa,sBAAuB,SAAQ,gCAAgC;IAElE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;CAOrE;AAID,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACjB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OAAO,yBAQpC,CAAC"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WsHandlerLookup = exports.TimeoutHandler = exports.ResetConnectionHandler = exports.CloseConnectionHandler = exports.RejectWebSocketHandler = exports.ListenWebSocketHandler = exports.EchoWebSocketHandler = exports.PassThroughWebSocketHandler = void 0;
|
|
4
|
+
const _ = require("lodash");
|
|
5
|
+
const url = require("url");
|
|
6
|
+
const WebSocket = require("ws");
|
|
7
|
+
const serialization_1 = require("../../serialization/serialization");
|
|
8
|
+
const request_handlers_1 = require("../requests/request-handlers");
|
|
9
|
+
Object.defineProperty(exports, "CloseConnectionHandler", { enumerable: true, get: function () { return request_handlers_1.CloseConnectionHandler; } });
|
|
10
|
+
Object.defineProperty(exports, "ResetConnectionHandler", { enumerable: true, get: function () { return request_handlers_1.ResetConnectionHandler; } });
|
|
11
|
+
Object.defineProperty(exports, "TimeoutHandler", { enumerable: true, get: function () { return request_handlers_1.TimeoutHandler; } });
|
|
12
|
+
const url_1 = require("../../util/url");
|
|
13
|
+
const request_utils_1 = require("../../util/request-utils");
|
|
14
|
+
const header_utils_1 = require("../../util/header-utils");
|
|
15
|
+
const buffer_utils_1 = require("../../util/buffer-utils");
|
|
16
|
+
const http_agents_1 = require("../http-agents");
|
|
17
|
+
const rule_parameters_1 = require("../rule-parameters");
|
|
18
|
+
const passthrough_handling_1 = require("../passthrough-handling");
|
|
19
|
+
const websocket_handler_definitions_1 = require("./websocket-handler-definitions");
|
|
20
|
+
function isOpen(socket) {
|
|
21
|
+
return socket.readyState === WebSocket.OPEN;
|
|
22
|
+
}
|
|
23
|
+
// Based on ws's validation.js
|
|
24
|
+
function isValidStatusCode(code) {
|
|
25
|
+
return ( // Standard code:
|
|
26
|
+
code >= 1000 &&
|
|
27
|
+
code <= 1014 &&
|
|
28
|
+
code !== 1004 &&
|
|
29
|
+
code !== 1005 &&
|
|
30
|
+
code !== 1006) || ( // Application-specific code:
|
|
31
|
+
code >= 3000 && code <= 4999);
|
|
32
|
+
}
|
|
33
|
+
const INVALID_STATUS_REGEX = /Invalid WebSocket frame: invalid status code (\d+)/;
|
|
34
|
+
function pipeWebSocket(inSocket, outSocket) {
|
|
35
|
+
const onPipeFailed = (op) => (err) => {
|
|
36
|
+
if (!err)
|
|
37
|
+
return;
|
|
38
|
+
inSocket.close();
|
|
39
|
+
console.error(`Websocket ${op} failed`, err);
|
|
40
|
+
};
|
|
41
|
+
inSocket.on('message', (msg, isBinary) => {
|
|
42
|
+
if (isOpen(outSocket)) {
|
|
43
|
+
outSocket.send(msg, { binary: isBinary }, onPipeFailed('message'));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
inSocket.on('close', (num, reason) => {
|
|
47
|
+
if (isValidStatusCode(num)) {
|
|
48
|
+
try {
|
|
49
|
+
outSocket.close(num, reason);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
console.warn(e);
|
|
53
|
+
outSocket.close();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
outSocket.close();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
inSocket.on('ping', (data) => {
|
|
61
|
+
if (isOpen(outSocket))
|
|
62
|
+
outSocket.ping(data, undefined, onPipeFailed('ping'));
|
|
63
|
+
});
|
|
64
|
+
inSocket.on('pong', (data) => {
|
|
65
|
+
if (isOpen(outSocket))
|
|
66
|
+
outSocket.pong(data, undefined, onPipeFailed('pong'));
|
|
67
|
+
});
|
|
68
|
+
// If either socket has an general error (connection failure, but also could be invalid WS
|
|
69
|
+
// frames) then we kill the raw connection upstream to simulate a generic connection error:
|
|
70
|
+
inSocket.on('error', (err) => {
|
|
71
|
+
console.log(`Error in proxied WebSocket:`, err);
|
|
72
|
+
const rawOutSocket = outSocket;
|
|
73
|
+
if (err.message.match(INVALID_STATUS_REGEX)) {
|
|
74
|
+
const status = parseInt(INVALID_STATUS_REGEX.exec(err.message)[1]);
|
|
75
|
+
// Simulate errors elsewhere by messing with ws internals. This may break things,
|
|
76
|
+
// that's effectively on purpose: we're simulating the client going wrong:
|
|
77
|
+
const buf = Buffer.allocUnsafe(2);
|
|
78
|
+
buf.writeUInt16BE(status); // status comes from readUInt16BE, so always fits
|
|
79
|
+
const sender = rawOutSocket._sender;
|
|
80
|
+
sender.sendFrame(sender.constructor.frame(buf, {
|
|
81
|
+
fin: true,
|
|
82
|
+
rsv1: false,
|
|
83
|
+
opcode: 0x08,
|
|
84
|
+
mask: true,
|
|
85
|
+
readOnly: false
|
|
86
|
+
}), () => {
|
|
87
|
+
rawOutSocket._socket.destroy();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Unknown error, just kill the connection with no explanation
|
|
92
|
+
rawOutSocket._socket.destroy();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function mirrorRejection(socket, rejectionResponse) {
|
|
97
|
+
if (socket.writable) {
|
|
98
|
+
const { statusCode, statusMessage, rawHeaders } = rejectionResponse;
|
|
99
|
+
socket.write(rawResponse(statusCode || 500, statusMessage || 'Unknown error', (0, header_utils_1.pairFlatRawHeaders)(rawHeaders)));
|
|
100
|
+
const body = await (0, buffer_utils_1.streamToBuffer)(rejectionResponse);
|
|
101
|
+
if (socket.writable)
|
|
102
|
+
socket.write(body);
|
|
103
|
+
}
|
|
104
|
+
socket.destroy();
|
|
105
|
+
}
|
|
106
|
+
const rawResponse = (statusCode, statusMessage, headers = []) => `HTTP/1.1 ${statusCode} ${statusMessage}\r\n` +
|
|
107
|
+
_.map(headers, ([key, value]) => `${key}: ${value}`).join('\r\n') +
|
|
108
|
+
'\r\n\r\n';
|
|
109
|
+
class PassThroughWebSocketHandler extends websocket_handler_definitions_1.PassThroughWebSocketHandlerDefinition {
|
|
110
|
+
initializeWsServer() {
|
|
111
|
+
if (this.wsServer)
|
|
112
|
+
return;
|
|
113
|
+
this.wsServer = new WebSocket.Server({
|
|
114
|
+
noServer: true,
|
|
115
|
+
// Mirror subprotocols back to the client:
|
|
116
|
+
handleProtocols(protocols, request) {
|
|
117
|
+
return request.upstreamWebSocketProtocol
|
|
118
|
+
// If there's no upstream socket, default to mirroring the first protocol. This matches
|
|
119
|
+
// WS's default behaviour - we could be stricter, but it'd be a breaking change.
|
|
120
|
+
?? protocols.values().next().value
|
|
121
|
+
?? false; // If there were no protocols specific and this is called for some reason
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
this.wsServer.on('connection', (ws) => {
|
|
125
|
+
pipeWebSocket(ws, ws.upstreamWebSocket);
|
|
126
|
+
pipeWebSocket(ws.upstreamWebSocket, ws);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async trustedCACertificates() {
|
|
130
|
+
if (!this.extraCACertificates.length)
|
|
131
|
+
return undefined;
|
|
132
|
+
if (!this._trustedCACertificates) {
|
|
133
|
+
this._trustedCACertificates = (0, passthrough_handling_1.getTrustedCAs)(undefined, this.extraCACertificates);
|
|
134
|
+
}
|
|
135
|
+
return this._trustedCACertificates;
|
|
136
|
+
}
|
|
137
|
+
async handle(req, socket, head) {
|
|
138
|
+
this.initializeWsServer();
|
|
139
|
+
let { protocol, hostname, port, path } = url.parse(req.url);
|
|
140
|
+
const rawHeaders = req.rawHeaders;
|
|
141
|
+
const reqMessage = req;
|
|
142
|
+
const isH2Downstream = (0, request_utils_1.isHttp2)(req);
|
|
143
|
+
const hostHeaderName = isH2Downstream ? ':authority' : 'host';
|
|
144
|
+
hostname = await (0, passthrough_handling_1.getClientRelativeHostname)(hostname, req.remoteIpAddress, (0, passthrough_handling_1.getDnsLookupFunction)(this.lookupOptions));
|
|
145
|
+
if (this.forwarding) {
|
|
146
|
+
const { targetHost, updateHostHeader } = this.forwarding;
|
|
147
|
+
let wsUrl;
|
|
148
|
+
if (!targetHost.includes('/')) {
|
|
149
|
+
// We're forwarding to a bare hostname, just overwrite that bit:
|
|
150
|
+
[hostname, port] = targetHost.split(':');
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Forwarding to a full URL; override the host & protocol, but never the path.
|
|
154
|
+
({ protocol, hostname, port } = url.parse(targetHost));
|
|
155
|
+
}
|
|
156
|
+
// Connect directly to the forwarding target URL
|
|
157
|
+
wsUrl = `${protocol}//${hostname}${port ? ':' + port : ''}${path}`;
|
|
158
|
+
// Optionally update the host header too:
|
|
159
|
+
let hostHeader = (0, header_utils_1.findRawHeader)(rawHeaders, hostHeaderName);
|
|
160
|
+
if (!hostHeader) {
|
|
161
|
+
// Should never happen really, but just in case:
|
|
162
|
+
hostHeader = [hostHeaderName, hostname];
|
|
163
|
+
rawHeaders.unshift(hostHeader);
|
|
164
|
+
}
|
|
165
|
+
;
|
|
166
|
+
if (updateHostHeader === undefined || updateHostHeader === true) {
|
|
167
|
+
// If updateHostHeader is true, or just not specified, match the new target
|
|
168
|
+
hostHeader[1] = hostname + (port ? `:${port}` : '');
|
|
169
|
+
}
|
|
170
|
+
else if (updateHostHeader) {
|
|
171
|
+
// If it's an explicit custom value, use that directly.
|
|
172
|
+
hostHeader[1] = updateHostHeader;
|
|
173
|
+
} // Otherwise: falsey means don't touch it.
|
|
174
|
+
await this.connectUpstream(wsUrl, reqMessage, rawHeaders, socket, head);
|
|
175
|
+
}
|
|
176
|
+
else if (!hostname) { // No hostname in URL means transparent proxy, so use Host header
|
|
177
|
+
const hostHeader = req.headers[hostHeaderName];
|
|
178
|
+
[hostname, port] = hostHeader.split(':');
|
|
179
|
+
// __lastHopEncrypted is set in http-combo-server, for requests that have explicitly
|
|
180
|
+
// CONNECTed upstream (which may then up/downgrade from the current encryption).
|
|
181
|
+
if (socket.__lastHopEncrypted !== undefined) {
|
|
182
|
+
protocol = socket.__lastHopEncrypted ? 'wss' : 'ws';
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
protocol = reqMessage.connection.encrypted ? 'wss' : 'ws';
|
|
186
|
+
}
|
|
187
|
+
const wsUrl = `${protocol}://${hostname}${port ? ':' + port : ''}${path}`;
|
|
188
|
+
await this.connectUpstream(wsUrl, reqMessage, rawHeaders, socket, head);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Connect directly according to the specified URL
|
|
192
|
+
const wsUrl = `${protocol.replace('http', 'ws')}//${hostname}${port ? ':' + port : ''}${path}`;
|
|
193
|
+
await this.connectUpstream(wsUrl, reqMessage, rawHeaders, socket, head);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async connectUpstream(wsUrl, req, rawHeaders, incomingSocket, head) {
|
|
197
|
+
const parsedUrl = url.parse(wsUrl);
|
|
198
|
+
const effectivePort = (0, url_1.getEffectivePort)(parsedUrl);
|
|
199
|
+
const strictHttpsChecks = (0, passthrough_handling_1.shouldUseStrictHttps)(parsedUrl.hostname, effectivePort, this.ignoreHostHttpsErrors);
|
|
200
|
+
// Use a client cert if it's listed for the host+port or whole hostname
|
|
201
|
+
const hostWithPort = `${parsedUrl.hostname}:${effectivePort}`;
|
|
202
|
+
const clientCert = this.clientCertificateHostMap[hostWithPort] ||
|
|
203
|
+
this.clientCertificateHostMap[parsedUrl.hostname] ||
|
|
204
|
+
{};
|
|
205
|
+
const trustedCerts = await this.trustedCACertificates();
|
|
206
|
+
const caConfig = trustedCerts
|
|
207
|
+
? { ca: trustedCerts }
|
|
208
|
+
: {};
|
|
209
|
+
const proxySettingSource = (0, rule_parameters_1.assertParamDereferenced)(this.proxyConfig);
|
|
210
|
+
const agent = await (0, http_agents_1.getAgent)({
|
|
211
|
+
protocol: parsedUrl.protocol,
|
|
212
|
+
hostname: parsedUrl.hostname,
|
|
213
|
+
port: effectivePort,
|
|
214
|
+
proxySettingSource,
|
|
215
|
+
tryHttp2: false, // We don't support websockets over H2 yet
|
|
216
|
+
keepAlive: false // Not a thing for websockets: they take over the whole connection
|
|
217
|
+
});
|
|
218
|
+
// We have to flatten the headers, as WS doesn't support raw headers - it builds its own
|
|
219
|
+
// header object internally.
|
|
220
|
+
const headers = (0, header_utils_1.rawHeadersToObjectPreservingCase)(rawHeaders);
|
|
221
|
+
// Subprotocols have to be handled explicitly. WS takes control of the headers itself,
|
|
222
|
+
// and checks the response, so we need to parse the client headers and use them manually:
|
|
223
|
+
const originalSubprotocols = (0, header_utils_1.findRawHeaders)(rawHeaders, 'sec-websocket-protocol')
|
|
224
|
+
.flatMap(([_k, value]) => value.split(',').map(p => p.trim()));
|
|
225
|
+
// Drop empty subprotocols, to better handle mildly badly behaved clients
|
|
226
|
+
const filteredSubprotocols = originalSubprotocols.filter(p => !!p);
|
|
227
|
+
// If the subprotocols are invalid (there are some empty strings, or an entirely empty value) then
|
|
228
|
+
// WS will reject the upgrade. With this, we reset the header to the 'equivalent' valid version, to
|
|
229
|
+
// avoid unnecessarily rejecting clients who send mildly wrong headers (empty protocol values).
|
|
230
|
+
if (originalSubprotocols.length !== filteredSubprotocols.length) {
|
|
231
|
+
if (filteredSubprotocols.length) {
|
|
232
|
+
// Note that req.headers is auto-lowercased by Node, so we can ignore case
|
|
233
|
+
req.headers['sec-websocket-protocol'] = filteredSubprotocols.join(',');
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
delete req.headers['sec-websocket-protocol'];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const upstreamWebSocket = new WebSocket(wsUrl, filteredSubprotocols, {
|
|
240
|
+
maxPayload: 0,
|
|
241
|
+
agent,
|
|
242
|
+
lookup: (0, passthrough_handling_1.getDnsLookupFunction)(this.lookupOptions),
|
|
243
|
+
headers: _.omitBy(headers, (_v, headerName) => headerName.toLowerCase().startsWith('sec-websocket') ||
|
|
244
|
+
headerName.toLowerCase() === 'connection' ||
|
|
245
|
+
headerName.toLowerCase() === 'upgrade'), // Simplify to string - doesn't matter though, only used by http module anyway
|
|
246
|
+
// TLS options:
|
|
247
|
+
...(0, passthrough_handling_1.getUpstreamTlsOptions)(strictHttpsChecks),
|
|
248
|
+
...clientCert,
|
|
249
|
+
...caConfig
|
|
250
|
+
});
|
|
251
|
+
upstreamWebSocket.once('open', () => {
|
|
252
|
+
// Used in the subprotocol selection handler during the upgrade:
|
|
253
|
+
req.upstreamWebSocketProtocol = upstreamWebSocket.protocol || false;
|
|
254
|
+
this.wsServer.handleUpgrade(req, incomingSocket, head, (ws) => {
|
|
255
|
+
ws.upstreamWebSocket = upstreamWebSocket;
|
|
256
|
+
incomingSocket.emit('ws-upgrade', ws);
|
|
257
|
+
this.wsServer.emit('connection', ws); // This pipes the connections together
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
// If the upstream says no, we say no too.
|
|
261
|
+
let unexpectedResponse = false;
|
|
262
|
+
upstreamWebSocket.on('unexpected-response', (req, res) => {
|
|
263
|
+
console.log(`Unexpected websocket response from ${wsUrl}: ${res.statusCode}`);
|
|
264
|
+
// Clean up the downstream connection
|
|
265
|
+
mirrorRejection(incomingSocket, res);
|
|
266
|
+
// Clean up the upstream connection (WS would do this automatically, but doesn't if you listen to this event)
|
|
267
|
+
// See https://github.com/websockets/ws/blob/45e17acea791d865df6b255a55182e9c42e5877a/lib/websocket.js#L1050
|
|
268
|
+
// We don't match that perfectly, but this should be effectively equivalent:
|
|
269
|
+
req.destroy();
|
|
270
|
+
if (req.socket && !req.socket.destroyed) {
|
|
271
|
+
res.socket.destroy();
|
|
272
|
+
}
|
|
273
|
+
unexpectedResponse = true; // So that we ignore this in the error handler
|
|
274
|
+
upstreamWebSocket.terminate();
|
|
275
|
+
});
|
|
276
|
+
// If there's some other error, we just kill the socket:
|
|
277
|
+
upstreamWebSocket.on('error', (e) => {
|
|
278
|
+
if (unexpectedResponse)
|
|
279
|
+
return; // Handled separately above
|
|
280
|
+
console.warn(e);
|
|
281
|
+
incomingSocket.end();
|
|
282
|
+
});
|
|
283
|
+
incomingSocket.on('error', () => upstreamWebSocket.close(1011)); // Internal error
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* @internal
|
|
287
|
+
*/
|
|
288
|
+
static deserialize(data, channel, ruleParams) {
|
|
289
|
+
// By default, we assume we just need to assign the right prototype
|
|
290
|
+
return _.create(this.prototype, {
|
|
291
|
+
...data,
|
|
292
|
+
proxyConfig: (0, serialization_1.deserializeProxyConfig)(data.proxyConfig, channel, ruleParams),
|
|
293
|
+
extraCACertificates: data.extraCACertificates || [],
|
|
294
|
+
ignoreHostHttpsErrors: data.ignoreHostCertificateErrors,
|
|
295
|
+
clientCertificateHostMap: _.mapValues(data.clientCertificateHostMap, ({ pfx, passphrase }) => ({ pfx: (0, serialization_1.deserializeBuffer)(pfx), passphrase })),
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
exports.PassThroughWebSocketHandler = PassThroughWebSocketHandler;
|
|
300
|
+
class EchoWebSocketHandler extends websocket_handler_definitions_1.EchoWebSocketHandlerDefinition {
|
|
301
|
+
initializeWsServer() {
|
|
302
|
+
if (this.wsServer)
|
|
303
|
+
return;
|
|
304
|
+
this.wsServer = new WebSocket.Server({ noServer: true });
|
|
305
|
+
this.wsServer.on('connection', (ws) => {
|
|
306
|
+
pipeWebSocket(ws, ws);
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
async handle(req, socket, head) {
|
|
310
|
+
this.initializeWsServer();
|
|
311
|
+
this.wsServer.handleUpgrade(req, socket, head, (ws) => {
|
|
312
|
+
socket.emit('ws-upgrade', ws);
|
|
313
|
+
this.wsServer.emit('connection', ws);
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.EchoWebSocketHandler = EchoWebSocketHandler;
|
|
318
|
+
class ListenWebSocketHandler extends websocket_handler_definitions_1.ListenWebSocketHandlerDefinition {
|
|
319
|
+
initializeWsServer() {
|
|
320
|
+
if (this.wsServer)
|
|
321
|
+
return;
|
|
322
|
+
this.wsServer = new WebSocket.Server({ noServer: true });
|
|
323
|
+
this.wsServer.on('connection', (ws) => {
|
|
324
|
+
// Accept but ignore the incoming websocket data
|
|
325
|
+
ws.resume();
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
async handle(req, socket, head) {
|
|
329
|
+
this.initializeWsServer();
|
|
330
|
+
this.wsServer.handleUpgrade(req, socket, head, (ws) => {
|
|
331
|
+
socket.emit('ws-upgrade', ws);
|
|
332
|
+
this.wsServer.emit('connection', ws);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
exports.ListenWebSocketHandler = ListenWebSocketHandler;
|
|
337
|
+
class RejectWebSocketHandler extends websocket_handler_definitions_1.RejectWebSocketHandlerDefinition {
|
|
338
|
+
async handle(req, socket, head) {
|
|
339
|
+
socket.write(rawResponse(this.statusCode, this.statusMessage, (0, header_utils_1.objectHeadersToRaw)(this.headers)));
|
|
340
|
+
if (this.body)
|
|
341
|
+
socket.write(this.body);
|
|
342
|
+
socket.write('\r\n');
|
|
343
|
+
socket.destroy();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
exports.RejectWebSocketHandler = RejectWebSocketHandler;
|
|
347
|
+
exports.WsHandlerLookup = {
|
|
348
|
+
'ws-passthrough': PassThroughWebSocketHandler,
|
|
349
|
+
'ws-echo': EchoWebSocketHandler,
|
|
350
|
+
'ws-listen': ListenWebSocketHandler,
|
|
351
|
+
'ws-reject': RejectWebSocketHandler,
|
|
352
|
+
'close-connection': request_handlers_1.CloseConnectionHandler,
|
|
353
|
+
'reset-connection': request_handlers_1.ResetConnectionHandler,
|
|
354
|
+
'timeout': request_handlers_1.TimeoutHandler
|
|
355
|
+
};
|
|
356
|
+
//# sourceMappingURL=websocket-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-handlers.js","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handlers.ts"],"names":[],"mappings":"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"}
|