Удалить заголовки из потокового 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);
Другие вопросы по тегам