http: add hooks.
This commit is contained in:
parent
e52130ef29
commit
67e6c8d768
@ -33,6 +33,7 @@ function HTTPBase(options) {
|
|||||||
this.io = null;
|
this.io = null;
|
||||||
this.routes = new Routes();
|
this.routes = new Routes();
|
||||||
this.stack = [];
|
this.stack = [];
|
||||||
|
this.hooks = [];
|
||||||
|
|
||||||
this._init();
|
this._init();
|
||||||
}
|
}
|
||||||
@ -115,6 +116,9 @@ HTTPBase.prototype.handleRequest = co(function* handleRequest(req, res) {
|
|||||||
|
|
||||||
this.emit('request', req, res);
|
this.emit('request', req, res);
|
||||||
|
|
||||||
|
if (yield this.handleStack(req, res))
|
||||||
|
return;
|
||||||
|
|
||||||
req.body = yield this.parseBody(req);
|
req.body = yield this.parseBody(req);
|
||||||
|
|
||||||
routes = this.routes.getHandlers(req.method);
|
routes = this.routes.getHandlers(req.method);
|
||||||
@ -131,7 +135,7 @@ HTTPBase.prototype.handleRequest = co(function* handleRequest(req, res) {
|
|||||||
|
|
||||||
req.params = params;
|
req.params = params;
|
||||||
|
|
||||||
if (yield this.handleStack(req, res))
|
if (yield this.handleHooks(req, res))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (yield route.call(req, res))
|
if (yield route.call(req, res))
|
||||||
@ -174,30 +178,6 @@ HTTPBase.prototype.parseBody = co(function* parseBody(req) {
|
|||||||
return body;
|
return body;
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle middleware stack.
|
|
||||||
* @private
|
|
||||||
* @param {HTTPRequest} req
|
|
||||||
* @param {HTTPResponse} res
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
HTTPBase.prototype.handleStack = co(function* handleStack(req, res) {
|
|
||||||
var i, route;
|
|
||||||
|
|
||||||
for (i = 0; i < this.stack.length; i++) {
|
|
||||||
route = this.stack[i];
|
|
||||||
|
|
||||||
if (!route.hasPrefix(req.pathname))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (yield route.call(req, res))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read and buffer request body.
|
* Read and buffer request body.
|
||||||
* @param {ServerRequest} req
|
* @param {ServerRequest} req
|
||||||
@ -241,8 +221,10 @@ HTTPBase.prototype._readBody = function _readBody(req, enc, resolve, reject) {
|
|||||||
req.removeListener('error', onError);
|
req.removeListener('error', onError);
|
||||||
req.removeListener('end', onEnd);
|
req.removeListener('end', onEnd);
|
||||||
|
|
||||||
if (timer != null)
|
if (timer != null) {
|
||||||
|
timer = null;
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onData(data) {
|
function onData(data) {
|
||||||
@ -278,6 +260,54 @@ HTTPBase.prototype._readBody = function _readBody(req, enc, resolve, reject) {
|
|||||||
req.on('end', onEnd);
|
req.on('end', onEnd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle middleware stack.
|
||||||
|
* @private
|
||||||
|
* @param {HTTPRequest} req
|
||||||
|
* @param {HTTPResponse} res
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
|
||||||
|
HTTPBase.prototype.handleStack = co(function* handleStack(req, res) {
|
||||||
|
var i, route;
|
||||||
|
|
||||||
|
for (i = 0; i < this.stack.length; i++) {
|
||||||
|
route = this.stack[i];
|
||||||
|
|
||||||
|
if (!route.hasPrefix(req.pathname))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (yield route.call(req, res))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle hook stack.
|
||||||
|
* @private
|
||||||
|
* @param {HTTPRequest} req
|
||||||
|
* @param {HTTPResponse} res
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
|
||||||
|
HTTPBase.prototype.handleHooks = co(function* handleHooks(req, res) {
|
||||||
|
var i, route;
|
||||||
|
|
||||||
|
for (i = 0; i < this.hooks.length; i++) {
|
||||||
|
route = this.hooks[i];
|
||||||
|
|
||||||
|
if (!route.hasPrefix(req.pathname))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (yield route.call(req, res))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize websockets.
|
* Initialize websockets.
|
||||||
* @private
|
* @private
|
||||||
@ -361,6 +391,21 @@ HTTPBase.prototype.use = function use(path, handler, ctx) {
|
|||||||
this.stack.push(new Route(ctx, path, handler));
|
this.stack.push(new Route(ctx, path, handler));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a hook to the stack.
|
||||||
|
* @param {String?} path
|
||||||
|
* @param {Function} handler
|
||||||
|
* @param {Object?} ctx
|
||||||
|
*/
|
||||||
|
|
||||||
|
HTTPBase.prototype.hook = function hook(path, handler, ctx) {
|
||||||
|
if (!handler) {
|
||||||
|
handler = path;
|
||||||
|
path = null;
|
||||||
|
}
|
||||||
|
this.hooks.push(new Route(ctx, path, handler));
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a GET route.
|
* Add a GET route.
|
||||||
* @param {String} path
|
* @param {String} path
|
||||||
|
|||||||
@ -173,7 +173,7 @@ HTTPServer.prototype._init = function _init() {
|
|||||||
res.send(401, { error: 'Bad API key.' });
|
res.send(401, { error: 'Bad API key.' });
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this.use(co(function* (req, res) {
|
this.hook(co(function* (req, res) {
|
||||||
var i, params, options, censored, output, address;
|
var i, params, options, censored, output, address;
|
||||||
|
|
||||||
if (req.method === 'POST' && req.pathname === '/') {
|
if (req.method === 'POST' && req.pathname === '/') {
|
||||||
@ -472,7 +472,7 @@ HTTPServer.prototype._init = function _init() {
|
|||||||
req.options = options;
|
req.options = options;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this.use(co(function* (req, res) {
|
this.hook(co(function* (req, res) {
|
||||||
var options = req.options;
|
var options = req.options;
|
||||||
var wallet;
|
var wallet;
|
||||||
|
|
||||||
@ -1624,6 +1624,20 @@ HTTPServer.prototype.use = function use(path, handler) {
|
|||||||
return this.server.use(path, handler, this);
|
return this.server.use(path, handler, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a hook to the stack.
|
||||||
|
* @param {String?} path
|
||||||
|
* @param {Function} handler
|
||||||
|
*/
|
||||||
|
|
||||||
|
HTTPServer.prototype.hook = function hook(path, handler) {
|
||||||
|
if (!handler) {
|
||||||
|
handler = path;
|
||||||
|
path = null;
|
||||||
|
}
|
||||||
|
return this.server.hook(path, handler, this);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a GET route.
|
* Add a GET route.
|
||||||
* @param {String} path
|
* @param {String} path
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user