从管道HTTP流中删除标头

时间:2015-03-22 20:02:17

标签: node.js node.js-stream

为了举例说明我想要实现的目标,假设我们已经有一台HTTP服务器已经在服务给定的请求:

require('http').createServer(function(req, res) {
    var payload = new Buffer('Hello World\n', 'utf8');
    res.writeHead(200, {
        'Content-Type': 'text/plain',
        'Content-Length': payload.length,
        'Connection': 'Keep-Alive'
    });
    res.end(payload);
}).listen(8888);

现在,考虑是否存在接收请求的第二个HTTP服务器,并且为了服务它,它需要调用第一个服务器。 (例如,当我们有一个需要调用给定RESTful端点的Web应用程序时的经典场景。)

var http = require('http');
http.createServer(function(req, res) {

    var fwdrq = http.request({
        hostname: 'localhost',
        port: 8888,
        path: '/',
        method: 'GET'
    });

    fwdrq.on('response',function(response){
        response.pipe(res);
    });

    fwdrq.on('error', function(error){
        console.log(error);
    });

    fwdrq.end();

}).listen(9999);

现在,我喜欢将原始请求与第二台服务器完成的内部请求的响应相结合的想法,这非常方便,这正是我所需要的。但在我将响应发送回客户端之前,我希望有机会从第一台服务器发送的响应中删除任何hop-by-hop标头。我确实需要整个有效负载,我想在其响应中使用一些标头,但肯定不是全部。

例如,我想避免发送像Proxy-Authenticate或Connection这样的标头,或任何被认为是逐跳标头的标头。此外,我还想考虑是否有可能不再发回保留,如果这就是我希望我的第二台服务器运行等等。

我知道如何在传递响应之前添加标头,但是一旦传输,我就不知道如何从被传输的响应中删除标头。

不要误解我的意思,我知道我可以通过订阅事件然后自己建立响应来做到这一点,但我想知道如果我正在处理响应,这是否仍然存在。< / p>

有没有人知道怎么做这个伎俩?

1 个答案:

答案 0 :(得分:3)

从我使用管道进行测试时,只有有效负载会被管道传输而不是标头。

打开Chrome开发者控制台(Firefox上的Firebug,桌面上的Fiddler)并查看从服务器返回的HTTP响应。来自上游服务器的标头不会返回给最终用户。如果您在代理服务器上手动添加标头,您将看到它们确实显示给最终用户。

var http = require('http');

http.createServer(function(req, res) {
    var payload = new Buffer('Hello World\n', 'utf8');
    res.writeHead(200, {
        'Content-Type': 'text/plain',
        'Content-Length': payload.length,
        'Connection': 'Keep-Alive',
        'UpstreamHeader': 'Test'
    });
    res.end(payload);
}).listen(8888);

http.createServer(function(req, res) {

    var fwdrq = http.request({
        hostname: 'localhost',
        port: 8888,
        path: '/',
        method: 'GET'
    });

    //Uncomment the lines below to add headers from the proxy server
    /*res.writeHead(200, {
        'ProxyHeader': 'Test'
    });*/

    fwdrq.on('response', function(response) {
        response.pipe(res);
    });

    fwdrq.on('error', function(error) {
        console.log(error);
    });

    fwdrq.end();

}).listen(80);