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.
42 lines
746 B
42 lines
746 B
const qs = require('querystring'); |
|
|
|
/** |
|
* @typedef ParsedURL |
|
* @type {import('.').ParsedURL} |
|
*/ |
|
|
|
/** |
|
* @typedef Request |
|
* @property {string} url |
|
* @property {ParsedURL} _parsedUrl |
|
*/ |
|
|
|
/** |
|
* @param {Request} req |
|
* @returns {ParsedURL|void} |
|
*/ |
|
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 }; |
|
} |
|
|
|
exports.parse = parse; |