UNPKG

allproxy

Version:

AllProxy: MITM HTTP Debugging Tool.

133 lines 5.77 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const url_1 = __importDefault(require("url")); const HttpMessage_1 = __importDefault(require("./HttpMessage")); const ProxyConfig_1 = __importDefault(require("../../common/ProxyConfig")); const Global_1 = __importDefault(require("./Global")); const ConsoleLog_1 = __importDefault(require("./ConsoleLog")); const fetch = require('node-fetch'); const resend = (forwardProxy, method, url, message, body) => __awaiter(void 0, void 0, void 0, function* () { const headers = {}; const unsafeHeaders = [ 'host', 'connection', 'content-length', 'origin', 'referer', 'accept-encoding', 'cookie', 'sec-fetch-dest', 'proxy-connection' ]; for (const header in message.requestHeaders) { if (unsafeHeaders.indexOf(header) === -1) { headers[header] = message.requestHeaders[header]; } } headers.allproxy = 'resend'; // Header environment variable replacement: for (const key in headers) { const value = headers[key]; if (value.indexOf('$') !== -1 && value.length > 1) { const s = value.indexOf('$'); let e = value.substring(s).indexOf(' '); if (e === -1) { e = undefined; } const replaceVar = value.substring(s, e); let value2 = process.env[replaceVar.substring(1)]; if (value2 && value2.length > 0) { value2 = value.replace(replaceVar, value2); ConsoleLog_1.default.info(`Environment variable "${value}" is defined: Setting header "${key}" to "${value2}"`); headers[key] = value2; } } } // eslint-disable-next-line node/no-deprecated-api const reqUrl = url_1.default.parse(url); // URL environment variable replacement: if (url.indexOf('$')) { const path = reqUrl.pathname; if (path) { const tokens = path.split('/'); for (let i = 0; i < tokens.length; ++i) { if (tokens[i].startsWith('$') && tokens[i].length > 1) { const value = process.env[tokens[i].substring(1)]; if (value && value.length > 0) { ConsoleLog_1.default.info(`Environment variable "${tokens[i]}" is defined: Replaced with "${value}"`); url = url.replace('/' + tokens[i], '/' + value); } } } } } // ConsoleLog.info(`Resend ${method} ${url} \n${body} \n${headers}`) body = typeof body === 'string' && body.length === 0 ? undefined : body; let httpMessage; let clientHostName; if (forwardProxy) { clientHostName = yield Global_1.default.resolveIp(reqUrl.hostname); httpMessage = recordHttpRequest(); } if (body && body != null && typeof body === 'object') { body = JSON.stringify(body); } try { ConsoleLog_1.default.debug('resend', method, url, headers, body); const response = yield fetch(url, { method: method.toLowerCase(), headers, body: body === null ? undefined : body }); try { const data = yield response.json(); recordHttpResponse(response, data); } catch (e) { try { recordHttpResponse(response, ""); } catch (e) { httpMessage.emitMessageToBrowser(body, 520, {}, typeof e === 'string' ? { error: e } : e); } } } catch (e) { httpMessage.emitMessageToBrowser(body, 520, {}, typeof e === 'string' ? { error: e } : e); } function recordHttpRequest() { const proxyType = reqUrl.protocol ? 'forward' : 'reverse'; let proxyConfig = Global_1.default.socketIoManager.findProxyConfigMatchingURL('https:', clientHostName, reqUrl, proxyType); // Always proxy forward proxy requests if (proxyConfig === undefined) { proxyConfig = new ProxyConfig_1.default(); proxyConfig.path = reqUrl.pathname; proxyConfig.protocol = reqUrl.protocol; proxyConfig.hostname = reqUrl.hostname; proxyConfig.port = reqUrl.port === null ? reqUrl.protocol === 'http:' ? 80 : 443 : +reqUrl.port; } const sequenceNumber = Global_1.default.nextSequenceNumber(); const httpMessage = new HttpMessage_1.default(reqUrl.protocol, proxyConfig, sequenceNumber, clientHostName, method, url, headers); httpMessage.emitMessageToBrowser(body); return httpMessage; } function recordHttpResponse(response, data) { httpMessage.emitMessageToBrowser(body, response.status, response.headers, data); } }); exports.default = resend; //# sourceMappingURL=Resend.js.map