proxy implementation #2

Open
mathmakgakpak wants to merge 1 commits from mathmakgakpak/patch-2 into master
Showing only changes of commit a71c54d139 - Show all commits

106
index.js
View File

@ -1,54 +1,66 @@
var WebSocket = require('ws');
var {parse:parseQueryString} = require('query-string');
var WebSocket = require("ws");
var SocksProxyAgent = require("socks-proxy-agent");
var { parse: parseQueryString } = require("query-string");
var wss = new WebSocket.Server({
port: process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 8080
port: process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 8080
});
var conncount = 0;
wss.on('connection', function (cws, req){
var number = conncount++;
console.log(`New connection #${number} from ${req.connection.remoteAddress} with ${req.url}`);
cws.on('close', function(){
console.log(`Closing connection #${number} from ${req.connection.remoteAddress}`);
});
wss.on("connection", function(cws, req) {
var number = conncount++;
console.log(
`New connection #${number} from ${req.connection.remoteAddress} with ${req.url}`
);
cws.on("close", function() {
console.log(
`Closing connection #${number} from ${req.connection.remoteAddress}`
);
});
var querystring = req.url.substr(1);
if (!querystring) return cws.close();
var params = parseQueryString(querystring);
var target = params.target;
if (!target) return cws.close();
var headers = {};
for (let key in params) if (key != "target") headers[key] = params[key];
var querystring = req.url.substr(1);
if (!querystring) return cws.close();
var params = parseQueryString(querystring);
var target = params.target;
if (!target) return cws.close();
var headers = {};
for (let key in params) {
if (key != "target" && key != "agent") headers[key] = params[key];
}
try {
var tws = new WebSocket(target, {headers});
} catch(e) {
console.error(e);
cws.close();
return;
}
// client to target
var messageBuffer = [];
tws.on('open', function(){
for (let message of messageBuffer) tws.send(message);
messageBuffer = undefined;
});
cws.on('message', function(message){
if (tws.readyState == WebSocket.OPEN) tws.send(message);
else if (messageBuffer) messageBuffer.push(message);
});
cws.on('close', function(){
tws.close();
messageBuffer = undefined;
});
cws.on('error', console.error);
try {
var tws = new WebSocket(target, {
headers,
agent: params.agent
? new SocksProxyAgent("socks://" + params.agent)
: undefined
});
} catch (e) {
console.error(e);
cws.close();
return;
}
// target to client
tws.on('message', function(message){
if (cws.readyState == WebSocket.OPEN) cws.send(message);
});
tws.on('close', function(){
cws.close();
});
tws.on('error', console.error);
// client to target
var messageBuffer = [];
tws.on("open", function() {
for (let message of messageBuffer) tws.send(message);
messageBuffer = undefined;
});
cws.on("message", function(message) {
if (tws.readyState == WebSocket.OPEN) tws.send(message);
else if (messageBuffer) messageBuffer.push(message);
});
cws.on("close", function() {
tws.close();
messageBuffer = undefined;
});
cws.on("error", console.error);
// target to client
tws.on("message", function(message) {
if (cws.readyState == WebSocket.OPEN) cws.send(message);
});
tws.on("close", function() {
cws.close();
});
tws.on("error", console.error);
});