Skip to content

Commit

Permalink
add rewrites
Browse files Browse the repository at this point in the history
  • Loading branch information
dfilatov committed Feb 7, 2013
1 parent d0e7ab1 commit f9b03dd
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 19 deletions.
51 changes: 33 additions & 18 deletions lib/router.js
@@ -1,4 +1,5 @@
var Rule = require('./rule');
var Rule = require('./rule'),
utils = require('./utils');

var Router = function() {
this._routes = [];
Expand All @@ -17,6 +18,7 @@ Router.prototype = {
},

/**
* Add fallback if no route found
* @param {Function} fn
*/
otherwise : function(fn) {
Expand All @@ -25,45 +27,58 @@ Router.prototype = {

/**
* Do routing
* @param {Object} request
* @param {String} request.path
* @param {String} [request.method="get"]
* @param {Object} [request.query]
* @param {Object} req
* @param {String} req.path
* @param {String} [req.method="get"]
* @param {Object} [req.query]
* @returns {boolean}
*/
route : function(request) {
if(!this._doRewrites(request)) {
if(!this._doRouting(request) && this._fallback) {
this._fallback(request);
route : function(req) {
if(!this._doRewrites(req)) {
if(!this._doRouting(req) && this._fallback) {
this._fallback(req);
}
}
},

_doRewrites : function(request) {
_doRewrites : function(req) {
var rewrite, matchedRequest, i = 0;
while(rewrite = this._rewrites[i++]) {
if(matchedRequest = rewrite.rule._match(request)) {
this.route(this._rewriteRequest(matchedRequest, rewrite));
if(matchedRequest = rewrite.rule._match(req)) {
this.route(this._applyRewrite(rewrite, matchedRequest));
return true;
}
}
return false;
},

_doRouting : function(request) {
_doRouting : function(req) {
var route, matchedRequest, i = 0;
while(route = this._routes[i++]) {
if(matchedRequest = route.rule._match(request)) {
route.action(matchedRequest);
if(matchedRequest = route.rule._match(req)) {
this._applyRoute(route, matchedRequest);
return true;
}
}
return false;
},

_rewriteRequest : function(request, rewrite) {
request.path = rewrite.action;
return request;
_applyRewrite : function(rewrite, req) {
req.path = rewrite.action.replace(/\{([^}]+)\}/g, function(_, name) {
var param = req.query[name];
if(param) {
delete req.query[name];
return param;
}
});

rewrite.params && (req.query = utils.merge(req.query, rewrite.params));

return req;
},

_applyRoute : function(route, req) {
route.action(req);
},

/**
Expand Down
18 changes: 18 additions & 0 deletions lib/utils.js
@@ -0,0 +1,18 @@
var toStr = Object.prototype.toString;

module.exports = {
merge : function() {
var res = {};

for(var i = 0, len = arguments.length; i < len; i++) {
var obj = arguments[i];
if(obj) {
for(var name in obj) {
obj.hasOwnProperty(name) && (res[name] = obj[name]);
}
}
}

return res;
}
};
2 changes: 1 addition & 1 deletion rou.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit f9b03dd

Please sign in to comment.