2012-10-06 25 views
17

Używam node-http-proxy i chcę obejrzeć konkretny nagłówek odpowiedzi i przepisać go w razie potrzeby. Czy ktoś tutaj ma sugestie, aby to zrobić?Przepisz nagłówki odpowiedzi za pomocą węzła-http-proxy

Mój serwer proxy znajduje się naprzeciwko kilku różnych serwerów węzłów jako oraz aplikacji webowej java. Aplikacja java ustawia plik cookie, ale plik cookie ma ścieżkę, która jest względna w kontekście aplikacji internetowej. Potrzebuję pliku cookie, aby być bezpiecznym i mieć ścieżkę do katalogu głównego bez modyfikowania aplikacji Java .

Innymi słowy, zwracana jest następujący nagłówek:

set-cookie: MYSPECIALCOOKIE=679b6291-d1cc-47be; Path=/app; HttpOnly 

I chciałbym przepisać wartość ścieżki do:

set-cookie: MYSPECIALCOOKIE=679b6291-d1cc-47be; Path=/; HttpOnly; Secure 

nie jestem jasne, w jaki sposób mogę to zrobić za pomocą węzła-http-proxy. Propozycje? Czy istnieje oprogramowanie pośrednie, aby pomóc w tym?

+0

Jeśli ktoś inny natknie się na to pytanie, oprogramowanie pośredniczące gzip connect używa wzorca, który może rozwiązać mój problem. Zhackowałem własne oprogramowanie pośrednie oparte na implementacji gzip, ale nie poświęcałem czasu na jego pełną pracę. Wygląda jednak na to, że będzie działać z nieco większym dostosowaniem. Sprawdź https://github.com/nodejitsu/node-http-proxy/blob/master/examples/middleware/gzip-middleware.js – Tauren

Odpowiedz

24

Można to osiągnąć poprzez przeciążenie funkcji writeHead obiektu odpowiedzi. Na przykład ten kod ustawi nagłówek odpowiedzi "foo" na wartość "bar". Wskazałem, gdzie możesz dodać własną logikę, aby zmienić wartości nagłówka.

JavaScript nie jest moim podstawowym językiem, więc może istnieć bardziej idiomatyczny sposób na przeciążenie metody writeHead.

httpProxy = require('http-proxy'); 

httpProxy.createServer(function (req, res, proxy) { 

    res.oldWriteHead = res.writeHead; 
    res.writeHead = function(statusCode, headers) { 
    /* add logic to change headers here */ 
    var contentType = res.getHeader('content-type'); 
    res.setHeader('content-type', 'text/plain'); 

    // old way: might not work now 
    // as headers param is not always provided 
    // https://github.com/nodejitsu/node-http-proxy/pull/260/files 
    // headers['foo'] = 'bar';  

    res.oldWriteHead(statusCode, headers); 
    } 

    proxy.proxyRequest(req, res, { 
    host: 'localhost', 
    port: 3000 
    }); 
}).listen(8000); 
+1

Dzięki! Ta odpowiedź jest w zasadzie taka sama, jak to, co zrobiłem. Po prostu zapomniałem tu wrócić i dodać odpowiedź. Znalazłem przykład, jak to zrobić, badając ten kod: https://github.com/nateps/connect-gzip/blob/master/lib/gzip.js – Tauren

-1

Nie przetestowałem tego kodu, ale powinien on umożliwić edycję nagłówka przed wysłaniem żądania. Daj znać czy działa.

var httpProxy = require('http-proxy'); 

var server = httpProxy.createServer(function (req, res, proxy) { 
    var buffer = httpProxy.buffer(req); 
    req.headers['x-host'] = process.env.PROXY_URI; 
    proxy.proxyRequest(req, res, { 
    host: '127.0.0.1', 
    port: 9000, 
    }); 
}); 
+1

Twój kod ustawia nagłówek w żądaniu. Muszę zmienić nagłówek w * odpowiedzi *. – Tauren

Powiązane problemy