Search code examples
node.jssocketsproxywebsocketnode-http-proxy

Node proxy web sockets how to check


I use the following module and it works fine for reverse proxy https://github.com/nodejitsu/node-http-proxy currently I've used the code like the following example

httpProxy.createServer({
  target: 'ws://localhost:9014',
  ws: true
}).listen(8014);

my question is how can I check/simulate that the websockets are working? Any test will be helpful...


Solution

  • In response to the OP's request for browser test, I modified my original solution to proxy both HTTP and WS traffic to a server where an index.html file is served. This file then connects the browser to the proxy server via WebSocket, which the proxy then proxies to the main server. A simple message is printed on the browser document from the main server.

    So that there is no need to copy/paste anything, I created this repo with full instruction: https://github.com/caasjj/httpproxy.git

    Here is the code in case others want to look at it here. To run the whole thing, create the two server files and the index.html file, start the servers with node proxyreceiver.js and node proxyserver.js and then navigate to localhost:8014/index.html.

    (proxyserver.js):

    var httpProxy = require('http-proxy');
    var http = require('http');
    
    var proxy = new httpProxy.createProxyServer({
      target: {
        host: 'localhost',
        port: 9014
      }
    });
    var proxyServer = http.createServer(function (req, res) {
      proxy.web(req, res);
    });
    
    //
    // Listen to the `upgrade` event and proxy the
    // WebSocket requests as well.
    //
    proxyServer.on('upgrade', function (req, socket, head) {
      proxy.ws(req, socket, head);
    });
    
    proxyServer.listen(8014);
    

    (proxyreceiver.js):

    var app = require('http').createServer(handler)
    var io = require('socket.io')(app);
    var fs = require('fs');
    
    app.listen(9014);
    
    function handler (req, res) {
        res.writeHead(200);
        fs.readFile('index.html', function(err, data){
          res.end(data);
        })
    
    }
    
    io.on('connection', function (socket) {
    
      socket.emit('data', { message: 'Hello World!' });
    
      socket.on('resp', function(msg) {
        console.log('Got message: ', msg);
      });
    
    });
    

    (index.html):

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Web Socket Proxy Test</title>
      <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
      <script>
        var socket = io('http://localhost:8014');
        var p = document.createElement("p")
        socket.on('data', function (data) {
           console.log('Got', data);
           p.innerHTML = "Received:" + data.message;
           document.body.appendChild(p);
        });
    </script>
    </head>
    <body>
      <h1>Test ProxyServer</h1>
    </body>
    </html>