58 lines
1.2 KiB
JavaScript
58 lines
1.2 KiB
JavaScript
|
const url = require('url');
|
||
|
|
||
|
/**
|
||
|
* Parse the `str` url with fast-path short-cut.
|
||
|
*
|
||
|
* @param {string} str
|
||
|
* @return {Object}
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
module.exports = function fastparse(str) {
|
||
|
if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) {
|
||
|
return url.parse(str);
|
||
|
}
|
||
|
|
||
|
let pathname = str;
|
||
|
let query = null;
|
||
|
let search = null;
|
||
|
|
||
|
// This takes the regexp from https://github.com/joyent/node/pull/7878
|
||
|
// Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/
|
||
|
// And unrolls it into a for loop
|
||
|
for (let i = 1; i < str.length; i++) {
|
||
|
switch (str.charCodeAt(i)) {
|
||
|
case 0x3f: /* ? */
|
||
|
if (search === null) {
|
||
|
pathname = str.substring(0, i);
|
||
|
query = str.substring(i + 1);
|
||
|
search = str.substring(i);
|
||
|
}
|
||
|
break;
|
||
|
case 0x09: /* \t */
|
||
|
case 0x0a: /* \n */
|
||
|
case 0x0c: /* \f */
|
||
|
case 0x0d: /* \r */
|
||
|
case 0x20: /* */
|
||
|
case 0x23: /* # */
|
||
|
case 0xa0:
|
||
|
case 0xfeff:
|
||
|
return url.parse(str);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let parsed = new url.Url();
|
||
|
|
||
|
parsed.path = str;
|
||
|
parsed.href = str;
|
||
|
parsed.pathname = pathname;
|
||
|
|
||
|
if (search !== null) {
|
||
|
parsed.query = query;
|
||
|
parsed.search = search;
|
||
|
}
|
||
|
parsed.__raw = str;
|
||
|
|
||
|
return parsed;
|
||
|
};
|