2012-03-16 5 views
4

node-http-proxy을 사용하고 있습니다. 그러나 HTTP 요청을 중계하는 것 외에도 들어오고 나가는 데이터를 청취해야합니다.노드 http-proxy 트래픽을 청취하는 방법은 무엇입니까?

응답 데이터를 가로 채는 것이 내가 고심하고있는 부분입니다. 노드의 ServerResponse 개체 (더 일반적으로 WritableStream 인터페이스)는 'data' 이벤트를 브로드 캐스트하지 않습니다. http-proxy은 ClientResponse 객체 ('data' 이벤트를 브로드 캐스트 함)를 생성하는 자체 내부 요청을 생성하지만이 객체는 프록시 외부에 공개되지 않습니다.

모든 아이디어는 node-http-proxy를 원숭이 패치하지 않거나 응답 객체 주위에 래퍼를 작성하지 않고이를 해결하는 방법이 있습니까?

답변

5

Github의 node-http-proxy 문제에 관련된 문제는 이것이 가능하지 않음을 암시하는 것으로 보입니다.

  • 빠르게 찾을 수 있습니다 프록시는 res 이후
  • res 개체의 writeHead(), write()end() 메소드를 호출된다 : 다른 사람이 미래 시도를 들어, 여기에 내가 문제를 해킹하는 방법입니다 이미 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) 
+0

이 중대하다, 감사합니다! 그러나 실제로 헤더를 클라이언트에 다시 보내기 전에이를 다시 작성해야합니다. 귀하의 예는 데이터를 듣기/녹음 만하고 변경하지는 않습니다. 클라이언트에게 다시 전송되기 전에 실제로 그것을 변경하는 방법에 대한 아이디어가 있습니까? – Tauren

+0

@Tauren - 수정 된 데이터를 전송해야하는 경우 다음 세 가지가 필요합니다. 1. 들어오는 데이터를 읽습니다. 2. 수정합니다. 3. 앞으로 보냅니다. 'node-http-proxy'의 요점은 프록시 프로세스를 캡슐화하는 것입니다. 그리고 여러분의 경우에는별로 도움이되지 않을 것입니다. 따라서 노드의 내장 HTTP 서버와 mikeal의 우수한 [요청 라이브러리] (https://github.com/mikeal/request)를 HTTP 클라이언트로 사용하여 프록시를 패치하는 것이 좋습니다. 피드백에 대해 – zzen

+0

에게 감사드립니다.그 결론은 내가 왔던 결론과 같지만, 그것을 달성하고 노드 -http-proxy를 사용하는 방법이있을 수 있기를 바랬다. 그것은 내 필요의 99 %를 해결하고 있지만,이 문제로 인해 문제가 발생합니다. – Tauren

0

해킹을 시도했지만 제대로 작동하지 않았습니다. 내 유스 케이스는 간단합니다. Android 앱에서 기본 인증으로 보안 설정된 스테이징 서버로 들어오고 나가는 트래픽을 기록하려고합니다.

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

나를위한 솔루션이다. 내 노드 -http-proxy는 항상 500을 반환했습니다 (스테이지에 대한 직접 요청은하지 않았습니다). 어쩌면 인증 헤더가 올바르게 전달되지 않을 수도 있습니다.

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() 

가주의, 이것은 바이너리 컨텐츠를 출력합니다.

2

이것은 간단한 프록시 서버 트래픽을 스니핑하고 콘솔에 쓰기 :

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

이 코드는 어떻게 작동합니까? 브라우저에서 포트 5556을 사용하도록 구성했지만 다른 웹 사이트로 이동할 때 콘솔에 아무것도 나타나지 않습니다 ... – Valip

관련 문제