UNPKG

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
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); }