isite
Version:
Create High Level Multi-Language Web Site [Fast and Easy]
132 lines (113 loc) • 3.8 kB
JavaScript
const webServer = require('./index')({ name: 'Local Proxy', apps: false, mongodb: { enabled: false }, require: { features: [] } });
var regex_hostport = /^([^:]+)(:([0-9]+))?$/;
webServer.options.ipList = [];
var getHostPortFromString = function (hostString, defaultPort) {
var host = hostString;
var port = defaultPort;
var result = regex_hostport.exec(hostString);
if (result != null) {
host = result[1];
if (result[2] != null) {
port = result[3];
}
}
return [host, port];
};
webServer.on('ready', () => {
if (webServer.server) {
webServer.server.addListener('connect', function (req, socket, bodyhead) {
let ip = socket.remoteAddress?.replace('::ffff:', '') || '';
if (!ip || !webServer.options.ipList.some((info) => info.ip === ip)) {
console.log('Socket Block IP : ' + ip + ' : ' + req.url);
return socket.end();
}
console.log('Socket Allow IP : ' + ip + ' : ' + req.url);
var hostPort = getHostPortFromString(req.url, 443);
var hostDomain = hostPort[0];
var port = parseInt(hostPort[1]);
console.log('Socket connecting :: ' + hostDomain + ':' + port);
var proxySocket = new webServer.net.Socket();
proxySocket.connect(port, hostDomain, function () {
proxySocket.write(bodyhead);
socket.write('HTTP/' + req.httpVersion + ' 200 Connection established\r\n\r\n');
});
proxySocket.on('connect', function () {
console.log('Socket connected :: ' + hostDomain);
});
proxySocket.on('data', function (chunk) {
socket.write(chunk);
});
proxySocket.on('end', function () {
socket.end();
});
proxySocket.on('error', function () {
socket.write('HTTP/' + req.httpVersion + ' 500 Connection error\r\n\r\n');
socket.end();
});
socket.on('data', function (chunk) {
proxySocket.write(chunk);
});
socket.on('end', function () {
proxySocket.end();
});
socket.on('error', function () {
proxySocket.end();
});
});
} else {
process.exit();
}
});
let http_agent = new webServer.http.Agent({
keepAlive: true,
});
let https_agent = new webServer.https.Agent({
keepAlive: true,
});
webServer.onALL('*', (req, res) => {
let ip = req.remoteAddress?.replace('::ffff:', '') || '';
if (!ip || !webServer.options.ipList.some((info) => info.ip === ip)) {
console.log('Http Block IP : ' + ip + ' : ' + req.url);
return res.end();
}
console.log('Http Allow IP : ' + ip + ' : ' + req.url);
webServer
.fetch(req.url, {
method: req.method,
headers: req.headers,
body: req.method.like('*get*|*head*') ? null : req.bodyRaw,
agent: function (_parsedURL) {
if (_parsedURL.protocol == 'http:') {
return http_agent;
} else {
return https_agent;
}
},
})
.then((response) => {
response.body.pipe(res);
})
.catch((err) => console.log(err));
});
process.on('message', (message) => {
if (typeof message.options === 'object') {
webServer.options = { ...webServer.options, ...message.options };
if (message.options.xip) {
let index = webServer.options.ipList.findIndex((info) => info.ip === message.options.xip);
if (index === -1) {
webServer.options.ipList.push({
ip: message.options.xip,
date: new Date(),
});
} else {
webServer.options.ipList[index].date = new Date();
}
}
}
if (message.type == 'start') {
webServer.run();
}
if (message.type == 'close') {
process.exit();
}
});