let request = { path: "user/login", name: "Sushruth", pass: "******" }; let mp = require('msgpack-lite'); var WebSocket = require('streamws'); var ws = new WebSocket('ws://localhost:8642'); ws.on('open', () => { ws.send(mp.encode(request), { binary: true, mask: true }); });
localConnection.on("data", function(data) { if(state == 0) { var buffer = new Buffer(2); buffer.write("\u0005", 0, 1, "binary"); buffer.write("\u0000", 1, 1, "binary"); localConnection.write(buffer); state = 1; return; } if(state == 1) { if(data[1] == 2) { console.log("error: unsupported command code: 0x02 (establish a TCP/IP port binding)"); var buffer = new Buffer(10); buffer.write("\u0005", 0, 1, "binary"); buffer.write("\u0007", 1, 1, "binary"); buffer.write("\u0000", 2, 1, "binary"); buffer.write("\u0001", 3, 1, "binary"); buffer.write("\u0000", 4, 1, "binary"); buffer.write("\u0000", 5, 1, "binary"); buffer.write("\u0000", 6, 1, "binary"); buffer.write("\u0000", 7, 1, "binary"); buffer.write("\u0000", 8, 1, "binary"); buffer.write("\u0000", 9, 1, "binary"); localConnection.end(buffer); return; } if(data[1] == 3) { console.log("error: unsupported command code: 0x03 (associate a UDP port)"); var buffer = new Buffer(10); buffer.write("\u0005", 0, 1, "binary"); buffer.write("\u0007", 1, 1, "binary"); buffer.write("\u0000", 2, 1, "binary"); buffer.write("\u0001", 3, 1, "binary"); buffer.write("\u0000", 4, 1, "binary"); buffer.write("\u0000", 5, 1, "binary"); buffer.write("\u0000", 6, 1, "binary"); buffer.write("\u0000", 7, 1, "binary"); buffer.write("\u0000", 8, 1, "binary"); buffer.write("\u0000", 9, 1, "binary"); localConnection.end(buffer); return; } if(data[3] == 4) { console.log("error: unsupported address type: 0x04 (IPv6 address)"); var buffer = new Buffer(10); buffer.write("\u0005", 0, 1, "binary"); buffer.write("\u0008", 1, 1, "binary"); buffer.write("\u0000", 2, 1, "binary"); buffer.write("\u0001", 3, 1, "binary"); buffer.write("\u0000", 4, 1, "binary"); buffer.write("\u0000", 5, 1, "binary"); buffer.write("\u0000", 6, 1, "binary"); buffer.write("\u0000", 7, 1, "binary"); buffer.write("\u0000", 8, 1, "binary"); buffer.write("\u0000", 9, 1, "binary"); localConnection.end(buffer); return; } if(data[3] == 1) { remoteAddress = data[4] + "." + data[5] + "." + data[6] + "." + data[7]; remotePort = data.readUInt16BE(8); } if(data[3] == 3) { var remoteAddressLength = data[4]; remoteAddress = data.slice(5, 5 + remoteAddressLength).toString("binary"); remotePort = data.readUInt16BE(5 + remoteAddressLength); } console.log("localConnection.remoteAddress: " + remoteAddress); console.log("localConnection.remotePort: " + remotePort); var i = Math.floor(Math.random() * configuration.REMOTE_PROXY_SERVERS.length); var requestUrl = configuration.REMOTE_PROXY_SERVERS[i].ADDRESS + ":" + configuration.REMOTE_PROXY_SERVERS[i].PORT + "/"; var requestOptions = {}; if(configuration.REMOTE_PROXY_SERVERS[i].TYPE == "HTTP") { if(configuration.PROXY_SERVER.ADDRESS == "") { requestOptions.agent = false; } else { requestOptions.agent = new HTTPAgent(configuration); } requestUrl = "ws://" + requestUrl; } else { if(configuration.REMOTE_PROXY_SERVERS[i].CERTIFICATE.AUTHENTICATION.FILE !== "") { certificates = []; certificatesData = fs.readFileSync(configuration.REMOTE_PROXY_SERVERS[i].CERTIFICATE.AUTHENTICATION.FILE, "utf8"); certificatesData = certificatesData.split("\n"); certificateData = []; for(j = 0; j < certificatesData.length; j = j + 1) { data = certificatesData[j]; if(data.length !== 0) { certificateData.push(data); if(data.match(/-END CERTIFICATE-/)) { certificates.push(certificateData.join("\n")); certificateData = []; } } } requestOptions.ca = certificates; requestOptions.rejectUnauthorized = true; } else { requestOptions.ca = []; requestOptions.rejectUnauthorized = false; } if(configuration.PROXY_SERVER.ADDRESS == "") { requestOptions.agent = false; } else { requestOptions.agent = new HTTPSAgent(configuration); } requestUrl = "wss://" + requestUrl; } remoteConnection = new websocket(requestUrl, requestOptions); remoteConnection.on("open", function() { console.log("remoteConnection.open"); var request = {}; request["REMOTE_PROXY_SERVER"] = {}; request["REMOTE_PROXY_SERVER"]["AUTHENTICATION"] = {}; request["REMOTE_PROXY_SERVER"]["AUTHENTICATION"]["USERNAME"] = configuration.REMOTE_PROXY_SERVERS[i].AUTHENTICATION.USERNAME; request["REMOTE_PROXY_SERVER"]["AUTHENTICATION"]["PASSWORD"] = configuration.REMOTE_PROXY_SERVERS[i].AUTHENTICATION.PASSWORD; request["REMOTE_ADDRESS"] = remoteAddress request["REMOTE_PORT"] = remotePort var message = JSON.stringify(request); remoteConnection.send(message, {binary: false}); }); remoteConnection.on("message", function(message) { console.log("remoteConnection.message"); if(state == 1) { var response = JSON.parse(message); var buffer = new Buffer(10); buffer.write("\u0005", 0, 1, "binary"); buffer.write("\u0000", 1, 1, "binary"); buffer.write("\u0000", 2, 1, "binary"); buffer.write("\u0001", 3, 1, "binary"); buffer.write("\u0000", 4, 1, "binary"); buffer.write("\u0000", 5, 1, "binary"); buffer.write("\u0000", 6, 1, "binary"); buffer.write("\u0000", 7, 1, "binary"); buffer.write("\u0000", 8, 1, "binary"); buffer.write("\u0000", 9, 1, "binary"); if(localConnectionState == 1) { localConnection.write(buffer); } state = 2; return; } if(state == 2) { console.log("remoteConnection.message: messageLength=" + message.length); if(message.length == 0) { if(localConnectionState == 1) { localConnection.resume(); } return; } remoteConnection.send("", {binary: true}); if(localConnectionState == 1) { if(!localConnection.write(message)) { remoteConnection.pause(); } } return; } }); remoteConnection.on("close", function() { console.log("remoteConnection.close"); if(localConnectionState == 1) { localConnection.end(); } }); remoteConnection.on("error", function(error) { console.log("remoteConnection.error"); console.log("error: " + error.toString()); }); } if(state == 2) { localConnection.pause(); if(remoteConnection.readyState == websocket.OPEN) { remoteConnection.send(data, {binary: true}); } } });