2015-03-22 2 views
2

Чтобы дать краткий пример того, что я хочу добиться, представьте себе, мы сервер HTTP уже обслуживаем данный запрос:Удалить заголовки из централизованного потока 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).

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, или любого из тех, которые считаются заголовками hop-by-hop. Кроме того, я хотел бы рассмотреть возможность не отправлять обратно сохранить права, если это то, как я хочу, чтобы мой второй сервер работал, и т. Д.

Я знаю, как добавлять заголовки до отправки ответа, но после того, не имеют понятия, как я могу удалить заголовки из ответного сообщения.

Не поймите меня неправильно, я знаю, что смогу это сделать, подписавшись на события, а затем создав ответ самостоятельно, но я хочу знать, возможно ли это, если я напишу ответы.

Кто-нибудь знает, как снять этот трюк?

ответ

4

От моего тестирования с помощью трубы, только полезная нагрузка получает трубку, а не заголовки.

Откройте консоль разработчика Chrome (Firebug на Firefox, 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); 
+0

Интересно, я предположил, что вся полезная нагрузка будет передана по трубопроводу, но вы правы, только тело передается по трубопроводу, заголовки игнорируются. Интересно, когда в ответ добавляется заголовок Connection: keep-alive. Это не в начале запросов, но это определенно доходит до браузера. –

Смежные вопросы