websocket-proxy/index.js

44 lines
1.7 KiB
JavaScript

var http = require("http");
var https = require("https");
var server = http.createServer();
server.listen(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) {
if (req.headers["upgrade"] != "websocket") return socket.end("HTTP/1.1 400 Websocket upgrade only");
var xof = req.url.indexOf('?');
if (xof < 0) return socket.end("HTTP/1.1 400 Missing querystring");
var params = new URLSearchParams(req.url.substring(xof));
var targetURL = decodeURIComponent(params.get("target"));
if (!targetURL) return socket.end("HTTP/1.1 400 Target parameter is required");
targetURL = new URL(targetURL);
if (["https:","wss:"].includes(targetURL.protocol))
var secure = true;
else if (!["http:","ws:"].includes(targetURL.protocol))
return socket.end("HTTP/1.1 400 Unsupported target protocol");
targetURL.protocol = targetURL.protocol.replace("ws", "http");
var targetReq = (secure ? https : http).get(targetURL, {
headers: {
"Connection": "Upgrade",
"Upgrade": "websocket",
"Sec-WebSocket-Version": 13,
"Sec-WebSocket-Key": require('crypto').randomBytes(16).toString('base64')
}
});
console.debug("sdfsdfjig");
targetReq.on("response", function(targetRes) {
console.log(req.socket.remoteAddress, targetURL.href, targetRes.statusCode);
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) {
console.log(req.socket.remoteAddress, targetURL.href, error.message);
socket.end();
});
});