简单的node.js代理通过http服务器http请求

尝试通过制作一个简单的http代理服务器来了解关于node.js的更多信息。 使用场景很简单:用户 – >代理 – >服务器 – >代理 – >用户

下面的代码工作,直到最后一步。 无法findpipe道连接器的输出回到用户的方式。

#!/usr/bin/env node var url = require('url'), http = require('http'), acceptor = http.createServer().listen(3128); acceptor.on('request', function(request, response) { console.log('request ' + request.url); request.pause(); var options = url.parse(request.url); options.headers = request.headers; options.method = request.method; options.agent = false; var connector = http.request(options); request.pipe(connector); request.resume(); // connector.pipe(response); // doesn't work // connector.pipe(request); // doesn't work either }); 

使用tcpflow我看到来自浏览器的传入请求,然后传出代理请求,然后服务器响应回代理。 不知何故,我无法设法重新传回回应给浏览器。

用pipe道实现这个逻辑的正确方法是什么?

你不必“暂停”,只需“pipe道”就可以了

 var connector = http.request(options, function(res) { res.pipe(response, {end:true});//tell 'response' end=true }); request.pipe(connector, {end:true}); 

http请求不会完成,直到你告诉它是'结束';

好。 得到它了。

更新:注意! 正如评论中所报道的那样,这个例子不再适用。 最有可能是由于Streams2 API更改(节点0.9+)

pipe道回到客户端必须发生在连接器的callback,如下所示:

 #!/usr/bin/env node var url = require('url'), http = require('http'), acceptor = http.createServer().listen(3128); acceptor.on('request', function(request, response) { console.log('request ' + request.url); request.pause(); var options = url.parse(request.url); options.headers = request.headers; options.method = request.method; options.agent = false; var connector = http.request(options, function(serverResponse) { serverResponse.pause(); response.writeHeader(serverResponse.statusCode, serverResponse.headers); serverResponse.pipe(response); serverResponse.resume(); }); request.pipe(connector); request.resume(); }); 

我用这个post中的例子来代理http / s请求。 面对曲奇在某处丢失的问题。

所以要解决你需要处理来自代理响应头。

下面的工作示例:

 req = service.request(options, function(res) { response.writeHead(res.statusCode, res.headers); return res.pipe(response, {end: true}); }); request.pipe(req, {end: true});