Тело запроса прокси-узла - PullRequest
       21

Тело запроса прокси-узла

0 голосов
/ 19 февраля 2012

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

Что я в основном пытаюсь сделать, это установить 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 Ответ

1 голос
/ 19 февраля 2012

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

Заголовки запроса журнала:

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

Поставьте localhost и порт 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.

Тело ответа журнала:

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)

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

...