mirror of
https://github.com/fooflington/selfdefined.git
synced 2025-06-13 05:55:26 +00:00
120 lines
3.8 KiB
JavaScript
120 lines
3.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;
|
|||
|
if (typeof rewriteCookieDomainConfig === 'string') { //also test for ''
|
|||
|
rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig };
|
|||
|
}
|
|||
|
Object.keys(proxyRes.headers).forEach(function(key) {
|
|||
|
var header = proxyRes.headers[key];
|
|||
|
if (header != undefined) {
|
|||
|
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
|
|||
|
header = common.rewriteCookieDomain(header, rewriteCookieDomainConfig);
|
|||
|
}
|
|||
|
res.setHeader(String(key).trim(), 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.writeHead(proxyRes.statusCode, proxyRes.statusMessage);
|
|||
|
} else {
|
|||
|
res.writeHead(proxyRes.statusCode);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
};
|