| var url = require('url'), |
| common = require('../common'); |
| |
| |
| var redirectRegex = /^201|30(1|2|7|8)$/; |
| |
| /*! |
| * Array of passes. |
| * |
| * A `pass` is just a function that is executed on `req, res, options` |
| * so that you can easily add new checks while still keeping the base |
| * flexible. |
| */ |
| |
| module.exports = { // <-- |
| |
| /** |
| * If is a HTTP 1.0 request, remove chunk headers |
| * |
| * @param {ClientRequest} Req Request object |
| * @param {IncomingMessage} Res Response object |
| * @param {proxyResponse} Res Response object from the proxy request |
| * |
| * @api private |
| */ |
| removeChunked: function removeChunked(req, res, proxyRes) { |
| if (req.httpVersion === '1.0') { |
| delete proxyRes.headers['transfer-encoding']; |
| } |
| }, |
| |
| /** |
| * If is a HTTP 1.0 request, set the correct connection header |
| * or if connection header not present, then use `keep-alive` |
| * |
| * @param {ClientRequest} Req Request object |
| * @param {IncomingMessage} Res Response object |
| * @param {proxyResponse} Res Response object from the proxy request |
| * |
| * @api private |
| */ |
| setConnection: function setConnection(req, res, proxyRes) { |
| if (req.httpVersion === '1.0') { |
| proxyRes.headers.connection = req.headers.connection || 'close'; |
| } else if (req.httpVersion !== '2.0' && !proxyRes.headers.connection) { |
| proxyRes.headers.connection = req.headers.connection || 'keep-alive'; |
| } |
| }, |
| |
| setRedirectHostRewrite: function setRedirectHostRewrite(req, res, proxyRes, options) { |
| if ((options.hostRewrite || options.autoRewrite || options.protocolRewrite) |
| && proxyRes.headers['location'] |
| && redirectRegex.test(proxyRes.statusCode)) { |
| var target = url.parse(options.target); |
| var u = url.parse(proxyRes.headers['location']); |
| |
| // make sure the redirected host matches the target host before rewriting |
| if (target.host != u.host) { |
| return; |
| } |
| |
| if (options.hostRewrite) { |
| u.host = options.hostRewrite; |
| } else if (options.autoRewrite) { |
| u.host = req.headers['host']; |
| } |
| if (options.protocolRewrite) { |
| u.protocol = options.protocolRewrite; |
| } |
| |
| proxyRes.headers['location'] = u.format(); |
| } |
| }, |
| /** |
| * Copy headers from proxyResponse to response |
| * set each header in response object. |
| * |
| * @param {ClientRequest} Req Request object |
| * @param {IncomingMessage} Res Response object |
| * @param {proxyResponse} Res Response object from the proxy request |
| * @param {Object} Options options.cookieDomainRewrite: Config to rewrite cookie domain |
| * |
| * @api private |
| */ |
| writeHeaders: function writeHeaders(req, res, proxyRes, options) { |
| var rewriteCookieDomainConfig = options.cookieDomainRewrite, |
| rewriteCookiePathConfig = options.cookiePathRewrite, |
| preserveHeaderKeyCase = options.preserveHeaderKeyCase, |
| rawHeaderKeyMap, |
| setHeader = function(key, header) { |
| if (header == undefined) return; |
| if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') { |
| header = common.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain'); |
| } |
| if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') { |
| header = common.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path'); |
| } |
| res.setHeader(String(key).trim(), header); |
| }; |
| |
| if (typeof rewriteCookieDomainConfig === 'string') { //also test for '' |
| rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig }; |
| } |
| |
| if (typeof rewriteCookiePathConfig === 'string') { //also test for '' |
| rewriteCookiePathConfig = { '*': rewriteCookiePathConfig }; |
| } |
| |
| // message.rawHeaders is added in: v0.11.6 |
| // https://nodejs.org/api/http.html#http_message_rawheaders |
| if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) { |
| rawHeaderKeyMap = {}; |
| for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) { |
| var key = proxyRes.rawHeaders[i]; |
| rawHeaderKeyMap[key.toLowerCase()] = key; |
| } |
| } |
| |
| Object.keys(proxyRes.headers).forEach(function(key) { |
| var header = proxyRes.headers[key]; |
| if (preserveHeaderKeyCase && rawHeaderKeyMap) { |
| key = rawHeaderKeyMap[key] || key; |
| } |
| setHeader(key, header); |
| }); |
| }, |
| |
| /** |
| * Set the statusCode from the proxyResponse |
| * |
| * @param {ClientRequest} Req Request object |
| * @param {IncomingMessage} Res Response object |
| * @param {proxyResponse} Res Response object from the proxy request |
| * |
| * @api private |
| */ |
| writeStatusCode: function writeStatusCode(req, res, proxyRes) { |
| // From Node.js docs: response.writeHead(statusCode[, statusMessage][, headers]) |
| if(proxyRes.statusMessage) { |
| res.statusCode = proxyRes.statusCode; |
| res.statusMessage = proxyRes.statusMessage; |
| } else { |
| res.statusCode = proxyRes.statusCode; |
| } |
| } |
| |
| }; |