import * as qs from 'querystring'; | |
/** | |
* @typedef ParsedURL | |
* @type {import('.').ParsedURL} | |
*/ | |
/** | |
* @typedef Request | |
* @property {string} url | |
* @property {ParsedURL} _parsedUrl | |
*/ | |
/** | |
* @param {Request} req | |
* @returns {ParsedURL|void} | |
*/ | |
export function parse(req) { | |
let raw = req.url; | |
if (raw == null) return; | |
let prev = req._parsedUrl; | |
if (prev && prev.raw === raw) return prev; | |
let pathname=raw, search='', query; | |
if (raw.length > 1) { | |
let idx = raw.indexOf('?', 1); | |
if (idx !== -1) { | |
search = raw.substring(idx); | |
pathname = raw.substring(0, idx); | |
if (search.length > 1) { | |
query = qs.parse(search.substring(1)); | |
} | |
} | |
} | |
return req._parsedUrl = { pathname, search, query, raw }; | |
} | |