-
Notifications
You must be signed in to change notification settings - Fork 4
/
proxy.js
59 lines (52 loc) · 1.6 KB
/
proxy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
const url = require('url');
const express = require('express');
const httpProxy = require('http-proxy');
const convertHrtime = require('./convert-hrtime');
const proxySettings = {
secure: true,
xfwd: true,
ignorePath: true,
changeOrigin: true,
proxyTimeout: 3000,
};
const router = express.Router();
router.get('/:protocol(http|https)/:host/:probe(*)?', (req, res, next) => {
const host = req.params.host;
if (!validDomain(host)) {
return res.status(502).json({error: 'denied'});
}
if (req.params.probe === 'info') {
var path = "/info"
} else if (req.params.probe === 'health') {
var path = "/health"
} else if (req.params.probe === "" || req.params.probe === undefined) {
var path = "/health"
} else {
return res.status(502).json({error: 'invalid probe path'});
}
const start = process.hrtime.bigint();
const target = url.format({
protocol: req.params.protocol,
host: host,
pathname: path
});
console.log("Proxying request to %s", target);
const proxy = httpProxy.createProxyServer(proxySettings);
proxy.web(req, res, { target });
proxy.on('proxyRes', () => {
addDurationHeader();
});
proxy.on('error', (err) => {
addDurationHeader();
res.status(504);
res.json({error: err.message});
});
function addDurationHeader() {
const duration = convertHrtime(process.hrtime.bigint() - start).milliseconds
res.set('X-Health-Duration', String(duration));
}
});
function validDomain(host) {
return (host.endsWith('.svc.cluster.local') || host.endsWith('service.justice.gov.uk')) && /[a-z0-9-.]+/.test(host)
}
module.exports = router;