Node.js - 帮助拦截数据包

时间:2012-01-31 09:35:30

标签: javascript node.js proxy packet intercept

我有以下Node.js代理(http://www.catonmat.net/http-proxy-in-nodejs/)我可以打印出来的数据包:

var http = require('http');
var util=require('util');
var net=require('net');
var context=require('zmq');

http.createServer(function(request, response) {
    var proxy=http.createClient(80,request.headers['host']);
    var proxy_request=proxy.request(request.method,request.url,request.headers);

    proxy_request.addListener('response',function (proxy_response){
        response.writeHead(proxy_response.statusCode,proxy_response.headers);

        proxy_response.addListener('data',function(chunk){
                    util.puts(chunk);   //ok, here is the HTTP body content that I'm interested in...
                    response.write(chunk,'binary');
        });
        proxy_response.addListener('end',function(){
            util.puts("end");
            response.end();
        });

    });


    request.addListener('close',function(){
        //util.puts("close");
    });
    request.addListener('data',function(chunk){
        //util.puts("data");
        proxy_request.write(chunk,'binary');
    });
    request.addListener('end',function(){
        //util.puts("end");
        proxy_request.end();
    });
}).listen(8080);

如果您将浏览器指向127.0.0.1:8080,我可以按预期看到通过代理的流量。

现在,我要做的是将数据包发送到机器上运行的另一个进程进行进一步处理(另一个进程是C程序)。这是通过使用IPC描述符(ipc://myipc.ipc)完成的。 C程序监视此IPC描述符并输出修改后的数据包。

这是我必须执行的Node.js代码:

var requester=context.socket('req');
requester.connect("ipc://myipc.ipc");
requester.on("message",function(reply) {
    util.puts("Received reply: "+reply);
    requester.close();
});
requester.send(chunk);

正在按预期从C程序发回修改的数据包,它们在requester.on('message',function(reply){...});回调中可用。

我的问题是:如何将修改后的数据包发送到response.write([modified packet],'binary')?我试过这个:

    ...
    proxy_response.addListener('data',function(chunk){
        util.puts(chunk);   //prints out the packet I'm interested in
        var requester=context.socket('req');
        requester.connect("ipc://myipc.ipc");
        requester.on("message",function(reply) {
            util.puts("Received reply: "+reply);
            response.write(reply,'binary');
            requester.close();
        });
        requester.send(chunk);
    });
    ...

但它不起作用。这就好像数据包的排序在整个过程中变得混杂在一起。如果我去www.xlhi.com,它工作正常,因为该网站只有一个请求 - 响应。但是,如果我访问www.google.com(一个有多个请求的网站),该网站将无法加载,我会收到内容编码错误。

我有回调意大利面,而且很难理解我的程序中发生了什么。我已经看过尝试同步调用zeromq无济于事。我现在正在考虑使用期货。

如果有人有任何见解,我们非常感激。

0 个答案:

没有答案