node.js - 从管道 HTTP 流中删除 header

标签 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 服务器来接收请求,并且为了提供服务,它需要调用第一个服务器。 (例如,当我们有一个 Web 应用程序需要调用给定的 RESTful 端点时,这是一个经典场景)。

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从第一台服务器发送的响应中的 header 。我肯定想要整个有效负载,并且我想要其响应中的一些 header ,但肯定不是全部。

例如,我想避免发送诸如代理验证或连接之类的 header ,或任何被视为逐跳 header 的 header 。另外,如果我希望第二个服务器以这种方式运行,我想考虑不发回保持事件的可能性,等等。

我知道如何在传递响应之前添加 header ,但是一旦通过管道传输,我不知道如何从正在通过管道传输的响应中删除 header 。

不要误会我的意思,我知道我可以通过订阅事件然后自己构建响应来做到这一点,但我想知道如果我通过管道传递响应,这是否仍然可能。

有人知道如何实现这个技巧吗?

最佳答案

根据我使用 pipe 的测试,只有有效负载被通过管道传输,而不是 header 。

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

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);

关于node.js - 从管道 HTTP 流中删除 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29199204/

相关文章:

android - WebRTC 使用 Peerjs 和原生 Android/iOS 客户端

javascript - Node.js 中的包和模块有什么区别

node.js - 在 'end' 事件触发之前写入流

javascript - Node.js "write after end"错误

node.js - 从azure blob下载excel文件并处理其数据,无需将文件保存到本地目录

Node.js。如何将多个流(数组或链)传递到管道中?

javascript - Node 控制台中的 "Object"对象与 Web 控制台中的对象

javascript - 从现有代理实例中检索原始目标对象

javascript - 使用node.js渲染API响应正文内容

node.js - 即使Ghost/Node处于开发模式,刷新浏览器后,为什么我的官方Ghost.org Docker容器仍可提供旧内容?