http: path parsing.
This commit is contained in:
parent
72f6a1d239
commit
9e0b10f314
@ -114,9 +114,13 @@ HTTPBase.prototype._initRouter = function _initRouter() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
HTTPBase.prototype.handleRequest = co(function* handleRequest(req, res) {
|
HTTPBase.prototype.handleRequest = co(function* handleRequest(req, res) {
|
||||||
|
var url = initRequest(req, res, this.keyLimit);
|
||||||
var i, routes, route, params;
|
var i, routes, route, params;
|
||||||
|
|
||||||
initRequest(req, res, this.keyLimit);
|
if (url.trailingSlash) {
|
||||||
|
res.redirect(302, req.url);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('request', req, res);
|
this.emit('request', req, res);
|
||||||
|
|
||||||
@ -587,6 +591,8 @@ Routes.prototype.getHandlers = function getHandlers(method) {
|
|||||||
function nop() {}
|
function nop() {}
|
||||||
|
|
||||||
function initRequest(req, res, limit) {
|
function initRequest(req, res, limit) {
|
||||||
|
var url;
|
||||||
|
|
||||||
req.on('error', nop);
|
req.on('error', nop);
|
||||||
|
|
||||||
assert(req.contentType == null);
|
assert(req.contentType == null);
|
||||||
@ -618,12 +624,21 @@ function initRequest(req, res, limit) {
|
|||||||
assert(res.sent == null);
|
assert(res.sent == null);
|
||||||
assert(res.send == null);
|
assert(res.send == null);
|
||||||
assert(res.error == null);
|
assert(res.error == null);
|
||||||
|
assert(res.redirect == null);
|
||||||
|
|
||||||
res.sent = false;
|
res.sent = false;
|
||||||
res.send = makeSend(res);
|
res.send = makeSend(res);
|
||||||
res.error = makeSendError(req, res);
|
res.error = makeSendError(req, res);
|
||||||
|
res.redirect = makeRedirect(res);
|
||||||
|
|
||||||
parsePath(req, limit);
|
url = parseURL(req.url, limit);
|
||||||
|
|
||||||
|
req.url = url.url;
|
||||||
|
req.pathname = url.pathname;
|
||||||
|
req.path = url.path;
|
||||||
|
req.query = url.query;
|
||||||
|
|
||||||
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeSend(res) {
|
function makeSend(res) {
|
||||||
@ -714,6 +729,18 @@ function sendError(req, res, err) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function makeRedirect(res) {
|
||||||
|
return function redirect(code, url) {
|
||||||
|
if (!url) {
|
||||||
|
url = code;
|
||||||
|
code = 302;
|
||||||
|
}
|
||||||
|
res.statusCode = code;
|
||||||
|
res.setHeader('Location', url);
|
||||||
|
res.end();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function parsePairs(str, limit) {
|
function parsePairs(str, limit) {
|
||||||
var parts = str.split('&');
|
var parts = str.split('&');
|
||||||
var data = Object.create(null);
|
var data = Object.create(null);
|
||||||
@ -749,10 +776,12 @@ function parsePairs(str, limit) {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
function parsePath(req, limit) {
|
function parseURL(reqUrl, limit) {
|
||||||
var uri = URL.parse(req.url);
|
var uri = URL.parse(reqUrl);
|
||||||
|
var parsed = new ParsedURL(reqUrl);
|
||||||
var pathname = uri.pathname;
|
var pathname = uri.pathname;
|
||||||
var query = Object.create(null);
|
var query = Object.create(null);
|
||||||
|
var trailing = false;
|
||||||
var path, parts, url;
|
var path, parts, url;
|
||||||
|
|
||||||
if (pathname) {
|
if (pathname) {
|
||||||
@ -762,8 +791,10 @@ function parsePath(req, limit) {
|
|||||||
pathname = '/' + pathname;
|
pathname = '/' + pathname;
|
||||||
|
|
||||||
if (pathname.length > 1) {
|
if (pathname.length > 1) {
|
||||||
if (pathname[pathname.length - 1] === '/')
|
if (pathname[pathname.length - 1] === '/') {
|
||||||
pathname = pathname.slice(0, -1);
|
pathname = pathname.slice(0, -1);
|
||||||
|
trailing = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pathname = unescape(pathname);
|
pathname = unescape(pathname);
|
||||||
@ -804,10 +835,22 @@ function parsePath(req, limit) {
|
|||||||
if (uri.query)
|
if (uri.query)
|
||||||
query = parsePairs(uri.query, limit);
|
query = parsePairs(uri.query, limit);
|
||||||
|
|
||||||
req.url = url;
|
parsed.url = url;
|
||||||
req.pathname = pathname;
|
parsed.pathname = pathname;
|
||||||
req.path = parts;
|
parsed.path = path;
|
||||||
req.query = query;
|
parsed.query = query;
|
||||||
|
parsed.trailingSlash = trailing;
|
||||||
|
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ParsedURL(original) {
|
||||||
|
this.original = original;
|
||||||
|
this.url = null;
|
||||||
|
this.pathname = null;
|
||||||
|
this.path = null;
|
||||||
|
this.query = null;
|
||||||
|
this.trailingSlash = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function unescape(str) {
|
function unescape(str) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user