Skip to content

Commit 2c98416

Browse files
Sean Willisindexzero
Sean Willis
authored andcommitted
Adding ability to set cookie path
1 parent 543636d commit 2c98416

File tree

3 files changed

+36
-14
lines changed

3 files changed

+36
-14
lines changed

Diff for: lib/http-proxy/common.js

+16-13
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var common = exports,
55

66
var upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i,
77
isSSL = /^https|wss/,
8-
cookieDomainRegex = /(;\s*domain=)([^;]+)/i;
8+
cookieProps = ['domain', 'path'];
99

1010
/**
1111
* Simple Regex for testing if protocol is https
@@ -211,27 +211,30 @@ common.urlJoin = function() {
211211
*
212212
* @api private
213213
*/
214-
common.rewriteCookieDomain = function rewriteCookieDomain(header, config) {
214+
common.rewriteCookieProperty = function rewriteCookieProperty(header, config, property) {
215+
if(cookieProps.indexOf(property) === -1) //Property not supported
216+
return header;
217+
215218
if (Array.isArray(header)) {
216219
return header.map(function (headerElement) {
217-
return rewriteCookieDomain(headerElement, config);
220+
return rewriteCookieProperty(headerElement, config, property);
218221
});
219222
}
220-
return header.replace(cookieDomainRegex, function(match, prefix, previousDomain) {
221-
var newDomain;
222-
if (previousDomain in config) {
223-
newDomain = config[previousDomain];
223+
return header.replace(new RegExp("(;\\s*" + property + "=)([^;]+)"), function(match, prefix, previousValue) {
224+
var newValue;
225+
if (previousValue in config) {
226+
newValue = config[previousValue];
224227
} else if ('*' in config) {
225-
newDomain = config['*'];
228+
newValue = config['*'];
226229
} else {
227-
//no match, return previous domain
230+
//no match, return previous value
228231
return match;
229232
}
230-
if (newDomain) {
231-
//replace domain
232-
return prefix + newDomain;
233+
if (newValue) {
234+
//replace value
235+
return prefix + newValue;
233236
} else {
234-
//remove domain
237+
//remove value
235238
return '';
236239
}
237240
});

Diff for: lib/http-proxy/passes/web-outgoing.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,16 @@ module.exports = { // <--
8484
*/
8585
writeHeaders: function writeHeaders(req, res, proxyRes, options) {
8686
var rewriteCookieDomainConfig = options.cookieDomainRewrite,
87+
rewriteCookiePathConfig = options.cookiePathRewrite,
8788
preserveHeaderKeyCase = options.preserveHeaderKeyCase,
8889
rawHeaderKeyMap,
8990
setHeader = function(key, header) {
9091
if (header == undefined) return;
9192
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
92-
header = common.rewriteCookieDomain(header, rewriteCookieDomainConfig);
93+
header = common.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain');
94+
}
95+
if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
96+
header = common.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path');
9397
}
9498
res.setHeader(String(key).trim(), header);
9599
};
@@ -98,6 +102,10 @@ module.exports = { // <--
98102
rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig };
99103
}
100104

105+
if (typeof rewriteCookiePathConfig === 'string') { //also test for ''
106+
rewriteCookiePathConfig = { '*': rewriteCookiePathConfig };
107+
}
108+
101109
// message.rawHeaders is added in: v0.11.6
102110
// https://nodejs.org/api/http.html#http_message_rawheaders
103111
if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) {

Diff for: test/lib-http-proxy-passes-web-outgoing-test.js

+11
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,17 @@ describe('lib/http-proxy/passes/web-outgoing.js', function () {
298298
.to.contain('hello; domain=my.domain; path=/');
299299
});
300300

301+
it('rewrites path', function() {
302+
var options = {
303+
cookiePathRewrite: '/dummyPath'
304+
};
305+
306+
httpProxy.writeHeaders({}, this.res, this.proxyRes, options);
307+
308+
expect(this.res.headers['set-cookie'])
309+
.to.contain('hello; domain=my.domain; path=/dummyPath');
310+
});
311+
301312
it('rewrites domain', function() {
302313
var options = {
303314
cookieDomainRewrite: 'my.new.domain'

0 commit comments

Comments
 (0)