rjweb-server
Version:
Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS
43 lines (42 loc) • 1.54 kB
JavaScript
import ValueCollection from "../classes/ValueCollection";
import { as } from "@rjweb/utils";
export 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);
};
/**
* Efficiently parse Key-Value Strings into ValueCollections
* @since 7.0.0
*/ export default function parseKV(type, keyValue, equal = '=', splitter = '&', decode = decodeURIComponent) {
const values = type === 'ValueCollection' ? new ValueCollection() : {};
if (!keyValue)
return 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')
as(values).set(trimString(keyValue.slice(progress, progress + equalPos)), decodedVal);
else
as(values)[trimString(keyValue.slice(progress, progress + equalPos))] = decodedVal;
progress = splitterPos + 1;
}
return as(values);
}