rjweb-server
Version:
Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS
51 lines (50 loc) • 1.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.trimString = void 0;
const ValueCollection_1 = __importDefault(require("../classes/ValueCollection"));
const utils_1 = require("@rjweb/utils");
const trimString = (str) => {
let start = 0, end = str.length - 1;
while (start < end && str[start] === ' ') {
start++;
}
while (end > start && str[end] === ' ') {
end--;
}
return str.substring(start, end + 1);
};
exports.trimString = trimString;
/**
* Efficiently parse Key-Value Strings into ValueCollections
* @since 7.0.0
*/ function parseKV(type, keyValue, equal = '=', splitter = '&', decode = decodeURIComponent) {
const values = type === 'ValueCollection' ? new ValueCollection_1.default() : {};
if (!keyValue)
return (0, utils_1.as)(values);
let progress = 0;
while (progress < keyValue.length) {
let splitterPos = keyValue.indexOf(splitter, progress);
if (splitterPos === -1)
splitterPos = keyValue.length;
let equalPos = keyValue.slice(progress, splitterPos).indexOf(equal);
if (equalPos === -1)
equalPos = splitterPos;
let sliced = keyValue.slice(progress + equalPos + 1, splitterPos), decodedVal;
try {
decodedVal = decode(sliced);
}
catch {
decodedVal = sliced;
}
if (type === 'ValueCollection')
(0, utils_1.as)(values).set((0, exports.trimString)(keyValue.slice(progress, progress + equalPos)), decodedVal);
else
(0, utils_1.as)(values)[(0, exports.trimString)(keyValue.slice(progress, progress + equalPos))] = decodedVal;
progress = splitterPos + 1;
}
return (0, utils_1.as)(values);
}
exports.default = parseKV;