3

我有以下 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 进行同步调用但无济于事。我现在正在考虑使用期货。

如果有人有任何见解,将不胜感激。

4

0 回答 0