123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- 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;
- }
- }
- };
|