Как прослушать трафик http-прокси узла? - PullRequest
4 голосов
/ 16 марта 2012

Я использую node-http-proxy .Однако помимо ретрансляции HTTP-запросов мне также необходимо прослушивать входящие и исходящие данные.

Я пытаюсь перехватить ответные данные.Объект Node's ServerResponse (а в более общем смысле - интерфейс WritableStream) не передает событие 'data'.http-proxy, похоже, создает свой собственный внутренний запрос, который создает объект ClientResponse (который передает событие 'data'), однако этот объект не доступен публично вне прокси.monkey-patching node-http-proxy или создание оболочки вокруг объекта ответа?

Ответы [ 3 ]

5 голосов
/ 22 марта 2012

Похоже, что проблема в узле-http-proxy на Github подразумевает, что это невозможно. Для будущих попыток других, вот как я взломал вопрос:

  • вы быстро обнаружите, что прокси вызывает только 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)
2 голосов
/ 24 августа 2015

Это простой прокси-сервер, отслеживающий трафик и записывающий его в консоль:

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

//
// Create a proxy server with custom application logic
//
var proxy = httpProxy.createProxyServer({});

// assign events
proxy.on('proxyRes', function (proxyRes, req, res) {

    // collect response data
    var proxyResData='';
    proxyRes.on('data', function (chunk) {
        proxyResData +=chunk;
    });
    proxyRes.on('end',function () {


        var snifferData =
        {
            request:{
                data:req.body,
                headers:req.headers,
                url:req.url,
                method:req.method},
            response:{
                data:proxyResData,
                headers:proxyRes.headers,
                statusCode:proxyRes.statusCode}
        };
        console.log(snifferData);
    });

    //    console.log('RAW Response from the target', JSON.stringify(proxyRes.headers, true, 2));
});


proxy.on('proxyReq', function(proxyReq, req, res, options) {
    // collect request data
    req.body='';
    req.on('data', function (chunk) {
        req.body +=chunk;
    });
    req.on('end', function () {
    });

});

proxy.on('error',
    function(err)
    {
        console.error(err);
    });

// run the proxy server
var server = http.createServer(function(req, res) {

    // every time a request comes proxy it:
    proxy.web(req, res, {
        target: 'http://localhost:4444'
    });

});

console.log("listening on port 5556")
server.listen(5556);
0 голосов
/ 28 августа 2013

Я попробовал твой взлом, но у меня это не сработало. Мой пример использования прост: я хочу регистрировать входящий и исходящий трафик из приложения Android на наш промежуточный сервер, который защищен базовой аутентификацией.

https://github.com/greim/hoxy/

было решением для меня. Мой node-http-proxy всегда возвращал 500 (в то время как прямой запрос к stage не делал). Возможно, заголовки авторизации не будут перенаправлены правильно или что-то в этом роде.

Hoxy отлично работал с самого начала.

npm install hoxy [-g]
hoxy --port=<local-port> --stage=<your stage host>:<port>

В качестве правил ведения журнала я указал:

request: $aurl.log()
request: @log-headers()
request: $method.log()
request: $request-body.log()


response: $url.log()
response: $status-code.log()
response: $response-body.log()

Осторожно, это печатает любой двоичный контент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...