ufiber
Version:
Next-gen webserver for node-js developer
54 lines (52 loc) • 2.04 kB
JavaScript
import { tryDecode } from "./url.js";
//#region src/utils/query.ts
/** Decode percent & '+' safely */
const _decodeURI = (value) => {
if (!/[%+]/.test(value)) return value;
if (value.indexOf("+") !== -1) value = value.replace(/\+/g, " ");
return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent) : value;
};
function getQuery(url, key, multiple) {
let encoded;
if (!multiple && key && !/[%+]/.test(key)) {
let keyIndex$1 = url.indexOf("?", 8);
if (keyIndex$1 === -1) return;
if (!url.startsWith(key, keyIndex$1 + 1)) keyIndex$1 = url.indexOf(`&${key}`, keyIndex$1 + 1);
while (keyIndex$1 !== -1) {
const trailingKeyCode = url.charCodeAt(keyIndex$1 + key.length + 1);
if (trailingKeyCode === 61) {
const valueIndex = keyIndex$1 + key.length + 2;
const endIndex = url.indexOf("&", valueIndex);
return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));
} else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) return "";
keyIndex$1 = url.indexOf(`&${key}`, keyIndex$1 + 1);
}
encoded = /[%+]/.test(url);
if (!encoded) return;
}
const results = {};
encoded ??= /[%+]/.test(url);
let keyIndex = url.indexOf("?", 8);
while (keyIndex !== -1) {
const nextKeyIndex = url.indexOf("&", keyIndex + 1);
let valueIndex = url.indexOf("=", keyIndex);
if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) valueIndex = -1;
let name = url.slice(keyIndex + 1, valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex);
if (encoded) name = _decodeURI(name);
keyIndex = nextKeyIndex;
if (name === "") continue;
let value;
if (valueIndex === -1) value = "";
else {
value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);
if (encoded) value = _decodeURI(value);
}
if (multiple) {
if (!(results[name] && Array.isArray(results[name]))) results[name] = [];
results[name].push(value);
} else results[name] ??= value;
}
return key ? results[key] : results;
}
//#endregion
export { getQuery };