Skip to content

Commit c30e114

Browse files
committed
Commit
1 parent 37dd914 commit c30e114

9 files changed

Lines changed: 536 additions & 0 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

package.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "randomrants-proxy",
3+
"version": "1.0.0",
4+
"description": "Proxy for random rants +",
5+
"homepage": "https://github.com/Random-Rants-Chat/randomrants-proxy#readme",
6+
"bugs": {
7+
"url": "https://github.com/Random-Rants-Chat/randomrants-proxy/issues"
8+
},
9+
"repository": {
10+
"type": "git",
11+
"url": "git+https://github.com/Random-Rants-Chat/randomrants-proxy.git"
12+
},
13+
"license": "MIT",
14+
"author": "Gvbvdxx",
15+
"type": "commonjs",
16+
"main": "index.js",
17+
"scripts": {
18+
"start": "node src/server.js"
19+
},
20+
"dependencies": {
21+
"https": "^1.0.0",
22+
"ws": "^8.19.0",
23+
"wss": "^3.3.4"
24+
}
25+
}

src/config.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
module.exports = {
3+
targetHost: "randomrants-plus.onrender.com",
4+
targetOrigin: "randomrants-plus.onrender.com",
5+
targetWsPath: "wss://randomrants-plus.onrender.com",
6+
serverModule: require("https"),
7+
wsModule: require("wss")
8+
};

src/header-blacklist.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module.exports = [
2+
"origin",
3+
"x-forwarded-for",
4+
"x-forwarded-proto",
5+
"x-forwarded-host",
6+
"proxy-connection",
7+
"x-forwarded-port",
8+
"x-forwarded-scheme",
9+
"x-real-ip",
10+
"host",
11+
"referer"
12+
];

src/http/index.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
var headerBlacklist = require("../header-blacklist.js");
2+
var http = require("http");
3+
var config = require("../config.js");
4+
var serverModule = config.serverModule;
5+
var headerBlacklist = require("../header-blacklist.js");
6+
7+
function onHTTPRequest(req,res) {
8+
var proxyHeaders = req.headers || {};
9+
for (var blockedHeader of headerBlacklist) {
10+
proxyHeaders[blockedHeader] = null;
11+
delete proxyHeaders[blockedHeader];
12+
}
13+
proxyHeaders["origin"] = config.targetOrigin;
14+
var proxyReq = serverModule.request({
15+
host: config.targetHost,
16+
method: req.method,
17+
path: req.url,
18+
headers: proxyHeaders
19+
}, (proxyRes) => {
20+
var headers = proxyRes.headers || {};
21+
for (var blockedHeader of headerBlacklist) {
22+
headers[blockedHeader] = null;
23+
delete headers[blockedHeader];
24+
}
25+
for (var header of Object.keys(headers)) {
26+
res.setHeader(header, headers[header]);
27+
}
28+
29+
proxyRes.pipe(res);
30+
});
31+
32+
if (req.method == "POST") {
33+
req.pipe(proxyReq);
34+
} else {
35+
proxyReq.end("");
36+
}
37+
}
38+
39+
module.exports = {onHTTPRequest};

src/server.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
2+
3+
var http = require("http");
4+
var {onHTTPRequest} = require("./http");
5+
var {onUpgradeRequest} = require("./ws");
6+
7+
var server = http.createServer(onHTTPRequest);
8+
9+
server.on("upgrade", onUpgradeRequest);
10+
11+
server.listen(8080);

src/ws/anti-ghost.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
function terminateGhostSockets(ws) {
2+
var isAlive = true;
3+
var terminated = false;
4+
5+
function heartbeat() {
6+
isAlive = true;
7+
}
8+
9+
ws.on("pong", heartbeat);
10+
11+
var interval = setInterval(() => {
12+
if (!isAlive) {
13+
if (!terminated) {
14+
terminated = true;
15+
clearInterval(interval);
16+
ws.terminate();
17+
//ws.emit("close");
18+
}
19+
return;
20+
}
21+
22+
isAlive = false;
23+
try {
24+
ws.ping();
25+
} catch (err) {
26+
if (!terminated) {
27+
terminated = true;
28+
clearInterval(interval);
29+
ws.terminate();
30+
//ws.emit("close");
31+
}
32+
}
33+
}, 1500); // Check every 1500 miliseconds.
34+
35+
ws.on("close", () => {
36+
if (!terminated) {
37+
terminated = true;
38+
clearInterval(interval);
39+
}
40+
});
41+
42+
try {
43+
ws.ping();
44+
} catch (err) {
45+
// Socket might already be broken
46+
if (!terminated) {
47+
terminated = true;
48+
clearInterval(interval);
49+
ws.terminate();
50+
}
51+
}
52+
}
53+
54+
module.exports = {terminateGhostSockets};

src/ws/index.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
var headerBlacklist = require("../header-blacklist.js");
2+
var config = require("../config.js");
3+
var tls = require('tls');
4+
var net = require('net');
5+
6+
function onUpgradeRequest(clientRequest, clientSocket, clientHead) {
7+
const options = {
8+
host: config.targetHost,
9+
port: 443,
10+
servername: config.targetHost,
11+
rejectUnauthorized: false
12+
};
13+
14+
const targetSocket = tls.connect(options, () => {
15+
clientSocket.setTimeout(0);
16+
targetSocket.setTimeout(0);
17+
clientSocket.setNoDelay(true);
18+
targetSocket.setNoDelay(true);
19+
let headers = `${clientRequest.method} ${clientRequest.url} HTTP/${clientRequest.httpVersion}\r\n`;
20+
for (let i = 0; i < clientRequest.rawHeaders.length; i += 2) {
21+
const key = clientRequest.rawHeaders[i];
22+
const value = clientRequest.rawHeaders[i + 1];
23+
if (headerBlacklist && headerBlacklist.includes(key)) continue;
24+
if (key.toLowerCase() === 'host') {
25+
headers += `Host: ${config.targetHost}\r\n`;
26+
} else if (key.toLowerCase() === 'origin') {
27+
headers += `Origin: https://${config.targetHost}\r\n`;
28+
} else {
29+
headers += `${key}: ${value}\r\n`;
30+
}
31+
}
32+
headers += '\r\n';
33+
34+
targetSocket.write(headers);
35+
targetSocket.write(clientHead);
36+
37+
clientSocket.pipe(targetSocket).pipe(clientSocket);
38+
});
39+
40+
targetSocket.on('error', (err) => {
41+
console.error('Target Socket Error:', err.message);
42+
clientSocket.end();
43+
});
44+
45+
clientSocket.on('error', (err) => {
46+
console.error('Client Socket Error:', err.message);
47+
targetSocket.end();
48+
});
49+
50+
targetSocket.on('end', () => clientSocket.end());
51+
clientSocket.on('end', () => targetSocket.end());
52+
}
53+
54+
module.exports = {onUpgradeRequest};

0 commit comments

Comments
 (0)