@hawtio/backend-middleware
Version:
An Express middleware that implements Hawtio backend
92 lines • 7.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.proxy = proxy;
const node_stream_1 = require("node:stream");
const logger_1 = require("./logger");
async function proxy(uri, req, res) {
var _a;
const handleError = (e) => {
res.status(500).end(`error proxying to "${uri}: ${e}`);
};
const headers = new Headers();
for (const [key, value] of Object.entries(req.headers)) {
if (key === 'referer' || value == null) {
continue;
}
if (Array.isArray(value)) {
for (const item of value) {
headers.append(key, item);
}
}
else {
headers.set(key, value);
}
}
const jolokiaAuthorization = req.headers['x-jolokia-authorization'];
if (jolokiaAuthorization) {
headers.set('authorization', Array.isArray(jolokiaAuthorization) ? jolokiaAuthorization[0] : jolokiaAuthorization);
}
try {
const request = {
method: req.method,
headers,
};
if (req.method === 'POST') {
// can we pass the request to be streamed from incoming expres.js to outgoing fetch request?
if (req.complete || req.readableEnded) {
// pass data consumed and transformed into JSON by bodyParser.json() middleware
request.body = JSON.stringify((_a = req.body) !== null && _a !== void 0 ? _a : {});
}
else {
// we can safely stream
request.body = req;
request.duplex = 'half';
}
}
const res2 = await fetch(uri, request);
const contentType = res2.headers.get('content-type');
if (contentType) {
res.header('content-type', contentType);
}
const newHeaders = {};
res2.headers.forEach((v, k) => {
newHeaders[k] = v;
});
if (res2.status == 401 && newHeaders['www-authenticate']) {
// emulate Hawtio's probing of remote Jolokia. Without "WWW-Authenticate: Basic ...",
// browser never displays native credentials dialog, so we can handle it nicer
let v = newHeaders['www-authenticate'];
if (v.toLowerCase().startsWith('basic')) {
v = 'Hawtio original-scheme="Basic" ' + v.substring(6, v.length);
newHeaders['WWW-Authenticate'] = v;
}
}
switch (res2.status) {
case 401:
case 403:
case 429:
logger_1.log.info('Authentication failed on remote server:', res2.status, res2.statusText, uri);
logger_1.log.debug('Response headers:', newHeaders);
res.header(newHeaders).sendStatus(res2.status);
break;
default:
if (!res2.ok) {
handleError(`${res2.status} ${res2.statusText}`);
return;
}
if (res2.body) {
res.status(res2.status);
node_stream_1.Readable.fromWeb(res2.body)
.pipe(res)
.on('error', handleError);
}
else {
res.status(res2.status).end();
}
}
}
catch (error) {
handleError(String(error));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxzQkF1RkM7QUE3RkQsNkNBQXNDO0FBSXRDLHFDQUE4QjtBQUV2QixLQUFLLFVBQVUsS0FBSyxDQUFDLEdBQVcsRUFBRSxHQUFZLEVBQUUsR0FBYTs7SUFDbEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRTtRQUNoQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDeEQsQ0FBQyxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtJQUM3QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZDLFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDM0IsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQTtJQUNuRSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFD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