2012-02-19 3 views
0

У меня возникла простая проблема с получением ответа тело двойного проксированного запроса с использованием node.js и node-http-proxy.node.js Прокси-запрос тела

Что я в основном пытаюсь сделать, это установить IP-адрес и порт моего сервера в Chrome в качестве прокси-сервера (который работает), который затем проксирует запрос другому серверу.

Вот как я это делаю:

var ip = {'xx.xx.xx.xx', 8080}; 

var proxy = new httpProxy.HttpProxy({ 
    target: { 
     port : ip[0], host : ip[1] 
    } 
}); 

var server = http.createServer(function(req, res) { 
    proxy.proxyRequest(req, res); 
    proxy.on('data', function() { console.log(data);}); 
}).listen(8001) 

К сожалению, ни один из «данных» события работают для меня здесь ... «Конец» события не являются, но мне никогда не удавалось получить тела. Кто-нибудь знает, как добиться этого? Мне нужно сохранить тело каждого запроса в конкретный файл.

ответ

1

Да ... это не в моей голове. Обратите внимание, что я подключаюсь к порту 80, поскольку большинство веб-сайтов обслуживает порт 80. Измените код для вашего конкретного варианта использования. Это в CoffeeScript.

Log Заголовки запросов:

fs = require('fs') 
httpProxy = require('http-proxy') 

fsw = fs.createWriteStream('myfile.txt', flags: 'a', mode: 0666, encoding: 'utf8') 
server = httpProxy.createServer (req, res, proxy) -> 
      req.connection.pipe(fsw) #runs in parallel with the proxy... don't you love Node.js? 
      proxy.proxyRequest(req, res, { 
      host: require('url').parse(req.url).hostname, 
      port: 80 
      }) 
server.listen(8080) 

JS Translation

Помещенные 'локальный' и порт 8080 для вашего браузера прокси. Это работает для вас?

Вход Запрос кузова:

fs = require('fs') 
httpProxy = require('http-proxy') 


server = httpProxy.createServer (req, res, proxy) -> 
      body = '' 
      req.on 'data', (chunk) -> 
      body += chunk 

      req.on 'end', -> 
      fs.writeFile('mybody.txt', body, 'utf8') 

      proxy.proxyRequest(req, res, { 
      host: require('url').parse(req.url).hostname, 
      port: 80 
      }) 
server.listen(8080) 

Я испытал это и может подтвердить, что она входит в тело POST/PUT.

Log Response Body:

fsw = fs.createWriteStream('myfile.txt', flags: 'a', mode: 0666, encoding: 'utf8') 
server = httpProxy.createServer (req, res, proxy) -> 
    oldwrite = res.write 
    res.write = (data, encoding, fd) -> 
    fsw.write(data) 
    res.write = oldwrite 
    res.write(data, encoding, fd) 
    res.write = oldwrite #<--- patch again before we leave the method 


    proxy.proxyRequest(req, res, { 
    host: require('url').parse(req.url).hostname, 
    port: 80 
    }) 

server.listen(8080) 

не может быть чистым способом, но я могу подтвердить, что это работает.

+0

Да, я просто заметил, что вы напрямую проксимируете сайт. Мне нужен вторичный прокси в 'proxy.ProxyRequest();'. Поэтому я изменил его и да, ничего в файле, он создан, но пуст. – Tom

+0

Упс! Я обновил свой ответ. –

+0

Все еще ничего не трубит! :( – Tom