2012-10-06 13 views
17

Sto usando node-http-proxy e voglio guardare per una risposta particolare intestazione e riscriverlo se necessario. Qualcuno qui ha suggerimenti su fare questo?Riscrivi le intestazioni di risposta con il nodo-http-proxy

Il mio server proxy si trova di fronte a un paio di server di nodi diversi come come una webapp java. L'app java sta impostando un cookie, ma il cookie ha un percorso relativo al contesto dell'app web. Ho bisogno del cookie per essere sicuro e avere un percorso per effettuare il root senza modificare l'applicazione Java .

In altre parole, la seguente intestazione viene restituito:

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

e mi piacerebbe riscrivere il valore Path to:

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

Io non sono chiare come farei questo utilizzando node-http-proxy. Suggerimenti? C'è del middleware per aiutare con questo?

+0

Nel caso in cui qualcun altro si imbattesse in questa domanda, il middleware gzip connect utilizza uno schema che potrebbe essere in grado di risolvere il mio problema. Ho hackerato il mio middleware basato sull'implementazione di gzip, ma non ho avuto il tempo di farlo funzionare pienamente. Tuttavia, sembra che funzionerà con un po 'più di tweaking. Consulta https://github.com/nodejitsu/node-http-proxy/blob/master/examples/middleware/gzip-middleware.js – Tauren

risposta

24

È possibile ottenere ciò sovraccaricando la funzione writeHead dell'oggetto risposta. Ad esempio, questo codice imposterà l'intestazione di risposta 'foo' al valore 'bar'. Ho indicato dove è possibile aggiungere la propria logica per modificare i valori dell'intestazione.

JavaScript non è la mia lingua principale, quindi potrebbe esserci un modo più idiomatico di sovraccaricare il metodo 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

Grazie! Questa risposta è essenzialmente la stessa di quello che ho finito per fare. Ho semplicemente dimenticato di tornare qui e aggiungere la risposta. Ho trovato un esempio di come farlo esaminando questo codice: https://github.com/nateps/connect-gzip/blob/master/lib/gzip.js – Tauren

-1

Non ho testato questo codice, ma dovrebbe consentire di modificare l'intestazione prima di inviare la richiesta. Fammi sapere se funziona.

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

Il tuo codice imposta un'intestazione sulla richiesta. Devo modificare un'intestazione sulla * risposta *. – Tauren

Problemi correlati