Удалить заголовки из потокового 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);
Теперь мне нравится идея передать исходный запрос ответом на внутренний запрос, сделанный вторым сервером, это довольно удобно, и это именно то, что мне нужно. Но прежде чем отправить ответ обратно клиенту, я хотел бы получить возможность удалить все заголовки переходов из ответа, отправленного с первого сервера. Я хочу получить всю полезную информацию наверняка, и мне нужны некоторые заголовки в ее ответе, но, конечно, не все.
Например, я хотел бы избежать отправки заголовков, таких как Proxy-Authenticate или Connection, или любого из тех, которые считаются переходными заголовками. Кроме того, я хотел бы рассмотреть возможность отказа от повторной отправки сообщений, если я так хочу, чтобы мой второй сервер работал и т. Д.
Я знаю, как добавить заголовки перед доставкой ответа, но после передачи по каналу я понятия не имею, как можно удалить заголовки из передаваемого ответа.
Не поймите меня неправильно, я знаю, что я мог бы сделать это, подписавшись на события, а затем самостоятельно составив ответ, но я хочу знать, возможно ли это все же, если я собираю ответы.
Кто-нибудь знает, как осуществить этот трюк?
1 ответ
Из моего тестирования с pipe, только полезные данные передаются по конвейеру, а не заголовки.
Откройте консоль разработчика 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);