allproxy
Version:
AllProxy: MITM HTTP Debugging Tool.
97 lines • 3.79 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Message_1 = require("../../../common/Message");
const HexFormatter_1 = __importDefault(require("./HexFormatter"));
const MongoOpCode_1 = __importDefault(require("./MongoOpCode"));
class SqlFormatter {
constructor(reqBuf, rspBuf) {
this.formattedRequest = this._formatRequest(reqBuf);
this.formattedResponse = rspBuf ? this._formatResponse(rspBuf) : Message_1.NO_RESPONSE;
this.command = 'Request unknown';
}
getCommand() { return this.command; }
/**
* Get formatted request
*/
getRequest() { return this.formattedRequest; }
/**
* Get formatted response
*/
getResponse() { return this.formattedResponse; }
_formatRequest(buf) {
const packet = new MongoPacket(buf);
const opCode = packet.getOpCode();
const requestID = packet.getRequestID();
const details = packet.getDetails();
return opCode + ' id=' + requestID + ' ' + details + '\n' + HexFormatter_1.default.format(buf) + '\n';
}
_formatResponse(buf) {
const packet = new MongoPacket(buf);
const flags = packet.getResponseFlags();
const numberReturned = packet.getNumberReturned();
return `\nflags=${flags} documents=${numberReturned}\n\n${HexFormatter_1.default.format(buf)}\n`;
}
}
exports.default = SqlFormatter;
// Keep track of Mongo packets
class MongoPacket {
constructor(buf) {
this.responseFlags = '';
this.numberReturned = 0;
this.buf = buf;
this.offset = 0;
this.messageLength = buf.readInt32LE(0);
this.requestID = buf.readInt32LE(4);
this.responseTo = buf.readInt32LE(8);
this.opCode = MongoOpCode_1.default.toString(buf.readInt32LE(12));
this.details = '';
switch (this.opCode) {
case MongoOpCode_1.default.OP_UPDATE:
case MongoOpCode_1.default.OP_INSERT:
case MongoOpCode_1.default.OP_QUERY:
case MongoOpCode_1.default.OP_GET_MORE:
case MongoOpCode_1.default.OP_DELETE:
this.details = cstring(20); // fullCollectionName
break;
case MongoOpCode_1.default.OP_REPLAY: {
this.responseFlags = 'none';
const flags = buf.readInt32LE(16);
switch (flags) {
case 0:
this.responseFlags = 'CursorNotFound';
break;
case 1:
this.responseFlags = 'QueryFailure';
break;
case 2:
this.responseFlags = 'ShardConfigState';
break;
case 3:
this.responseFlags = 'AwaitCapable';
break;
}
this.numberReturned = buf.readInt32LE(32);
break;
}
}
function cstring(start) {
let end = start;
for (; buf.readUInt8(end) !== 0; ++end)
;
const str = buf.toString('utf8', start, end);
return str;
}
}
getOffset() { return this.offset; }
getMessageLength() { return this.messageLength; }
getRequestID() { return this.requestID; }
getResponseTo() { return this.requestID; }
getOpCode() { return this.opCode; }
getDetails() { return this.details; }
getResponseFlags() { return this.responseFlags; }
getNumberReturned() { return this.numberReturned; }
}
//# sourceMappingURL=MongoFormatter.js.map