@requestly/requestly-proxy 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +5 -0
- package/dist/components/interfaces/logger-service.d.ts +4 -0
- package/dist/components/interfaces/logger-service.js +2 -0
- package/dist/components/interfaces/rules-data-source.d.ts +6 -0
- package/dist/components/interfaces/rules-data-source.js +2 -0
- package/dist/components/proxy-middleware/constants.d.ts +11 -0
- package/dist/components/proxy-middleware/constants.js +21 -0
- package/dist/components/proxy-middleware/helpers/ctx_rq_namespace.d.ts +35 -0
- package/dist/components/proxy-middleware/helpers/ctx_rq_namespace.js +96 -0
- package/dist/components/proxy-middleware/helpers/harObectCreator.d.ts +140 -0
- package/dist/components/proxy-middleware/helpers/harObectCreator.js +158 -0
- package/dist/components/proxy-middleware/helpers/http_helpers.d.ts +2 -0
- package/dist/components/proxy-middleware/helpers/http_helpers.js +47 -0
- package/dist/components/proxy-middleware/helpers/proxy_ctx_helper.d.ts +14 -0
- package/dist/components/proxy-middleware/helpers/proxy_ctx_helper.js +86 -0
- package/dist/components/proxy-middleware/helpers/response_helper.d.ts +3 -0
- package/dist/components/proxy-middleware/helpers/response_helper.js +17 -0
- package/dist/components/proxy-middleware/helpers/rule_processor_helper.d.ts +17 -0
- package/dist/components/proxy-middleware/helpers/rule_processor_helper.js +192 -0
- package/dist/components/proxy-middleware/index.d.ts +25 -0
- package/dist/components/proxy-middleware/index.js +257 -0
- package/dist/components/proxy-middleware/middlewares/amiusing_middleware.d.ts +6 -0
- package/dist/components/proxy-middleware/middlewares/amiusing_middleware.js +25 -0
- package/dist/components/proxy-middleware/middlewares/logger_middleware.d.ts +66 -0
- package/dist/components/proxy-middleware/middlewares/logger_middleware.js +89 -0
- package/dist/components/proxy-middleware/middlewares/rules_middleware.d.ts +40 -0
- package/dist/components/proxy-middleware/middlewares/rules_middleware.js +117 -0
- package/dist/components/proxy-middleware/middlewares/ssl_cert_middleware.d.ts +7 -0
- package/dist/components/proxy-middleware/middlewares/ssl_cert_middleware.js +33 -0
- package/dist/components/proxy-middleware/rule_action_processor/handle_mixed_response.d.ts +14 -0
- package/dist/components/proxy-middleware/rule_action_processor/handle_mixed_response.js +78 -0
- package/dist/components/proxy-middleware/rule_action_processor/index.d.ts +13 -0
- package/dist/components/proxy-middleware/rule_action_processor/index.js +101 -0
- package/dist/components/proxy-middleware/rule_action_processor/modified_requests_pool.d.ts +7 -0
- package/dist/components/proxy-middleware/rule_action_processor/modified_requests_pool.js +34 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/block_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/block_processor.js +21 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/delay_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/delay_processor.js +29 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/insert_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/insert_processor.js +154 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_header_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_header_processor.js +69 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_request_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_request_processor.js +89 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_response_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_response_processor.js +109 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_user_agent_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/modify_user_agent_processor.js +25 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/redirect_processor.d.ts +6 -0
- package/dist/components/proxy-middleware/rule_action_processor/processors/redirect_processor.js +58 -0
- package/dist/components/proxy-middleware/rule_action_processor/utils.d.ts +11 -0
- package/dist/components/proxy-middleware/rule_action_processor/utils.js +33 -0
- package/dist/components/ssl-proxying/ssl-proxying-manager.d.ts +3 -0
- package/dist/components/ssl-proxying/ssl-proxying-manager.js +6 -0
- package/dist/constants/cert.d.ts +7 -0
- package/dist/constants/cert.js +13 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +11 -0
- package/dist/lib/proxy/bin/mitm-proxy.d.ts +2 -0
- package/dist/lib/proxy/bin/mitm-proxy.js +30 -0
- package/dist/lib/proxy/custom/utils/checkInvalidHeaderChar.d.ts +8 -0
- package/dist/lib/proxy/custom/utils/checkInvalidHeaderChar.js +14 -0
- package/dist/lib/proxy/index.d.ts +2 -0
- package/dist/lib/proxy/index.js +2 -0
- package/dist/lib/proxy/lib/ca.d.ts +8 -0
- package/dist/lib/proxy/lib/ca.js +277 -0
- package/dist/lib/proxy/lib/middleware/gunzip.d.ts +2 -0
- package/dist/lib/proxy/lib/middleware/gunzip.js +17 -0
- package/dist/lib/proxy/lib/middleware/wildcard.d.ts +1 -0
- package/dist/lib/proxy/lib/middleware/wildcard.js +20 -0
- package/dist/lib/proxy/lib/proxy.d.ts +36 -0
- package/dist/lib/proxy/lib/proxy.js +1217 -0
- package/dist/rq-proxy-provider.d.ts +10 -0
- package/dist/rq-proxy-provider.js +20 -0
- package/dist/rq-proxy.d.ts +15 -0
- package/dist/rq-proxy.js +53 -0
- package/dist/test.d.ts +1 -0
- package/dist/test.js +111 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/circularQueue.d.ts +2 -0
- package/dist/utils/circularQueue.js +31 -0
- package/dist/utils/helpers/rules-helper.d.ts +11 -0
- package/dist/utils/helpers/rules-helper.js +59 -0
- package/dist/utils/index.d.ts +0 -0
- package/dist/utils/index.js +0 -0
- package/package.json +43 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHarResponse = exports.createHarRequest = exports.createHarEntry = exports.createHar = exports.createRequestHarObject = void 0;
|
|
4
|
+
const createHarHeaders = (request_headers_obj) => {
|
|
5
|
+
// convert headers obj to haar format
|
|
6
|
+
const headers = [];
|
|
7
|
+
if (request_headers_obj) {
|
|
8
|
+
for (const key in request_headers_obj) {
|
|
9
|
+
headers.push({
|
|
10
|
+
name: key,
|
|
11
|
+
value: request_headers_obj[key],
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return headers;
|
|
16
|
+
};
|
|
17
|
+
const createHarQueryStrings = (path) => {
|
|
18
|
+
// TODO -> http://www.softwareishard.com/blog/har-12-spec/#queryString
|
|
19
|
+
return [];
|
|
20
|
+
};
|
|
21
|
+
const getContentType = (headers) => {
|
|
22
|
+
let contentType = null;
|
|
23
|
+
if (headers) {
|
|
24
|
+
headers.forEach((item) => {
|
|
25
|
+
if (item.name === "content-type") {
|
|
26
|
+
contentType = item.value;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return contentType;
|
|
31
|
+
};
|
|
32
|
+
const buildHarPostParams = (contentType, body) => {
|
|
33
|
+
if (contentType === "application/x-www-form-urlencoded") {
|
|
34
|
+
return body
|
|
35
|
+
.split("&") // Split by separators
|
|
36
|
+
.map((keyValue) => {
|
|
37
|
+
const [key, value] = keyValue.split("=");
|
|
38
|
+
return {
|
|
39
|
+
name: key,
|
|
40
|
+
value,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// FormData has its own format
|
|
46
|
+
// TODO Complete form data case -> where file is uploaded
|
|
47
|
+
return {
|
|
48
|
+
name: contentType,
|
|
49
|
+
value: body,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const createHarPostData = (body, headers) => {
|
|
54
|
+
// http://www.softwareishard.com/blog/har-12-spec/#postData
|
|
55
|
+
if (!body) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const contentType = getContentType(headers);
|
|
59
|
+
// if (!contentType) {
|
|
60
|
+
// return undefined;
|
|
61
|
+
// }
|
|
62
|
+
// // console.log("contentType and Body", { contentType, body }, typeof body);
|
|
63
|
+
// if (
|
|
64
|
+
// ["application/x-www-form-urlencoded", "multipart/form-data"].includes(
|
|
65
|
+
// contentType
|
|
66
|
+
// )
|
|
67
|
+
// ) {
|
|
68
|
+
// return {
|
|
69
|
+
// mimeType: contentType,
|
|
70
|
+
// params: buildHarPostParams(contentType, body),
|
|
71
|
+
// };
|
|
72
|
+
// }
|
|
73
|
+
return {
|
|
74
|
+
mimeType: contentType,
|
|
75
|
+
text: body,
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
// create standard request har object: http://www.softwareishard.com/blog/har-12-spec/#request
|
|
79
|
+
// URL: https://github.com/hoppscotch/hoppscotch/blob/75ab7fdb00c0129ad42d45165bd3ad0af1faca2e/packages/hoppscotch-app/helpers/new-codegen/har.ts#L26
|
|
80
|
+
const createRequestHarObject = (requestHarObject, proxyToServerRequestOptions) => {
|
|
81
|
+
const { method, host, path, body, headers, agent, } = proxyToServerRequestOptions;
|
|
82
|
+
return {
|
|
83
|
+
bodySize: -1,
|
|
84
|
+
headersSize: -1,
|
|
85
|
+
httpVersion: "HTTP/1.1",
|
|
86
|
+
cookies: [],
|
|
87
|
+
headers: requestHarObject.headers || createHarHeaders(headers),
|
|
88
|
+
method: requestHarObject.method || method,
|
|
89
|
+
queryString: requestHarObject.queryString || createHarQueryStrings(path),
|
|
90
|
+
url: requestHarObject.url || ((agent === null || agent === void 0 ? void 0 : agent.protocol) || "http:") + "//" + host + path,
|
|
91
|
+
postData: requestHarObject.postData ||
|
|
92
|
+
createHarPostData(body, requestHarObject.headers),
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
exports.createRequestHarObject = createRequestHarObject;
|
|
96
|
+
const createHar = (requestHeaders, method, protocol, host, path, requestBody, responseStatusCode, response, responseHeaders) => {
|
|
97
|
+
return {
|
|
98
|
+
"log": {
|
|
99
|
+
"version": "1.2",
|
|
100
|
+
"creator": {},
|
|
101
|
+
"browser": {},
|
|
102
|
+
"pages": [],
|
|
103
|
+
"entries": [(0, exports.createHarEntry)(requestHeaders, method, protocol, host, path, requestBody, responseStatusCode, response, responseHeaders)],
|
|
104
|
+
"comment": ""
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
exports.createHar = createHar;
|
|
109
|
+
const createHarEntry = (requestHeaders, method, protocol, host, path, requestBody, responseStatusCode, response, responseHeaders) => {
|
|
110
|
+
return {
|
|
111
|
+
// "pageref": "page_0",
|
|
112
|
+
"startedDateTime": new Date().toISOString(),
|
|
113
|
+
// "time": 50,
|
|
114
|
+
"request": (0, exports.createHarRequest)(requestHeaders, method, protocol, host, path, requestBody),
|
|
115
|
+
"response": (0, exports.createHarResponse)(responseStatusCode, response, responseHeaders),
|
|
116
|
+
"cache": {},
|
|
117
|
+
"timings": {},
|
|
118
|
+
// "serverIPAddress": "10.0.0.1",
|
|
119
|
+
// "connection": "52492",
|
|
120
|
+
"comment": ""
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
exports.createHarEntry = createHarEntry;
|
|
124
|
+
const createHarRequest = (requestHeaders, method, protocol, host, path, requestBody) => {
|
|
125
|
+
return {
|
|
126
|
+
bodySize: -1,
|
|
127
|
+
headersSize: -1,
|
|
128
|
+
httpVersion: "HTTP/1.1",
|
|
129
|
+
cookies: [],
|
|
130
|
+
headers: createHarHeaders(requestHeaders),
|
|
131
|
+
method: method,
|
|
132
|
+
queryString: createHarQueryStrings(path),
|
|
133
|
+
url: protocol + "://" + host + path,
|
|
134
|
+
postData: createHarPostData(requestBody, createHarHeaders(requestHeaders)),
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
exports.createHarRequest = createHarRequest;
|
|
138
|
+
const createHarResponse = (responseStatusCode, response, responseHeaders) => {
|
|
139
|
+
return {
|
|
140
|
+
"status": responseStatusCode,
|
|
141
|
+
// "statusText": "OK",
|
|
142
|
+
"httpVersion": "HTTP/1.1",
|
|
143
|
+
"cookies": [],
|
|
144
|
+
"headers": createHarHeaders(responseHeaders),
|
|
145
|
+
"content": {
|
|
146
|
+
"size": 33,
|
|
147
|
+
"compression": 0,
|
|
148
|
+
"mimeType": (responseHeaders && responseHeaders["content-type"]),
|
|
149
|
+
"text": response,
|
|
150
|
+
"comment": ""
|
|
151
|
+
},
|
|
152
|
+
// "redirectURL": "",
|
|
153
|
+
"headersSize": -1,
|
|
154
|
+
"bodySize": -1,
|
|
155
|
+
"comment": ""
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
exports.createHarResponse = createHarResponse;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getContentType = exports.bodyParser = void 0;
|
|
7
|
+
const charset_1 = __importDefault(require("charset"));
|
|
8
|
+
const mime_types_1 = __importDefault(require("mime-types"));
|
|
9
|
+
const bodyParser = (contentTypeHeader, buffer) => {
|
|
10
|
+
let inherentEncoding = (0, charset_1.default)(contentTypeHeader) || mime_types_1.default.charset(contentTypeHeader);
|
|
11
|
+
let str_buffer = null;
|
|
12
|
+
const isEncodingValid = (givenEncoding) => givenEncoding && Buffer.isEncoding(givenEncoding);
|
|
13
|
+
const setBufferString = (givenEncoding) => (str_buffer = buffer.toString(givenEncoding));
|
|
14
|
+
if (isEncodingValid(inherentEncoding)) {
|
|
15
|
+
setBufferString(inherentEncoding);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const mostCommonEncodings = [
|
|
19
|
+
"utf8",
|
|
20
|
+
"utf16le",
|
|
21
|
+
"ascii",
|
|
22
|
+
"ucs2",
|
|
23
|
+
"base64",
|
|
24
|
+
"latin1",
|
|
25
|
+
"binary",
|
|
26
|
+
"hex",
|
|
27
|
+
];
|
|
28
|
+
mostCommonEncodings.every((newPossibleEncoding) => {
|
|
29
|
+
if (isEncodingValid(newPossibleEncoding)) {
|
|
30
|
+
setBufferString(newPossibleEncoding);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return str_buffer;
|
|
36
|
+
};
|
|
37
|
+
exports.bodyParser = bodyParser;
|
|
38
|
+
const getContentType = (contentTypeHeader) => {
|
|
39
|
+
if (!contentTypeHeader) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
let contentType = null;
|
|
43
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
|
|
44
|
+
contentType = contentTypeHeader.split(";")[0];
|
|
45
|
+
return contentType;
|
|
46
|
+
};
|
|
47
|
+
exports.getContentType = getContentType;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function get_request_url(ctx: any): string;
|
|
2
|
+
export function get_original_request_headers(ctx: any): any;
|
|
3
|
+
export function get_original_response_headers(ctx: any): any;
|
|
4
|
+
export function is_request_preflight(ctx: any): boolean;
|
|
5
|
+
export function get_response_options(ctx: any): {
|
|
6
|
+
status_code: any;
|
|
7
|
+
headers: any;
|
|
8
|
+
};
|
|
9
|
+
export function get_request_options(ctx: any): any;
|
|
10
|
+
export function getRequestHeaders(ctx: any): any;
|
|
11
|
+
export function getRequestContentTypeHeader(ctx: any): any;
|
|
12
|
+
export function getResponseHeaders(ctx: any): any;
|
|
13
|
+
export function getResponseContentTypeHeader(ctx: any): any;
|
|
14
|
+
export function getResponseStatusCode(ctx: any): any;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// TODO: Removing this for now
|
|
3
|
+
// import {
|
|
4
|
+
// extractUrlComponent,
|
|
5
|
+
// getQueryParamsMap,
|
|
6
|
+
// } from "../../../../../../../common/components/utils/utils";
|
|
7
|
+
// const CONSTANTS = require("../../../../../../../common/constants");
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getResponseStatusCode = exports.getResponseContentTypeHeader = exports.getResponseHeaders = exports.getRequestContentTypeHeader = exports.getRequestHeaders = exports.get_request_options = exports.get_response_options = exports.is_request_preflight = exports.get_original_response_headers = exports.get_original_request_headers = exports.get_request_url = void 0;
|
|
10
|
+
const get_request_url = (ctx) => {
|
|
11
|
+
return ((ctx.isSSL ? "https://" : "http://") +
|
|
12
|
+
ctx.clientToProxyRequest.headers.host +
|
|
13
|
+
ctx.clientToProxyRequest.url);
|
|
14
|
+
};
|
|
15
|
+
exports.get_request_url = get_request_url;
|
|
16
|
+
const get_original_request_headers = (ctx) => {
|
|
17
|
+
// TODO: This needs to be fetched from ctx.clientToProxy headers
|
|
18
|
+
return ctx.proxyToServerRequestOptions.headers;
|
|
19
|
+
};
|
|
20
|
+
exports.get_original_request_headers = get_original_request_headers;
|
|
21
|
+
const get_original_response_headers = (ctx) => {
|
|
22
|
+
// TODO: This needs to be fetched from ctx.clientToProxy headers
|
|
23
|
+
return ctx.serverToProxyResponse.headers;
|
|
24
|
+
};
|
|
25
|
+
exports.get_original_response_headers = get_original_response_headers;
|
|
26
|
+
const is_request_preflight = (ctx) => {
|
|
27
|
+
if (
|
|
28
|
+
// Request method is OPTIONS
|
|
29
|
+
ctx.clientToProxyRequest.method.toLowerCase() === "options" &&
|
|
30
|
+
// Has "origin" or "Origin" or "ORIGIN" header
|
|
31
|
+
(ctx.clientToProxyRequest.headers["Origin"] ||
|
|
32
|
+
ctx.clientToProxyRequest.headers["origin"] ||
|
|
33
|
+
ctx.clientToProxyRequest.headers["ORIGIN"]) &&
|
|
34
|
+
// Has Access-Control-Request-Method header
|
|
35
|
+
(ctx.clientToProxyRequest.headers["Access-Control-Request-Method"] ||
|
|
36
|
+
ctx.clientToProxyRequest.headers["access-control-request-method"] ||
|
|
37
|
+
ctx.clientToProxyRequest.headers["ACCESS-CONTROL-REQUEST-METHOD"]))
|
|
38
|
+
return true;
|
|
39
|
+
else
|
|
40
|
+
return false;
|
|
41
|
+
};
|
|
42
|
+
exports.is_request_preflight = is_request_preflight;
|
|
43
|
+
const get_response_options = (ctx) => {
|
|
44
|
+
const options = {};
|
|
45
|
+
options.status_code = ctx.serverToProxyResponse.statusCode;
|
|
46
|
+
options.headers = ctx.serverToProxyResponse.headers;
|
|
47
|
+
return options;
|
|
48
|
+
};
|
|
49
|
+
exports.get_response_options = get_response_options;
|
|
50
|
+
const get_request_options = (ctx) => {
|
|
51
|
+
return Object.assign({}, ctx.proxyToServerRequestOptions);
|
|
52
|
+
};
|
|
53
|
+
exports.get_request_options = get_request_options;
|
|
54
|
+
// export const get_json_query_params = (ctx) => {
|
|
55
|
+
// const url = get_request_url(ctx);
|
|
56
|
+
// let queryString = extractUrlComponent(url, CONSTANTS.URL_COMPONENTS.QUERY);
|
|
57
|
+
// return getQueryParamsMap(queryString) || null;
|
|
58
|
+
// };
|
|
59
|
+
const getRequestHeaders = (ctx) => {
|
|
60
|
+
if (ctx && ctx.proxyToServerRequestOptions) {
|
|
61
|
+
return ctx.proxyToServerRequestOptions.headers || {};
|
|
62
|
+
}
|
|
63
|
+
return {};
|
|
64
|
+
};
|
|
65
|
+
exports.getRequestHeaders = getRequestHeaders;
|
|
66
|
+
const getRequestContentTypeHeader = (ctx) => {
|
|
67
|
+
return (0, exports.getRequestHeaders)(ctx)["content-type"];
|
|
68
|
+
};
|
|
69
|
+
exports.getRequestContentTypeHeader = getRequestContentTypeHeader;
|
|
70
|
+
const getResponseHeaders = (ctx) => {
|
|
71
|
+
if (ctx && ctx.serverToProxyResponse) {
|
|
72
|
+
return ctx.serverToProxyResponse.headers || {};
|
|
73
|
+
}
|
|
74
|
+
return {};
|
|
75
|
+
};
|
|
76
|
+
exports.getResponseHeaders = getResponseHeaders;
|
|
77
|
+
const getResponseContentTypeHeader = (ctx) => {
|
|
78
|
+
return (0, exports.getResponseHeaders)(ctx)["content-type"];
|
|
79
|
+
};
|
|
80
|
+
exports.getResponseContentTypeHeader = getResponseContentTypeHeader;
|
|
81
|
+
const getResponseStatusCode = (ctx) => {
|
|
82
|
+
if (ctx && ctx.serverToProxyResponse) {
|
|
83
|
+
return ctx.serverToProxyResponse.statusCode;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
exports.getResponseStatusCode = getResponseStatusCode;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDOMToString = exports.parseStringToDOM = exports.isResponseHTML = void 0;
|
|
4
|
+
const isResponseHTML = (ctx) => {
|
|
5
|
+
return (ctx.serverToProxyResponse.headers["content-type"] &&
|
|
6
|
+
ctx.serverToProxyResponse.headers["content-type"].indexOf("text/html") === 0);
|
|
7
|
+
};
|
|
8
|
+
exports.isResponseHTML = isResponseHTML;
|
|
9
|
+
const parseStringToDOM = (string) => {
|
|
10
|
+
return new DOMParser().parseFromString(string, "text/html");
|
|
11
|
+
};
|
|
12
|
+
exports.parseStringToDOM = parseStringToDOM;
|
|
13
|
+
const parseDOMToString = (DOM) => {
|
|
14
|
+
return DOM.documentElement.outerHTML;
|
|
15
|
+
// return new XMLSerializer().serializeToString(DOM);
|
|
16
|
+
};
|
|
17
|
+
exports.parseDOMToString = parseDOMToString;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default RuleProcessorHelper;
|
|
2
|
+
declare class RuleProcessorHelper {
|
|
3
|
+
constructor(request_data?: any, response_data?: any);
|
|
4
|
+
request_data: any;
|
|
5
|
+
response_data: any;
|
|
6
|
+
init_request_data: (request_data: any) => void;
|
|
7
|
+
init_response_data: (response_data: any) => void;
|
|
8
|
+
process_rules: (rules: any, is_response?: boolean) => any;
|
|
9
|
+
process_rule: (rule: any, is_response?: boolean) => any;
|
|
10
|
+
add_rule_details_to_action: (rule_action: any, rule: any) => any;
|
|
11
|
+
process_url_modification_rule: (rule_processor: any, rule: any) => any;
|
|
12
|
+
process_request_modification_rule: (rule_processor: any, rule: any) => any;
|
|
13
|
+
process_response_modification_rule: (rule_processor: any, rule: any) => any;
|
|
14
|
+
process_request_headers_modification_rule: (rule_processor: any, rule: any) => any;
|
|
15
|
+
process_response_headers_modification_rule: (rule_processor: any, rule: any) => any;
|
|
16
|
+
process_user_agent_modification_rule: (rule_processor: any, rule: any) => any;
|
|
17
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const requestly_core_1 = require("@requestly/requestly-core");
|
|
4
|
+
const requestly_core_2 = require("@requestly/requestly-core");
|
|
5
|
+
class RuleProcessorHelper {
|
|
6
|
+
constructor(request_data = null, response_data = null) {
|
|
7
|
+
this.init_request_data = (request_data) => {
|
|
8
|
+
this.request_data = request_data;
|
|
9
|
+
};
|
|
10
|
+
this.init_response_data = (response_data) => {
|
|
11
|
+
this.response_data = response_data;
|
|
12
|
+
};
|
|
13
|
+
this.process_rules = (rules, is_response = false) => {
|
|
14
|
+
const rule_actions = rules.map((rule) => {
|
|
15
|
+
let rule_action = this.process_rule(rule, is_response);
|
|
16
|
+
return rule_action;
|
|
17
|
+
});
|
|
18
|
+
return rule_actions;
|
|
19
|
+
};
|
|
20
|
+
// Dont pass ctx here. Pass only readonly params from middleware
|
|
21
|
+
this.process_rule = (rule, is_response = false) => {
|
|
22
|
+
const rule_processor = requestly_core_1.RULE_PROCESSOR.getInstance(rule.ruleType);
|
|
23
|
+
let rule_action;
|
|
24
|
+
switch (rule.ruleType) {
|
|
25
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.REDIRECT:
|
|
26
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.REPLACE:
|
|
27
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.CANCEL:
|
|
28
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.QUERYPARAM:
|
|
29
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.SCRIPT:
|
|
30
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.DELAY:
|
|
31
|
+
rule_action = this.process_url_modification_rule(rule_processor, rule);
|
|
32
|
+
break;
|
|
33
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.REQUEST:
|
|
34
|
+
rule_action = this.process_request_modification_rule(rule_processor, rule);
|
|
35
|
+
break;
|
|
36
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.RESPONSE:
|
|
37
|
+
rule_action = this.process_response_modification_rule(rule_processor, rule);
|
|
38
|
+
break;
|
|
39
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.HEADERS:
|
|
40
|
+
if (is_response) {
|
|
41
|
+
rule_action = this.process_response_headers_modification_rule(rule_processor, rule);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
rule_action = this.process_request_headers_modification_rule(rule_processor, rule);
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
case requestly_core_2.CONSTANTS.RULE_TYPES.USERAGENT:
|
|
48
|
+
rule_action = this.process_user_agent_modification_rule(rule_processor, rule);
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
rule_action = this.add_rule_details_to_action(rule_action, rule);
|
|
54
|
+
return rule_action;
|
|
55
|
+
};
|
|
56
|
+
this.add_rule_details_to_action = (rule_action, rule) => {
|
|
57
|
+
if (rule_action) {
|
|
58
|
+
rule_action["rule_id"] = rule.id;
|
|
59
|
+
rule_action["rule_type"] = rule.ruleType;
|
|
60
|
+
}
|
|
61
|
+
return rule_action;
|
|
62
|
+
};
|
|
63
|
+
this.process_url_modification_rule = (rule_processor, rule) => {
|
|
64
|
+
const rule_action = rule_processor.process({
|
|
65
|
+
rule,
|
|
66
|
+
requestURL: this.request_data.request_url,
|
|
67
|
+
});
|
|
68
|
+
return rule_action;
|
|
69
|
+
};
|
|
70
|
+
this.process_request_modification_rule = (rule_processor, rule) => {
|
|
71
|
+
let requestData = {};
|
|
72
|
+
if (this.request_data.method == "POST") {
|
|
73
|
+
requestData = this.request_data.request_body;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
requestData = this.request_data.query_params;
|
|
77
|
+
}
|
|
78
|
+
const rule_action = rule_processor.process({
|
|
79
|
+
rule,
|
|
80
|
+
requestURL: this.request_data.request_url,
|
|
81
|
+
details: { requestData },
|
|
82
|
+
});
|
|
83
|
+
return rule_action;
|
|
84
|
+
};
|
|
85
|
+
this.process_response_modification_rule = (rule_processor, rule) => {
|
|
86
|
+
let requestData = {};
|
|
87
|
+
if (this.request_data.method == "POST") {
|
|
88
|
+
requestData = this.request_data.request_body;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
requestData = this.request_data.query_params;
|
|
92
|
+
}
|
|
93
|
+
const rule_action = rule_processor.process({
|
|
94
|
+
rule,
|
|
95
|
+
requestURL: this.request_data.request_url,
|
|
96
|
+
details: { requestData },
|
|
97
|
+
});
|
|
98
|
+
return rule_action;
|
|
99
|
+
};
|
|
100
|
+
this.process_request_headers_modification_rule = (rule_processor, rule) => {
|
|
101
|
+
// {"header1":"val1", "header2":"val2"}
|
|
102
|
+
const originalRequestHeadersObject = this.request_data.request_headers;
|
|
103
|
+
// ["header1","header2"]
|
|
104
|
+
const originalRequestHeadersObjectKeys = Object.keys(originalRequestHeadersObject);
|
|
105
|
+
// [{name:"header1", value:"val1"},{name:"header2", value:"val2"}]
|
|
106
|
+
const originalRequestHeadersObjectKeysValuePairs = originalRequestHeadersObjectKeys.map((key) => {
|
|
107
|
+
return {
|
|
108
|
+
name: key,
|
|
109
|
+
value: originalRequestHeadersObject[key],
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
const getRequestOrigin = () => {
|
|
113
|
+
if (originalRequestHeadersObject["Origin"])
|
|
114
|
+
return originalRequestHeadersObject["Origin"];
|
|
115
|
+
if (originalRequestHeadersObject["origin"])
|
|
116
|
+
return originalRequestHeadersObject["origin"];
|
|
117
|
+
if (originalRequestHeadersObject["ORIGIN"])
|
|
118
|
+
return originalRequestHeadersObject["ORIGIN"];
|
|
119
|
+
return "*";
|
|
120
|
+
};
|
|
121
|
+
// This would return only Request headers after processing
|
|
122
|
+
const rule_action = rule_processor.process({
|
|
123
|
+
requestURL: this.request_data.request_url,
|
|
124
|
+
rule,
|
|
125
|
+
originalHeaders: originalRequestHeadersObjectKeysValuePairs,
|
|
126
|
+
typeOfHeaders: requestly_core_2.CONSTANTS.HEADERS_TARGET.REQUEST,
|
|
127
|
+
payload: {
|
|
128
|
+
requestOrigin: getRequestOrigin(),
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
return rule_action;
|
|
132
|
+
};
|
|
133
|
+
this.process_response_headers_modification_rule = (rule_processor, rule) => {
|
|
134
|
+
// {"header1":"val1", "header2":"val2"}
|
|
135
|
+
const originalResponseHeadersObject = this.response_data.response_headers;
|
|
136
|
+
// ["header1","header2"]
|
|
137
|
+
const originalResponseHeadersObjectKeys = Object.keys(originalResponseHeadersObject);
|
|
138
|
+
// [{name:"header1", value:"val1"},{name:"header2", value:"val2"}]
|
|
139
|
+
const originalResponseHeadersObjectKeysValuePairs = originalResponseHeadersObjectKeys.map((key) => {
|
|
140
|
+
return {
|
|
141
|
+
name: key,
|
|
142
|
+
value: originalResponseHeadersObject[key],
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
const getRequestOrigin = () => {
|
|
146
|
+
// array [{ name: header_name,value: header_val }] -> {headerName1:"value1",headerName2 :"value2"}
|
|
147
|
+
const originalRequestHeadersConvertedObject = this.request_data.request_headers;
|
|
148
|
+
if (originalRequestHeadersConvertedObject["Origin"])
|
|
149
|
+
return originalRequestHeadersConvertedObject["Origin"];
|
|
150
|
+
if (originalRequestHeadersConvertedObject["origin"])
|
|
151
|
+
return originalRequestHeadersConvertedObject["origin"];
|
|
152
|
+
if (originalRequestHeadersConvertedObject["ORIGIN"])
|
|
153
|
+
return originalRequestHeadersConvertedObject["ORIGIN"];
|
|
154
|
+
return "*";
|
|
155
|
+
};
|
|
156
|
+
// This would return only Request headers after processing
|
|
157
|
+
const rule_action = rule_processor.process({
|
|
158
|
+
requestURL: this.request_data.request_url,
|
|
159
|
+
rule,
|
|
160
|
+
originalHeaders: originalResponseHeadersObjectKeysValuePairs,
|
|
161
|
+
typeOfHeaders: requestly_core_2.CONSTANTS.HEADERS_TARGET.RESPONSE,
|
|
162
|
+
payload: {
|
|
163
|
+
requestOrigin: getRequestOrigin(),
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
return rule_action;
|
|
167
|
+
};
|
|
168
|
+
this.process_user_agent_modification_rule = (rule_processor, rule) => {
|
|
169
|
+
/** REQUEST HEADERS */
|
|
170
|
+
// {"header1":"val1", "header2":"val2"}
|
|
171
|
+
const originalRequestHeadersObject = this.request_data.request_headers;
|
|
172
|
+
// ["header1","header2"]
|
|
173
|
+
const originalRequestHeadersObjectKeys = Object.keys(originalRequestHeadersObject);
|
|
174
|
+
// [{name:"header1", value:"val1"},{name:"header2", value:"val2"}]
|
|
175
|
+
const originalRequestHeadersObjectKeysValuePairs = originalRequestHeadersObjectKeys.map((key) => {
|
|
176
|
+
return {
|
|
177
|
+
name: key,
|
|
178
|
+
value: originalRequestHeadersObject[key],
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
const rule_action = rule_processor.process({
|
|
182
|
+
requestURL: this.request_data.request_url,
|
|
183
|
+
rule,
|
|
184
|
+
originalRequestHeaders: originalRequestHeadersObjectKeysValuePairs,
|
|
185
|
+
});
|
|
186
|
+
return rule_action;
|
|
187
|
+
};
|
|
188
|
+
this.request_data = request_data || {};
|
|
189
|
+
this.response_data = response_data || {};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.default = RuleProcessorHelper;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export namespace MIDDLEWARE_TYPE {
|
|
2
|
+
const AMIUSING: string;
|
|
3
|
+
const RULES: string;
|
|
4
|
+
const LOGGER: string;
|
|
5
|
+
const SSL_CERT: string;
|
|
6
|
+
}
|
|
7
|
+
export default ProxyMiddlewareManager;
|
|
8
|
+
declare class ProxyMiddlewareManager {
|
|
9
|
+
constructor(proxy: any, proxyConfig: any, rulesHelper: any, loggerService: any, sslConfigFetcher: any);
|
|
10
|
+
config: {};
|
|
11
|
+
proxy: any;
|
|
12
|
+
proxyConfig: any;
|
|
13
|
+
rulesHelper: any;
|
|
14
|
+
loggerService: any;
|
|
15
|
+
sslConfigFetcher: any;
|
|
16
|
+
init_config: (config?: {}) => void;
|
|
17
|
+
init: (config?: {}) => void;
|
|
18
|
+
request_handler_idx: number;
|
|
19
|
+
init_request_handler: (fn: any, is_detachable?: boolean) => number;
|
|
20
|
+
init_amiusing_handler: () => void;
|
|
21
|
+
init_ssl_cert_handler: () => void;
|
|
22
|
+
init_main_handler: () => void;
|
|
23
|
+
init_ssl_tunneling_handler: () => void;
|
|
24
|
+
init_handlers: () => void;
|
|
25
|
+
}
|