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
3 years ago
|
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;
|