148 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
| };
 |