Node.js - помогите перехватывать пакеты - PullRequest
3 голосов
/ 31 января 2012

У меня есть следующий прокси 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, он работает нормально, потому что тамэто всего лишь один запрос-ответ с сайта. Однако яf Я перехожу на сайт www.google.com (сайт с несколькими запросами), сайт не загружается, и я получаю ошибки кодирования контента.

У меня есть спагетти с обратным вызовом, и мне становится трудно понять, чтопроисходит в моей программе.Я смотрел на попытки сделать синхронные вызовы ZEROMQ безрезультатно.Сейчас я рассматриваю возможность использования фьючерсов.

Если у кого-то есть понимание, это очень ценится.

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