node.js代理请求体

时间:2012-02-19 17:06:55

标签: node.js proxy request

我在使用node.jsnode-http-proxy获取双重代理请求的响应主体时遇到了一个简单的问题。

我基本上尝试做的是将Chrome中的服务器的IP和端口设置为代理(可以工作),然后将请求代理到其他服务器。

我是这样做的:

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)

不幸的是,这里没有任何“on data”事件对我有用......“结束”事件是,但我从来没有设法得到尸体。有谁知道如何实现这一目标?我需要将每个请求的正文保存到特定文件中。

1 个答案:

答案 0 :(得分:1)

是的......这不是我的头脑。请注意,我代表端口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)

可能不是最干净的方式,但我可以确认它有效。