Compare commits

..

No commits in common. "h" and "master" have entirely different histories.
h ... master

4 changed files with 63 additions and 109 deletions

View File

@ -1,44 +1,54 @@
var http = require("http"); var WebSocket = require('ws');
var https = require("https"); var {parse:parseQueryString} = require('query-string');
var server = http.createServer(); var wss = new WebSocket.Server({
server.listen(process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 8080); port: process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 8080
server.on("request", function (req, res) {
res.writeHead(400);
res.end("Websockets only!");
}); });
server.on("upgrade", function (req, socket) { var conncount = 0;
if (req.headers["upgrade"] != "websocket") return socket.end("HTTP/1.1 400 Websocket upgrade only"); wss.on('connection', function (cws, req){
var xof = req.url.indexOf('?'); var number = conncount++;
if (xof < 0) return socket.end("HTTP/1.1 400 Missing querystring"); console.log(`New connection #${number} from ${req.connection.remoteAddress} with ${req.url}`);
var params = new URLSearchParams(req.url.substring(xof)); cws.on('close', function(){
var targetURL = decodeURIComponent(params.get("target")); console.log(`Closing connection #${number} from ${req.connection.remoteAddress}`);
if (!targetURL) return socket.end("HTTP/1.1 400 Target parameter is required"); });
targetURL = new URL(targetURL);
if (["https:","wss:"].includes(targetURL.protocol)) var querystring = req.url.substr(1);
var secure = true; if (!querystring) return cws.close();
else if (!["http:","ws:"].includes(targetURL.protocol)) var params = parseQueryString(querystring);
return socket.end("HTTP/1.1 400 Unsupported target protocol"); var target = params.target;
targetURL.protocol = targetURL.protocol.replace("ws", "http"); if (!target) return cws.close();
var targetReq = (secure ? https : http).get(targetURL, { var headers = {};
headers: { for (let key in params) if (key != "target") headers[key] = params[key];
"Connection": "Upgrade",
"Upgrade": "websocket", try {
"Sec-WebSocket-Version": 13, var tws = new WebSocket(target, {headers});
"Sec-WebSocket-Key": require('crypto').randomBytes(16).toString('base64') } 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;
}); });
console.debug("sdfsdfjig"); cws.on('message', function(message){
targetReq.on("response", function(targetRes) { if (tws.readyState == WebSocket.OPEN) tws.send(message);
console.log(req.socket.remoteAddress, targetURL.href, targetRes.statusCode); else if (messageBuffer) messageBuffer.push(message);
if (targetRes.statusCode == 101) {
targetRes.pipe(socket);
socket.pipe(targetRes);
} else {
socket.end(`HTTP/1.1 502 Unexpected status code from target server: ${targetRes.statusCode}`);
}
}); });
targetReq.on("error", function(error) { cws.on('close', function(){
console.log(req.socket.remoteAddress, targetURL.href, error.message); tws.close();
socket.end(); 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);
}); });

72
package-lock.json generated
View File

@ -1,64 +1,12 @@
{ {
"name": "websocket-proxy",
"lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "lockfileVersion": 1,
"": {
"dependencies": { "dependencies": {
"query-string": "^6.2.0", "async-limiter": {
"ws": "^8.3.0" "version": "1.0.0",
} "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
}, },
"node_modules/decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
"engines": {
"node": ">=0.10"
}
},
"node_modules/query-string": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.2.0.tgz",
"integrity": "sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==",
"dependencies": {
"decode-uri-component": "^0.2.0",
"strict-uri-encode": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/strict-uri-encode": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
"integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=",
"engines": {
"node": ">=4"
}
},
"node_modules/ws": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
"integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
},
"dependencies": {
"decode-uri-component": { "decode-uri-component": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@ -79,10 +27,12 @@
"integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
}, },
"ws": { "ws": {
"version": "8.3.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz",
"integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==",
"requires": {} "requires": {
"async-limiter": "~1.0.0"
}
} }
} }
} }

View File

@ -4,6 +4,6 @@
}, },
"dependencies": { "dependencies": {
"query-string": "^6.2.0", "query-string": "^6.2.0",
"ws": "^8.3.0" "ws": "^6.0.0"
} }
} }

View File

@ -1,6 +0,0 @@
var {WebSocketServer} = require("ws");
var wss = new WebSocketServer({port:4444});
wss.on("connection", ws => {
ws.send("ohayo");
ws.on("message", console.log);
});