@hawtio/backend-middleware
Version:
An Express middleware that implements Hawtio backend
88 lines • 7.45 kB
JavaScript
import { Readable } from 'node:stream';
import { log } from './logger';
export async function proxy(uri, req, res) {
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(req.body ?? {});
}
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:
log.info('Authentication failed on remote server:', res2.status, res2.statusText, uri);
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);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUl0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRTlCLE1BQU0sQ0FBQyxLQUFLLFVBQVUsS0FBSyxDQUFDLEdBQVcsRUFBRSxHQUFZLEVBQUUsR0FBYTtJQUNsRSxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1FBQ2hDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN4RCxDQUFDLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0lBQzdCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3ZELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkMsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUMzQixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FB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