У меня есть следующий прокси 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 безрезультатно.Сейчас я рассматриваю возможность использования фьючерсов.
Если у кого-то есть понимание, это очень ценится.