@hawtio/backend-middleware
Version:
An Express middleware that implements Hawtio backend
74 lines • 6.18 kB
JavaScript
import express from 'express';
import Logger from 'js-logger';
import { stringify } from 'qs';
import { configureLog, log } from './logger';
import { proxy } from './proxy';
const defaultOptions = {
logLevel: Logger.INFO,
};
export function hawtioBackend(options = defaultOptions) {
configureLog(options.logLevel);
const backend = express.Router();
backend.param('proto', (_req, res, next, proto) => {
log.debug('Requesting proto:', proto);
switch (proto.toLowerCase()) {
case 'http':
case 'https':
next();
break;
default:
res.status(406).send(`Invalid protocol: ${proto}`);
}
});
backend.param('hostname', (_req, _res, next, hostname) => {
log.debug('Requesting hostname:', hostname);
next();
});
backend.param('port', (_req, res, next, port) => {
log.debug('Requesting port:', port);
const portNumber = parseInt(port);
log.debug('Parsed port number:', portNumber);
if (isNaN(portNumber)) {
res.status(406).send(`Invalid port number: ${port}`);
}
else {
next();
}
});
backend.use('/', (req, res, next) => {
if (req.path === '') {
res.status(200).end();
}
else {
next();
}
});
backend.use('/:proto/:hostname/:port/', (req, res) => {
log.debug('Requesting path:', req.path);
log.debug('Requesting query:', req.query);
const uri = getTargetURI({
proto: req.params.proto,
hostname: req.params.hostname,
port: req.params.port,
path: req.path,
query: req.query,
});
proxy(uri, req, res);
});
return backend;
}
function getTargetURI(options) {
let uri = '';
if (options.username && options.password) {
uri = `${options.proto}://${options.username}:${options.password}@${options.hostname}:${options.port}${options.path}`;
}
else {
uri = `${options.proto}://${options.hostname}:${options.port}${options.path}`;
}
if (Object.keys(options.query).length !== 0) {
uri += '?' + stringify(options.query);
}
log.debug('Target URL:', uri);
return uri;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQW9ELE1BQU0sU0FBUyxDQUFBO0FBQzFFLE9BQU8sTUFBcUIsTUFBTSxXQUFXLENBQUE7QUFDN0MsT0FBTyxFQUFZLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQTtBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBUy9CLE1BQU0sY0FBYyxHQUF5QjtJQUMzQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUk7Q0FDdEIsQ0FBQTtBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBZ0MsY0FBYztJQUMxRSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTlCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUVoQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQWEsRUFBRSxHQUFhLEVBQUUsSUFBa0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtRQUN6RixHQUFHLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3JDLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDNUIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxFQUFFLENBQUE7Z0JBQ04sTUFBSztZQUNQO2dCQUNFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ3RELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBYSxFQUFF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