You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
730 B
40 lines
730 B
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 }; |
|
}
|
|
|