node.jsloggingwebsockethttp-proxytraffic

How to log the websocket traffic data through node http-proxy


I want to proxy websockets through http-proxy, I can log the receive data, but I can't get the send data from the proxy. how can I do ?

#!/usr/bin/env node

var wstarget = 'ws://localhost:8080/?r='+(Date.now() / 1000 | 0);

var httpProxy = require('http-proxy');
var http = require('http');

var proxy = httpProxy.createProxyServer({});

proxy.on('open', function (proxySocket) {
 proxySocket.on('data', function (data) {
    //console.log('\n'+data);
    console.log('',data);  // Just log the receive data! Can't get the Send data?
 });
});

var server = http.createServer();

server.on('upgrade', function (req, socket, head) {
  console.log("Proxying websocket connection to "+wstarget);
  proxy.ws(req, socket, head, {
   target: wstarget,
   changeOrigin: true,
   ws: true});
});

server.listen(8881);

Solution

  • I found the answer !

     ...
    
     var WsParser = require('simples/lib/parsers/ws'); // npm install simples
    
     proxy.on('open', function (proxySocket) {
     proxySocket.on('data', function (data) {
        console.log('Down:'+data);
        console.log('',data);
     });
    
    });
    
    proxy.on('proxyReqWs', function(proxyReq, req, socket, options, head) {
    
        var parser = new WsParser(0, false);
    
        socket.pipe(parser);
    
        parser.on('frame', function (frame) {
          // handle the frame
          console.log('Up:',frame);
          console.log('Up data:'+frame.data);
          /*
            The structure of a frame:
            {
              data: buffer,
              fin: boolean,
              length: int,
              masked: boolean,
              opcode: int
            }
          */
        });
    
    });
    
    ...