如何监听节点的http-proxy流量?

zze*_*zen 4 proxy http node.js

我正在使用node-http-proxy.但是,除了中继HTTP请求之外,我还需要监听传入和传出的数据.

拦截响应数据是我在努力的地方.节点的ServerResponse对象(更一般地说,WritableStream接口)不会广播'data'事件.http-proxy似乎创建了它自己的内部请求,它产生一个ClientResponse对象(它确实广播了'data'事件)但是这个对象不会公开地暴露在代理之外.

如果没有猴子修补node-http-proxy或在响应对象周围创建包装器,如何解决这个问题?

zze*_*zen 5

关于Github上node-http-proxy问题的相关问题似乎暗示这是不可能的.对于其他人未来的尝试,以下是我如何破解这个问题:

  • 你会很快发现代理只是调用writeHead(),write()而对象的end()方法res
  • 既然res已经是EventEmitter,你可以开始发布新的自定义事件
  • 监听这些新事件以汇编响应数据然后使用它
var eventifyResponse = function(res) {
  var methods = ['writeHead', 'write', 'end'];
  methods.forEach(function(method){
    var oldMethod = res[method]; // remember original method
    res[method] = function() {   // replace with a wrapper
      oldMethod.apply(this, arguments); // call original method
      arguments = Array.prototype.slice.call(arguments, 0);
      arguments.unshift("method_" + method);
      this.emit.apply(this, arguments); // broadcast the event
    };
  });
};

res = eventifyResponse(res), outputData = '';

res.on('method_writeHead', function(statusCode, headers) { saveHeaders(); });
res.on('method_write',     function(data) { outputData += data; });
res.on('method_end',       function(data) { use_data(outputData + data); });
proxy.proxyRequest(req, res, options)
Run Code Online (Sandbox Code Playgroud)