-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
76 lines (73 loc) · 2.04 KB
/
server.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
const http = require('http');
const os = require('os');
const config = require('./config.json');
const deflect = (input) => (config.host[input] ? config.host[input] : input);
const maxLoad = parseInt(config.maxLoad || 10);
const maxMem = parseInt(config.maxMem || '95%');
const totalMem = os.totalmem();
const now = () => { const d = new Date(); return d.toISOString(); };
const log = (message) => console.log('[', now(), ']', message);
const server = http.createServer();
server.on('request', (request, response) => {
const { headers, url } = request;
const { method } = request;
const mem = parseFloat(((totalMem - os.freemem()) * 100 / totalMem).toFixed(0));
if (mem > maxMem) {
response.writeHead(509);
response.end();
return log('509 - MAX MEM');
}
if (os.loadavg().shift() > maxLoad) {
response.writeHead(509);
response.end();
return log('509 - MAX LOAD');
}
if (!headers.host) {
response.writeHead(404);
response.end();
return log('404 - NO HOST');
}
const target = deflect(headers.host.split('.').shift());
if (!target) {
response.writeHead(400);
response.end();
return log('400 - NO TARGET');
}
const [ hostname, port = config.port ] = target.split(':');
const options = {
hostname,
port,
path: request.url,
method,
headers,
};
const client = http.request(options, (source) => {
response.writeHead(source.statusCode, source.headers);
source.pipe(response);
})
.on('timeout', () => {
return log('500 - REQUEST TIMEOUT');
})
.on('end',() =>{
console.log(request.aborted);
return log('500 - REQUEST CLOSE');
})
.on('close', () => {
console.log(request.aborted);
return log('500 - REQUEST CLOSE');
});
request
.pipe(client)
.on('error', (e) => {
if (!response.headersSent) {
response.writeHead(500);
}
response.end();
return log('500 - REQUEST ERROR');
})
.on('end', function() {
console.log(request.aborted);
return log('500 - REQUEST CLOSE');
});
});
server.listen(3000);