|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'use strict' |
|
|
|
|
|
|
|
|
|
|
|
|
|
var url = require('url') |
|
var parse = url.parse |
|
var Url = url.Url |
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = parseurl |
|
module.exports.original = originalurl |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function parseurl (req) { |
|
var url = req.url |
|
|
|
if (url === undefined) { |
|
|
|
return undefined |
|
} |
|
|
|
var parsed = req._parsedUrl |
|
|
|
if (fresh(url, parsed)) { |
|
|
|
return parsed |
|
} |
|
|
|
|
|
parsed = fastparse(url) |
|
parsed._raw = url |
|
|
|
return (req._parsedUrl = parsed) |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function originalurl (req) { |
|
var url = req.originalUrl |
|
|
|
if (typeof url !== 'string') { |
|
|
|
return parseurl(req) |
|
} |
|
|
|
var parsed = req._parsedOriginalUrl |
|
|
|
if (fresh(url, parsed)) { |
|
|
|
return parsed |
|
} |
|
|
|
|
|
parsed = fastparse(url) |
|
parsed._raw = url |
|
|
|
return (req._parsedOriginalUrl = parsed) |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function fastparse (str) { |
|
if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f ) { |
|
return parse(str) |
|
} |
|
|
|
var pathname = str |
|
var query = null |
|
var search = null |
|
|
|
|
|
|
|
|
|
for (var 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: |
|
case 0x0a: |
|
case 0x0c: |
|
case 0x0d: |
|
case 0x20: |
|
case 0x23: |
|
case 0xa0: |
|
case 0xfeff: |
|
return parse(str) |
|
} |
|
} |
|
|
|
var url = Url !== undefined |
|
? new Url() |
|
: {} |
|
|
|
url.path = str |
|
url.href = str |
|
url.pathname = pathname |
|
|
|
if (search !== null) { |
|
url.query = query |
|
url.search = search |
|
} |
|
|
|
return url |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function fresh (url, parsedUrl) { |
|
return typeof parsedUrl === 'object' && |
|
parsedUrl !== null && |
|
(Url === undefined || parsedUrl instanceof Url) && |
|
parsedUrl._raw === url |
|
} |
|
|