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,515 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MatcherLookup = exports.CallbackMatcher = exports.CookieMatcher = exports.JsonBodyFlexibleMatcher = exports.JsonBodyMatcher = exports.RegexBodyMatcher = exports.RawBodyIncludesMatcher = exports.RawBodyMatcher = exports.MultipartFormDataMatcher = exports.FormDataMatcher = exports.QueryMatcher = exports.ExactQueryMatcher = exports.HeaderMatcher = exports.RegexUrlMatcher = exports.RegexPathMatcher = exports.SimplePathMatcher = exports.PortMatcher = exports.HostnameMatcher = exports.HostMatcher = exports.ProtocolMatcher = exports.MethodMatcher = exports.WildcardMatcher = void 0;
|
|
4
|
+
exports.matchesAll = matchesAll;
|
|
5
|
+
exports.explainMatchers = explainMatchers;
|
|
6
|
+
const _ = require("lodash");
|
|
7
|
+
const url = require("url");
|
|
8
|
+
const common_tags_1 = require("common-tags");
|
|
9
|
+
const multipart = require("parse-multipart-data");
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
const url_1 = require("../util/url");
|
|
12
|
+
const request_utils_1 = require("../util/request-utils");
|
|
13
|
+
const serialization_1 = require("../serialization/serialization");
|
|
14
|
+
const body_serialization_1 = require("../serialization/body-serialization");
|
|
15
|
+
function unescapeRegexp(input) {
|
|
16
|
+
return input.replace(/\\\//g, '/');
|
|
17
|
+
}
|
|
18
|
+
class WildcardMatcher extends serialization_1.Serializable {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.type = 'wildcard';
|
|
22
|
+
}
|
|
23
|
+
matches() {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
explain() {
|
|
27
|
+
return 'for anything';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.WildcardMatcher = WildcardMatcher;
|
|
31
|
+
class MethodMatcher extends serialization_1.Serializable {
|
|
32
|
+
constructor(method) {
|
|
33
|
+
super();
|
|
34
|
+
this.method = method;
|
|
35
|
+
this.type = 'method';
|
|
36
|
+
}
|
|
37
|
+
matches(request) {
|
|
38
|
+
return request.method === types_1.Method[this.method];
|
|
39
|
+
}
|
|
40
|
+
explain() {
|
|
41
|
+
return `making ${types_1.Method[this.method]}s`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.MethodMatcher = MethodMatcher;
|
|
45
|
+
class ProtocolMatcher extends serialization_1.Serializable {
|
|
46
|
+
constructor(protocol) {
|
|
47
|
+
super();
|
|
48
|
+
this.protocol = protocol;
|
|
49
|
+
this.type = 'protocol';
|
|
50
|
+
if (protocol !== "http" &&
|
|
51
|
+
protocol !== "https" &&
|
|
52
|
+
protocol !== "ws" &&
|
|
53
|
+
protocol !== "wss") {
|
|
54
|
+
throw new Error("Invalid protocol: protocol can only be 'http', 'https', 'ws' or 'wss'");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
matches(request) {
|
|
58
|
+
return request.protocol === this.protocol;
|
|
59
|
+
}
|
|
60
|
+
explain() {
|
|
61
|
+
return `for protocol ${this.protocol}`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ProtocolMatcher = ProtocolMatcher;
|
|
65
|
+
class HostMatcher extends serialization_1.Serializable {
|
|
66
|
+
constructor(host) {
|
|
67
|
+
super();
|
|
68
|
+
this.host = host;
|
|
69
|
+
this.type = 'host';
|
|
70
|
+
// Validate the hostname. Goal here isn't to catch every bad hostname, but allow
|
|
71
|
+
// every good hostname, and provide friendly errors for obviously bad hostnames.
|
|
72
|
+
if (host.includes('/')) {
|
|
73
|
+
throw new Error("Invalid hostname: hostnames can't contain slashes");
|
|
74
|
+
}
|
|
75
|
+
else if (host.includes('?')) {
|
|
76
|
+
throw new Error("Invalid hostname: hostnames can't contain query strings");
|
|
77
|
+
}
|
|
78
|
+
else if (!host.match(/^([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+(:\d+)?$/)) { // Port optional
|
|
79
|
+
throw new Error("Hostname is invalid");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
matches(request) {
|
|
83
|
+
const parsedUrl = new url.URL(request.url);
|
|
84
|
+
if ((this.host.endsWith(':80') && request.protocol === 'http') ||
|
|
85
|
+
(this.host.endsWith(':443') && request.protocol === 'https')) {
|
|
86
|
+
// On default ports, our URL normalization erases an explicit port, so that a
|
|
87
|
+
// :80 here will never match anything. This handles that case: if you send HTTP
|
|
88
|
+
// traffic on port 80 then the port is blank, but it should match for 'hostname:80'.
|
|
89
|
+
return parsedUrl.hostname === this.host.split(':')[0] && parsedUrl.port === '';
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
return parsedUrl.host === this.host;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
explain() {
|
|
96
|
+
return `for host ${this.host}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.HostMatcher = HostMatcher;
|
|
100
|
+
class HostnameMatcher extends serialization_1.Serializable {
|
|
101
|
+
constructor(hostname) {
|
|
102
|
+
super();
|
|
103
|
+
this.hostname = hostname;
|
|
104
|
+
this.type = 'hostname';
|
|
105
|
+
// Validate the hostname. Goal here isn't to catch every bad hostname, but allow
|
|
106
|
+
// every good hostname, and provide friendly errors for obviously bad hostnames.
|
|
107
|
+
if (hostname.includes('/')) {
|
|
108
|
+
throw new Error("Invalid hostname: hostnames can't contain slashes");
|
|
109
|
+
}
|
|
110
|
+
else if (hostname.includes('?')) {
|
|
111
|
+
throw new Error("Invalid hostname: hostnames can't contain query strings");
|
|
112
|
+
}
|
|
113
|
+
else if (!hostname.match(/^([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+$/)) { // No port
|
|
114
|
+
throw new Error("Hostname is invalid");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
matches(request) {
|
|
118
|
+
return new url.URL(request.url).hostname === this.hostname;
|
|
119
|
+
}
|
|
120
|
+
explain() {
|
|
121
|
+
return `for hostname ${this.hostname}`;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.HostnameMatcher = HostnameMatcher;
|
|
125
|
+
class PortMatcher extends serialization_1.Serializable {
|
|
126
|
+
constructor(port) {
|
|
127
|
+
super();
|
|
128
|
+
this.type = 'port';
|
|
129
|
+
this.port = port.toString();
|
|
130
|
+
}
|
|
131
|
+
matches(request) {
|
|
132
|
+
const parsedUrl = new url.URL(request.url);
|
|
133
|
+
if ((this.port === '80' && request.protocol === 'http') ||
|
|
134
|
+
(this.port === '443' && request.protocol === 'https')) {
|
|
135
|
+
// The port is erased during our URL preprocessing if it's the default,
|
|
136
|
+
// so for those cases we have to match that separately:
|
|
137
|
+
return parsedUrl.port === '';
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return new url.URL(request.url).port === this.port;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
explain() {
|
|
144
|
+
return `for port ${this.port}`;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.PortMatcher = PortMatcher;
|
|
148
|
+
class SimplePathMatcher extends serialization_1.Serializable {
|
|
149
|
+
constructor(path) {
|
|
150
|
+
super();
|
|
151
|
+
this.path = path;
|
|
152
|
+
this.type = 'simple-path';
|
|
153
|
+
if (!this.path)
|
|
154
|
+
throw new Error('Invalid URL: URL to match must not be empty');
|
|
155
|
+
let { search, query } = url.parse(this.path, true);
|
|
156
|
+
if (search) {
|
|
157
|
+
throw new Error((0, common_tags_1.oneLine) `
|
|
158
|
+
Tried to match a path that contained a query (${search}).
|
|
159
|
+
To match query parameters, use .withQuery(${JSON.stringify(query)}) instead,
|
|
160
|
+
or .withExactQuery('${search}') to match this exact query string.
|
|
161
|
+
`);
|
|
162
|
+
}
|
|
163
|
+
(0, url_1.normalizeUrl)(this.path); // Fail if URL can't be normalized
|
|
164
|
+
}
|
|
165
|
+
matches(request) {
|
|
166
|
+
const expectedUrl = (0, url_1.normalizeUrl)(this.path);
|
|
167
|
+
const reqUrl = (0, url_1.normalizeUrl)(request.url);
|
|
168
|
+
// reqUrl is always absolute, expectedUrl can be absolute, relative or protocolless-absolute
|
|
169
|
+
if ((0, url_1.isRelativeUrl)(expectedUrl)) {
|
|
170
|
+
// Match the path only, for any host
|
|
171
|
+
return (0, url_1.getPathFromAbsoluteUrl)(reqUrl) === expectedUrl;
|
|
172
|
+
}
|
|
173
|
+
else if ((0, url_1.isAbsoluteUrl)(expectedUrl)) {
|
|
174
|
+
// Full absolute URL: match everything
|
|
175
|
+
return reqUrl === expectedUrl;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Absolute URL with no protocol
|
|
179
|
+
return (0, url_1.getUrlWithoutProtocol)(reqUrl) === expectedUrl;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
explain() {
|
|
183
|
+
return `for ${this.path}`;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.SimplePathMatcher = SimplePathMatcher;
|
|
187
|
+
class RegexPathMatcher extends serialization_1.Serializable {
|
|
188
|
+
constructor(regex) {
|
|
189
|
+
super();
|
|
190
|
+
this.type = 'regex-path';
|
|
191
|
+
this.regexSource = regex.source;
|
|
192
|
+
this.regexFlags = regex.flags;
|
|
193
|
+
}
|
|
194
|
+
matches(request) {
|
|
195
|
+
const absoluteUrl = (0, url_1.normalizeUrl)(request.url);
|
|
196
|
+
const urlPath = (0, url_1.getPathFromAbsoluteUrl)(absoluteUrl);
|
|
197
|
+
// Test the matcher against both the path alone & the full URL
|
|
198
|
+
const urlMatcher = new RegExp(this.regexSource, this.regexFlags);
|
|
199
|
+
return urlMatcher.test(absoluteUrl) ||
|
|
200
|
+
urlMatcher.test(urlPath);
|
|
201
|
+
}
|
|
202
|
+
explain() {
|
|
203
|
+
return `matching /${unescapeRegexp(this.regexSource)}/${this.regexFlags ?? ''}`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
exports.RegexPathMatcher = RegexPathMatcher;
|
|
207
|
+
class RegexUrlMatcher extends serialization_1.Serializable {
|
|
208
|
+
constructor(regex) {
|
|
209
|
+
super();
|
|
210
|
+
this.type = 'regex-url';
|
|
211
|
+
this.regexSource = regex.source;
|
|
212
|
+
this.regexFlags = regex.flags;
|
|
213
|
+
}
|
|
214
|
+
matches(request) {
|
|
215
|
+
const absoluteUrl = (0, url_1.normalizeUrl)(request.url);
|
|
216
|
+
// Test the matcher against the full URL
|
|
217
|
+
const urlMatcher = new RegExp(this.regexSource, this.regexFlags);
|
|
218
|
+
return urlMatcher.test(absoluteUrl);
|
|
219
|
+
}
|
|
220
|
+
explain() {
|
|
221
|
+
return `matching URL /${unescapeRegexp(this.regexSource)}/${this.regexFlags ?? ''}`;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
exports.RegexUrlMatcher = RegexUrlMatcher;
|
|
225
|
+
class HeaderMatcher extends serialization_1.Serializable {
|
|
226
|
+
constructor(headersInput) {
|
|
227
|
+
super();
|
|
228
|
+
this.type = 'header';
|
|
229
|
+
this.headers = _.mapKeys(headersInput, (_value, key) => key.toLowerCase());
|
|
230
|
+
}
|
|
231
|
+
matches(request) {
|
|
232
|
+
return _.isMatch(request.headers, this.headers);
|
|
233
|
+
}
|
|
234
|
+
explain() {
|
|
235
|
+
return `with headers including ${JSON.stringify(this.headers)}`;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
exports.HeaderMatcher = HeaderMatcher;
|
|
239
|
+
class ExactQueryMatcher extends serialization_1.Serializable {
|
|
240
|
+
constructor(query) {
|
|
241
|
+
super();
|
|
242
|
+
this.query = query;
|
|
243
|
+
this.type = 'exact-query-string';
|
|
244
|
+
if (query !== '' && query[0] !== '?') {
|
|
245
|
+
throw new Error('Exact query matches must start with ?, or be empty');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
matches(request) {
|
|
249
|
+
const { search } = url.parse(request.url);
|
|
250
|
+
return this.query === search || (!search && !this.query);
|
|
251
|
+
}
|
|
252
|
+
explain() {
|
|
253
|
+
return this.query
|
|
254
|
+
? `with a query exactly matching \`${this.query}\``
|
|
255
|
+
: 'with no query string';
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
exports.ExactQueryMatcher = ExactQueryMatcher;
|
|
259
|
+
class QueryMatcher extends serialization_1.Serializable {
|
|
260
|
+
constructor(queryObjectInput) {
|
|
261
|
+
super();
|
|
262
|
+
this.type = 'query';
|
|
263
|
+
this.queryObject = _.mapValues(queryObjectInput, (v) => Array.isArray(v) ? v.map(av => av.toString()) : v.toString());
|
|
264
|
+
}
|
|
265
|
+
matches(request) {
|
|
266
|
+
let { query } = url.parse(request.url, true);
|
|
267
|
+
return _.isMatch(query, this.queryObject);
|
|
268
|
+
}
|
|
269
|
+
explain() {
|
|
270
|
+
return `with a query including ${JSON.stringify(this.queryObject)}`;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.QueryMatcher = QueryMatcher;
|
|
274
|
+
class FormDataMatcher extends serialization_1.Serializable {
|
|
275
|
+
constructor(formData) {
|
|
276
|
+
super();
|
|
277
|
+
this.formData = formData;
|
|
278
|
+
this.type = 'form-data';
|
|
279
|
+
}
|
|
280
|
+
async matches(request) {
|
|
281
|
+
const contentType = request.headers['content-type'];
|
|
282
|
+
return !!contentType &&
|
|
283
|
+
contentType.indexOf("application/x-www-form-urlencoded") !== -1 &&
|
|
284
|
+
_.isMatch(await request.body.asFormData(), this.formData);
|
|
285
|
+
}
|
|
286
|
+
explain() {
|
|
287
|
+
return `with form data including ${JSON.stringify(this.formData)}`;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
exports.FormDataMatcher = FormDataMatcher;
|
|
291
|
+
class MultipartFormDataMatcher extends serialization_1.Serializable {
|
|
292
|
+
constructor(matchConditions) {
|
|
293
|
+
super();
|
|
294
|
+
this.matchConditions = matchConditions;
|
|
295
|
+
this.type = 'multipart-form-data';
|
|
296
|
+
}
|
|
297
|
+
async matches(request) {
|
|
298
|
+
const contentType = request.headers['content-type'];
|
|
299
|
+
if (!contentType)
|
|
300
|
+
return false;
|
|
301
|
+
if (!contentType.includes("multipart/form-data"))
|
|
302
|
+
return false;
|
|
303
|
+
const boundary = contentType.match(/;\s*boundary=(\S+)/);
|
|
304
|
+
if (!boundary)
|
|
305
|
+
return false;
|
|
306
|
+
const parsedBody = multipart.parse(await request.body.asDecodedBuffer(), boundary[1]);
|
|
307
|
+
return this.matchConditions.every((condition) => {
|
|
308
|
+
const expectedContent = condition.content
|
|
309
|
+
? Buffer.from(condition.content)
|
|
310
|
+
: undefined;
|
|
311
|
+
return parsedBody.some((part) => (expectedContent?.equals(part.data) || expectedContent === undefined) &&
|
|
312
|
+
(condition.filename === part.filename || condition.filename === undefined) &&
|
|
313
|
+
(condition.name === part.name || condition.name === undefined));
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
explain() {
|
|
317
|
+
return `with multipart form data matching ${JSON.stringify(this.matchConditions)}`;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.MultipartFormDataMatcher = MultipartFormDataMatcher;
|
|
321
|
+
class RawBodyMatcher extends serialization_1.Serializable {
|
|
322
|
+
constructor(content) {
|
|
323
|
+
super();
|
|
324
|
+
this.content = content;
|
|
325
|
+
this.type = 'raw-body';
|
|
326
|
+
}
|
|
327
|
+
async matches(request) {
|
|
328
|
+
return (await request.body.asText()) === this.content;
|
|
329
|
+
}
|
|
330
|
+
explain() {
|
|
331
|
+
return `with body '${this.content}'`;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
exports.RawBodyMatcher = RawBodyMatcher;
|
|
335
|
+
class RawBodyIncludesMatcher extends serialization_1.Serializable {
|
|
336
|
+
constructor(content) {
|
|
337
|
+
super();
|
|
338
|
+
this.content = content;
|
|
339
|
+
this.type = 'raw-body-includes';
|
|
340
|
+
}
|
|
341
|
+
async matches(request) {
|
|
342
|
+
return (await request.body.asText()).includes(this.content);
|
|
343
|
+
}
|
|
344
|
+
explain() {
|
|
345
|
+
return `with a body including '${this.content}'`;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.RawBodyIncludesMatcher = RawBodyIncludesMatcher;
|
|
349
|
+
class RegexBodyMatcher extends serialization_1.Serializable {
|
|
350
|
+
constructor(regex) {
|
|
351
|
+
super();
|
|
352
|
+
this.type = 'raw-body-regexp';
|
|
353
|
+
this.regexString = regex.source;
|
|
354
|
+
}
|
|
355
|
+
async matches(request) {
|
|
356
|
+
let bodyMatcher = new RegExp(this.regexString);
|
|
357
|
+
return bodyMatcher.test(await request.body.asText());
|
|
358
|
+
}
|
|
359
|
+
explain() {
|
|
360
|
+
return `with a body matching /${unescapeRegexp(this.regexString)}/`;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
exports.RegexBodyMatcher = RegexBodyMatcher;
|
|
364
|
+
class JsonBodyMatcher extends serialization_1.Serializable {
|
|
365
|
+
constructor(body) {
|
|
366
|
+
super();
|
|
367
|
+
this.body = body;
|
|
368
|
+
this.type = 'json-body';
|
|
369
|
+
}
|
|
370
|
+
async matches(request) {
|
|
371
|
+
const receivedBody = await (request.body.asJson().catch(() => undefined));
|
|
372
|
+
if (receivedBody === undefined)
|
|
373
|
+
return false;
|
|
374
|
+
else
|
|
375
|
+
return _.isEqual(receivedBody, this.body);
|
|
376
|
+
}
|
|
377
|
+
explain() {
|
|
378
|
+
return `with a JSON body equivalent to ${JSON.stringify(this.body)}`;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
exports.JsonBodyMatcher = JsonBodyMatcher;
|
|
382
|
+
class JsonBodyFlexibleMatcher extends serialization_1.Serializable {
|
|
383
|
+
constructor(body) {
|
|
384
|
+
super();
|
|
385
|
+
this.body = body;
|
|
386
|
+
this.type = 'json-body-matching';
|
|
387
|
+
}
|
|
388
|
+
async matches(request) {
|
|
389
|
+
const receivedBody = await (request.body.asJson().catch(() => undefined));
|
|
390
|
+
if (receivedBody === undefined)
|
|
391
|
+
return false;
|
|
392
|
+
else
|
|
393
|
+
return _.isMatch(receivedBody, this.body);
|
|
394
|
+
}
|
|
395
|
+
explain() {
|
|
396
|
+
return `with a JSON body including ${JSON.stringify(this.body)}`;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
exports.JsonBodyFlexibleMatcher = JsonBodyFlexibleMatcher;
|
|
400
|
+
class CookieMatcher extends serialization_1.Serializable {
|
|
401
|
+
constructor(cookie) {
|
|
402
|
+
super();
|
|
403
|
+
this.cookie = cookie;
|
|
404
|
+
this.type = 'cookie';
|
|
405
|
+
}
|
|
406
|
+
async matches(request) {
|
|
407
|
+
if (!request.headers || !request.headers.cookie) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
const cookies = request.headers.cookie.split(';').map(cookie => {
|
|
411
|
+
const [key, value] = cookie.split('=');
|
|
412
|
+
return { [key.trim()]: (value || '').trim() };
|
|
413
|
+
});
|
|
414
|
+
return cookies.some(element => _.isEqual(element, this.cookie));
|
|
415
|
+
}
|
|
416
|
+
explain() {
|
|
417
|
+
return `with cookies including ${JSON.stringify(this.cookie)}`;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
exports.CookieMatcher = CookieMatcher;
|
|
421
|
+
class CallbackMatcher extends serialization_1.Serializable {
|
|
422
|
+
constructor(callback) {
|
|
423
|
+
super();
|
|
424
|
+
this.callback = callback;
|
|
425
|
+
this.type = 'callback';
|
|
426
|
+
}
|
|
427
|
+
async matches(request) {
|
|
428
|
+
const completedRequest = await (0, request_utils_1.waitForCompletedRequest)(request);
|
|
429
|
+
return this.callback(completedRequest);
|
|
430
|
+
}
|
|
431
|
+
explain() {
|
|
432
|
+
return `matches using provided callback${this.callback.name ? ` (${this.callback.name})` : ''}`;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* @internal
|
|
436
|
+
*/
|
|
437
|
+
serialize(channel) {
|
|
438
|
+
channel.onRequest(async (streamMsg) => {
|
|
439
|
+
const request = (0, body_serialization_1.withDeserializedBodyReader)(streamMsg);
|
|
440
|
+
const callbackResult = await this.callback.call(null, request);
|
|
441
|
+
return callbackResult;
|
|
442
|
+
});
|
|
443
|
+
return { type: this.type, name: this.callback.name, version: 1 };
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* @internal
|
|
447
|
+
*/
|
|
448
|
+
static deserialize({ name }, channel) {
|
|
449
|
+
const rpcCallback = async (request) => {
|
|
450
|
+
const callbackResult = channel.request((0, body_serialization_1.withSerializedBodyReader)(request));
|
|
451
|
+
return callbackResult;
|
|
452
|
+
};
|
|
453
|
+
// Pass across the name from the real callback, for explain()
|
|
454
|
+
Object.defineProperty(rpcCallback, 'name', { value: name });
|
|
455
|
+
// Call the client's callback (via stream), and save a handler on our end for
|
|
456
|
+
// the response that comes back.
|
|
457
|
+
return new CallbackMatcher(rpcCallback);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
exports.CallbackMatcher = CallbackMatcher;
|
|
461
|
+
exports.MatcherLookup = {
|
|
462
|
+
'wildcard': WildcardMatcher,
|
|
463
|
+
'method': MethodMatcher,
|
|
464
|
+
'protocol': ProtocolMatcher,
|
|
465
|
+
'host': HostMatcher,
|
|
466
|
+
'hostname': HostnameMatcher,
|
|
467
|
+
'port': PortMatcher,
|
|
468
|
+
'simple-path': SimplePathMatcher,
|
|
469
|
+
'regex-path': RegexPathMatcher,
|
|
470
|
+
'regex-url': RegexUrlMatcher,
|
|
471
|
+
'header': HeaderMatcher,
|
|
472
|
+
'query': QueryMatcher,
|
|
473
|
+
'exact-query-string': ExactQueryMatcher,
|
|
474
|
+
'form-data': FormDataMatcher,
|
|
475
|
+
'multipart-form-data': MultipartFormDataMatcher,
|
|
476
|
+
'raw-body': RawBodyMatcher,
|
|
477
|
+
'raw-body-regexp': RegexBodyMatcher,
|
|
478
|
+
'raw-body-includes': RawBodyIncludesMatcher,
|
|
479
|
+
'json-body': JsonBodyMatcher,
|
|
480
|
+
'json-body-matching': JsonBodyFlexibleMatcher,
|
|
481
|
+
'cookie': CookieMatcher,
|
|
482
|
+
'callback': CallbackMatcher,
|
|
483
|
+
};
|
|
484
|
+
async function matchesAll(req, matchers) {
|
|
485
|
+
return new Promise((resolve, reject) => {
|
|
486
|
+
const resultsPromises = matchers.map((matcher) => matcher.matches(req));
|
|
487
|
+
resultsPromises.forEach(async (maybePromiseResult) => {
|
|
488
|
+
try {
|
|
489
|
+
const result = await maybePromiseResult;
|
|
490
|
+
if (!result)
|
|
491
|
+
resolve(false); // Resolve mismatches immediately
|
|
492
|
+
}
|
|
493
|
+
catch (e) {
|
|
494
|
+
reject(e); // Resolve matcher failures immediately
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
// Otherwise resolve as normal: all true matches, exceptions reject.
|
|
498
|
+
Promise.all(resultsPromises)
|
|
499
|
+
.then((result) => resolve(_.every(result)))
|
|
500
|
+
.catch((e) => reject(e));
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
function explainMatchers(matchers) {
|
|
504
|
+
if (matchers.length === 1)
|
|
505
|
+
return matchers[0].explain();
|
|
506
|
+
if (matchers.length === 2) {
|
|
507
|
+
// With just two explanations, you can just combine them
|
|
508
|
+
return `${matchers[0].explain()} ${matchers[1].explain()}`;
|
|
509
|
+
}
|
|
510
|
+
// With 3+, we need to oxford comma separate explanations to make them readable
|
|
511
|
+
return matchers.slice(0, -1)
|
|
512
|
+
.map((m) => m.explain())
|
|
513
|
+
.join(', ') + ', and ' + matchers.slice(-1)[0].explain();
|
|
514
|
+
}
|
|
515
|
+
//# sourceMappingURL=matchers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../src/rules/matchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { ProxyConfig } from "./proxy-config";
|
|
2
|
+
export interface ForwardingOptions {
|
|
3
|
+
targetHost: string;
|
|
4
|
+
updateHostHeader?: true | false | string;
|
|
5
|
+
}
|
|
6
|
+
export interface PassThroughLookupOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The maximum time to cache a DNS response. Up to this limit,
|
|
9
|
+
* responses will be cached according to their own TTL. Defaults
|
|
10
|
+
* to Infinity.
|
|
11
|
+
*/
|
|
12
|
+
maxTtl?: number;
|
|
13
|
+
/**
|
|
14
|
+
* How long to cache a DNS ENODATA or ENOTFOUND response. Defaults
|
|
15
|
+
* to 0.15.
|
|
16
|
+
*/
|
|
17
|
+
errorTtl?: number;
|
|
18
|
+
/**
|
|
19
|
+
* The primary servers to use. DNS queries will be resolved against
|
|
20
|
+
* these servers first. If no data is available, queries will fall
|
|
21
|
+
* back to dns.lookup, and use the OS's default DNS servers.
|
|
22
|
+
*
|
|
23
|
+
* This defaults to dns.getServers().
|
|
24
|
+
*/
|
|
25
|
+
servers?: string[];
|
|
26
|
+
}
|
|
27
|
+
export type CADefinition = {
|
|
28
|
+
cert: string | Buffer;
|
|
29
|
+
} | {
|
|
30
|
+
certPath: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* This defines the upstream connection parameters. These passthrough parameters
|
|
34
|
+
* are shared between both WebSocket & Request passthrough rules.
|
|
35
|
+
*/
|
|
36
|
+
export interface PassThroughHandlerConnectionOptions {
|
|
37
|
+
/**
|
|
38
|
+
* The forwarding configuration for the passthrough rule.
|
|
39
|
+
* This generally shouldn't be used explicitly unless you're
|
|
40
|
+
* building rule data by hand. Instead, call `thenPassThrough`
|
|
41
|
+
* to send data directly or `thenForwardTo` with options to
|
|
42
|
+
* configure traffic forwarding.
|
|
43
|
+
*/
|
|
44
|
+
forwarding?: ForwardingOptions;
|
|
45
|
+
/**
|
|
46
|
+
* A list of hostnames for which server certificate and TLS version errors
|
|
47
|
+
* should be ignored (none, by default).
|
|
48
|
+
*
|
|
49
|
+
* If set to 'true', HTTPS errors will be ignored for all hosts. WARNING:
|
|
50
|
+
* Use this at your own risk. Setting this to `true` can open your
|
|
51
|
+
* application to MITM attacks and should never be used over any network
|
|
52
|
+
* that is not completed trusted end-to-end.
|
|
53
|
+
*/
|
|
54
|
+
ignoreHostHttpsErrors?: string[] | boolean;
|
|
55
|
+
/**
|
|
56
|
+
* An array of additional certificates, which should be trusted as certificate
|
|
57
|
+
* authorities for upstream hosts, in addition to Node.js's built-in certificate
|
|
58
|
+
* authorities.
|
|
59
|
+
*
|
|
60
|
+
* Each certificate should be an object with either a `cert` key and a string
|
|
61
|
+
* or buffer value containing the PEM certificate, or a `certPath` key and a
|
|
62
|
+
* string value containing the local path to the PEM certificate.
|
|
63
|
+
*/
|
|
64
|
+
additionalTrustedCAs?: Array<CADefinition>;
|
|
65
|
+
/**
|
|
66
|
+
* Deprecated alias for `additionalTrustedCAs`
|
|
67
|
+
*
|
|
68
|
+
* @deprecated
|
|
69
|
+
*/
|
|
70
|
+
trustAdditionalCAs?: Array<CADefinition>;
|
|
71
|
+
/**
|
|
72
|
+
* A mapping of hosts to client certificates to use, in the form of
|
|
73
|
+
* `{ key, cert }` objects (none, by default)
|
|
74
|
+
*/
|
|
75
|
+
clientCertificateHostMap?: {
|
|
76
|
+
[host: string]: {
|
|
77
|
+
pfx: Buffer;
|
|
78
|
+
passphrase?: string;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Upstream proxy configuration: pass through requests via this proxy.
|
|
83
|
+
*
|
|
84
|
+
* If this is undefined, no proxy will be used. To configure a proxy
|
|
85
|
+
* provide either:
|
|
86
|
+
* - a ProxySettings object
|
|
87
|
+
* - a callback which will be called with an object containing the
|
|
88
|
+
* hostname, and must return a ProxySettings object or undefined.
|
|
89
|
+
* - an array of ProxySettings or callbacks. The array will be
|
|
90
|
+
* processed in order, and the first not-undefined ProxySettings
|
|
91
|
+
* found will be used.
|
|
92
|
+
*
|
|
93
|
+
* When using a remote client, this parameter or individual array
|
|
94
|
+
* values may be passed by reference, using the name of a rule
|
|
95
|
+
* parameter configured in the admin server.
|
|
96
|
+
*/
|
|
97
|
+
proxyConfig?: ProxyConfig;
|
|
98
|
+
/**
|
|
99
|
+
* Custom DNS options, to allow configuration of the resolver used
|
|
100
|
+
* when forwarding requests upstream. Passing any option switches
|
|
101
|
+
* from using node's default dns.lookup function to using the
|
|
102
|
+
* cacheable-lookup module, which will cache responses.
|
|
103
|
+
*/
|
|
104
|
+
lookupOptions?: PassThroughLookupOptions;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=passthrough-handling-definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passthrough-handling-definitions.d.ts","sourceRoot":"","sources":["../../src/rules/passthrough-handling-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,MAAM,CAAC;IAEnB,gBAAgB,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAA;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAClB;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3B;;;GAGG;AACH,MAAM,WAAW,mCAAmC;IAChD;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAE/B;;;;;;;;OAQG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3C;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAEzC;;;OAGG;IACH,wBAAwB,CAAC,EAAE;QACvB,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACvD,CAAC;IAEF;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,wBAAwB,CAAC;CAC5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passthrough-handling-definitions.js","sourceRoot":"","sources":["../../src/rules/passthrough-handling-definitions.ts"],"names":[],"mappings":""}
|