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(); }); });