Adding ability to set cookie path

This commit is contained in:
Sean Willis 2018-02-20 17:50:59 -08:00 committed by Charlie Robbins
parent 543636d0f6
commit 2c98416ac2
3 changed files with 36 additions and 14 deletions

View File

@ -5,7 +5,7 @@ var common = exports,
var upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i, var upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i,
isSSL = /^https|wss/, isSSL = /^https|wss/,
cookieDomainRegex = /(;\s*domain=)([^;]+)/i; cookieProps = ['domain', 'path'];
/** /**
* Simple Regex for testing if protocol is https * Simple Regex for testing if protocol is https
@ -211,27 +211,30 @@ common.urlJoin = function() {
* *
* @api private * @api private
*/ */
common.rewriteCookieDomain = function rewriteCookieDomain(header, config) { common.rewriteCookieProperty = function rewriteCookieProperty(header, config, property) {
if(cookieProps.indexOf(property) === -1) //Property not supported
return header;
if (Array.isArray(header)) { if (Array.isArray(header)) {
return header.map(function (headerElement) { return header.map(function (headerElement) {
return rewriteCookieDomain(headerElement, config); return rewriteCookieProperty(headerElement, config, property);
}); });
} }
return header.replace(cookieDomainRegex, function(match, prefix, previousDomain) { return header.replace(new RegExp("(;\\s*" + property + "=)([^;]+)"), function(match, prefix, previousValue) {
var newDomain; var newValue;
if (previousDomain in config) { if (previousValue in config) {
newDomain = config[previousDomain]; newValue = config[previousValue];
} else if ('*' in config) { } else if ('*' in config) {
newDomain = config['*']; newValue = config['*'];
} else { } else {
//no match, return previous domain //no match, return previous value
return match; return match;
} }
if (newDomain) { if (newValue) {
//replace domain //replace value
return prefix + newDomain; return prefix + newValue;
} else { } else {
//remove domain //remove value
return ''; return '';
} }
}); });

View File

@ -84,12 +84,16 @@ module.exports = { // <--
*/ */
writeHeaders: function writeHeaders(req, res, proxyRes, options) { writeHeaders: function writeHeaders(req, res, proxyRes, options) {
var rewriteCookieDomainConfig = options.cookieDomainRewrite, var rewriteCookieDomainConfig = options.cookieDomainRewrite,
rewriteCookiePathConfig = options.cookiePathRewrite,
preserveHeaderKeyCase = options.preserveHeaderKeyCase, preserveHeaderKeyCase = options.preserveHeaderKeyCase,
rawHeaderKeyMap, rawHeaderKeyMap,
setHeader = function(key, header) { setHeader = function(key, header) {
if (header == undefined) return; if (header == undefined) return;
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') { if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
header = common.rewriteCookieDomain(header, rewriteCookieDomainConfig); header = common.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain');
}
if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
header = common.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path');
} }
res.setHeader(String(key).trim(), header); res.setHeader(String(key).trim(), header);
}; };
@ -98,6 +102,10 @@ module.exports = { // <--
rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig }; rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig };
} }
if (typeof rewriteCookiePathConfig === 'string') { //also test for ''
rewriteCookiePathConfig = { '*': rewriteCookiePathConfig };
}
// message.rawHeaders is added in: v0.11.6 // message.rawHeaders is added in: v0.11.6
// https://nodejs.org/api/http.html#http_message_rawheaders // https://nodejs.org/api/http.html#http_message_rawheaders
if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) { if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) {

View File

@ -298,6 +298,17 @@ describe('lib/http-proxy/passes/web-outgoing.js', function () {
.to.contain('hello; domain=my.domain; path=/'); .to.contain('hello; domain=my.domain; path=/');
}); });
it('rewrites path', function() {
var options = {
cookiePathRewrite: '/dummyPath'
};
httpProxy.writeHeaders({}, this.res, this.proxyRes, options);
expect(this.res.headers['set-cookie'])
.to.contain('hello; domain=my.domain; path=/dummyPath');
});
it('rewrites domain', function() { it('rewrites domain', function() {
var options = { var options = {
cookieDomainRewrite: 'my.new.domain' cookieDomainRewrite: 'my.new.domain'