通过管道http服务器简单的node.js代理HTTP请求(Simple node.js proxy

2019-07-04 00:40发布

试图通过制作一个简单的HTTP代理服务器,以了解更多有关的node.js。 使用场景很简单:用户 - >代理 - >服务器 - >代理 - >用户

下面的代码工作,直到最后一步。 找不到办法管连接器的输出返回给用户。

#!/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我看到从浏览器传入的请求,则传出代理请求,则服务器响应返回给代理。 不知怎的,我更不知道如何重新发送响应返回给浏览器。

什么是执行与管这种逻辑的正确方法?

Answer 1:

你没有“暂停”,只是“管”是确定

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

HTTP请求将无法完成,直到你告诉它是“结束”;



Answer 2:

好。 得到它了。

更新:NB! 正如评论报道,这个例子不工作了。 最有可能是由于Streams2 API变化(节点0.9+)

管道返回给客户端具有连接器的回调中发生如下:

#!/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();
});


Answer 3:

我使用的例子,从这个帖子的代理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});


文章来源: Simple node.js proxy by piping http server to http request