flaks
Version:
reverse http/https proxy optimized for edge/outgoing traffic
77 lines (60 loc) • 2.05 kB
JavaScript
var express = require ('express');
var bodyParser = require ('body-parser');
var async = require ('async');
var Log = require ('winston-log-space');
var path = require ('path');
var promster = require ('@promster/express');
var addRequestId = require ('express-request-id');
var AccessLog = require ('./lib/AccessLog');
module.exports = function (opts, context, done) {
var log = Log.logger ('main:app');
var routes_proxy = require ('./routes/proxy');
var routes_status = require ('./routes/status');
var app = express();
app.set ('etag', false);
app.set ('x-powered-by', false);
if (opts.http && opts.http.trust_proxy) {
app.set ('trust proxy', opts.http && opts.http.trust_proxy);
}
app.use (promster.createMiddleware({
app: app,
options: {
normalizePath: (full_path, {req, res}) => {
if (req._upstream_route) return req._upstream_route;
if (req.route) return path.join (req.baseUrl, req.route.path);
return full_path.split ('?')[0];
}
}
}));
app.use('/metrics', async (req, res) => {
res.setHeader ('Content-Type', promster.getContentType());
res.end (await promster.getSummary());
});
app.use (addRequestId ());
if (opts.http && opts.http.access_log) {
app.use (AccessLog (opts));
}
async.series ([
cb => routes_status (opts, context, (err, router) => {
if (err) return cb (err);
app.use ('/status', bodyParser.json (), router);
cb();
}),
cb => routes_proxy (opts, context, (err, router) => {
if (err) return cb (err);
app.use ('/', router);
cb();
}),
], err => {
if (err) return done (err);
// must be set last!!!
app.use (function (err, req, res, next) {
if (err.name === 'UnauthorizedError') {
return res.status(401).send (err.message || 'Unauthorized');
}
log.error ('error caught: %s', err.stack);
res.status (err.status || 500).send (err.stack);
});
done (null, app);
});
}