allproxy
Version:
AllProxy: MITM HTTP Debugging Tool.
112 lines • 5.12 kB
JavaScript
;
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 });
exports.decodeProtobuf = exports.getProtoNames = exports.parseProtoFiles = void 0;
const path_1 = __importDefault(require("path"));
const Paths_1 = __importDefault(require("./Paths"));
const fs_1 = __importDefault(require("fs"));
const protobufjs_1 = __importDefault(require("protobufjs"));
const ConsoleLog_1 = __importDefault(require("./ConsoleLog"));
const serviceFuncToFileNameMessageNames = new Map();
function parseProtoFiles() {
serviceFuncToFileNameMessageNames.clear();
let protoNames = [];
for (const protoFile of fs_1.default.readdirSync(Paths_1.default.protoDir())) {
if (!protoFile.endsWith('.proto'))
continue;
const lines = fs_1.default.readFileSync(path_1.default.join(Paths_1.default.protoDir(), protoFile)).toString().split('\n');
let foundService = false;
let packageName = '';
let service = '';
let func = '';
for (let line of lines) {
line = line.trim();
if (line.startsWith('package')) {
const end = line.indexOf(';');
packageName = line.substring(line.indexOf(' ') + 1, end === -1 ? undefined : end);
packageName = packageName.trim();
}
if (!foundService) {
if (line.startsWith('service '))
foundService = true;
const end = line.indexOf('{');
service = line.substring(line.indexOf(' ') + 1, end === -1 ? undefined : end);
service = service.trim();
}
else {
if (line === '}') {
foundService = false;
continue;
}
if (line.startsWith('rpc ')) {
protoNames = [];
protoNames.push(protoFile);
func = line.substring(line.indexOf(' ') + 1, line.indexOf('('));
func = func.trim();
let j = line.indexOf('(') + 1;
for (let i = j; i < line.length; ++i) {
const c = line.substring(i, i + 1);
if (c === ')') {
const messageName = line.substring(j, i);
protoNames.push(messageName);
if (protoNames.length === 3) {
const key = `/${packageName}.${service}/${func}`;
serviceFuncToFileNameMessageNames.set(key, protoNames);
ConsoleLog_1.default.info(key, protoNames);
break;
}
const k = line.substring(i).indexOf('(');
if (k === -1)
break;
i += k;
j = i + 1;
}
}
}
}
}
}
// Watch for new proto files
fs_1.default.watch(Paths_1.default.protoDir(), (_event) => {
parseProtoFiles();
});
}
exports.parseProtoFiles = parseProtoFiles;
// map Grpc URL path to request message name and response message name
function getProtoNames(urlPath) {
return serviceFuncToFileNameMessageNames.get(urlPath);
}
exports.getProtoNames = getProtoNames;
function decodeProtobuf(fileName, packageName, messageName, buffer) {
return __awaiter(this, void 0, void 0, function* () {
const root = yield protobufjs_1.default.load(path_1.default.join(Paths_1.default.protoDir(), fileName));
const protobufType = root.lookupType(`${packageName}.${messageName}`);
const message = buffer.subarray(5);
const err = protobufType.verify(message);
if (err) {
ConsoleLog_1.default.info(err);
return undefined;
}
try {
const decodedMessage = protobufType.decode(message);
return protobufType.toObject(decodedMessage);
}
catch (e) {
ConsoleLog_1.default.info(e);
return undefined;
}
});
}
exports.decodeProtobuf = decodeProtobuf;
//# sourceMappingURL=Protobuf.js.map