auspice
Version:
Web app for visualizing pathogen evolution
66 lines (54 loc) • 1.64 kB
JavaScript
const utils = require("../utils");
const { URL } = require("url");
const fetch = require("node-fetch");
const PROXY = process.env.PROXY || `http://localhost:5000`
utils.log(`[reverse-proxy] Will proxy charon API requests to ${PROXY}`)
const hopByHopHeaders = [
"connection",
"keep-alive",
"proxy-authenticate",
"proxy-authorization",
"te",
"trailer",
"transfer-encoding",
"upgrade",
];
async function proxy(req, res) {
const upstreamUrl = new URL(req.url, PROXY);
utils.log(`[reverse-proxy] Proxying request "${req.url}" to upstream "${upstreamUrl.href}"`)
// Charon API only supports GET
if (req.method!=='GET') {
res.statusCode = 501;
res.setHeader("content-type", "text/plain; charset=utf-8");
res.end(`Request method not supported`);
}
const headers = { ...req.headers }
for (const h of hopByHopHeaders) {
delete headers[h]
}
headers.host = upstreamUrl.host; // Pretend this request was sent directly to the upstream
const upstreamResp = await fetch(upstreamUrl.toString(), {
method: 'GET',
headers,
redirect: "manual",
compress: false, // keep upstream compressed bytes
});
res.statusCode = upstreamResp.status;
res.statusMessage = upstreamResp.statusText;
// remove hop-by-hop headers
upstreamResp.headers.forEach((value, key) => {
if (hopByHopHeaders.includes(key.toLowerCase())) return;
res.setHeader(key, value);
});
// Stream response body to client
if (upstreamResp.body) {
upstreamResp.body.pipe(res);
} else {
res.end();
}
}
module.exports = {
getAvailable: proxy,
getDataset: proxy,
getNarrative: proxy,
};