Skip to content

Commit 4edbb62

Browse files
pachireljcrugzz
authored andcommitted
Keep original letter case of response header keys (#1098)
* Keep original letter case of response header keys * Support node older than v0.11.6 messege.rawHeaders was added in v0.11.6 * Extract duplicated logic to method
1 parent 69cf892 commit 4edbb62

File tree

3 files changed

+46
-13
lines changed

3 files changed

+46
-13
lines changed

lib/http-proxy/passes/web-outgoing.js

+25-10
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,34 @@ module.exports = { // <--
8383
* @api private
8484
*/
8585
writeHeaders: function writeHeaders(req, res, proxyRes, options) {
86-
var rewriteCookieDomainConfig = options.cookieDomainRewrite;
86+
var rewriteCookieDomainConfig = options.cookieDomainRewrite,
87+
setHeader = function(key, header) {
88+
if (header != undefined) {
89+
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
90+
header = common.rewriteCookieDomain(header, rewriteCookieDomainConfig);
91+
}
92+
res.setHeader(String(key).trim(), header);
93+
}
94+
};
95+
8796
if (typeof rewriteCookieDomainConfig === 'string') { //also test for ''
8897
rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig };
8998
}
90-
Object.keys(proxyRes.headers).forEach(function(key) {
91-
var header = proxyRes.headers[key];
92-
if (header != undefined) {
93-
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
94-
header = common.rewriteCookieDomain(header, rewriteCookieDomainConfig);
95-
}
96-
res.setHeader(String(key).trim(), header);
97-
}
98-
});
99+
100+
// message.rawHeaders is added in: v0.11.6
101+
// https://nodejs.org/api/http.html#http_message_rawheaders
102+
if (proxyRes.rawHeaders != undefined) {
103+
for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) {
104+
var key = proxyRes.rawHeaders[i];
105+
var header = proxyRes.rawHeaders[i + 1];
106+
setHeader(key, header);
107+
};
108+
} else {
109+
Object.keys(proxyRes.headers).forEach(function(key) {
110+
var header = proxyRes.headers[key];
111+
setHeader(key, header);
112+
});
113+
}
99114
},
100115

101116
/**

test/lib-http-proxy-passes-web-outgoing-test.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,18 @@ describe('lib/http-proxy/passes/web-outgoing.js', function () {
234234
hey: 'hello',
235235
how: 'are you?',
236236
'set-cookie': 'hello; domain=my.domain; path=/'
237-
}
237+
},
238+
rawHeaders: [
239+
'Hey', 'hello',
240+
'How', 'are you?',
241+
'Set-Cookie', 'hello; domain=my.domain; path=/'
242+
]
238243
};
239244
this.res = {
240245
setHeader: function(k, v) {
241-
this.headers[k] = v;
246+
// https://nodejs.org/api/http.html#http_message_headers
247+
// Header names are lower-cased
248+
this.headers[k.toLowerCase()] = v;
242249
},
243250
headers: {}
244251
};
@@ -260,7 +267,7 @@ describe('lib/http-proxy/passes/web-outgoing.js', function () {
260267

261268
expect(this.res.headers['set-cookie']).to.eql('hello; domain=my.domain; path=/');
262269
});
263-
270+
264271
it('rewrites domain', function() {
265272
var options = {
266273
cookieDomainRewrite: 'my.new.domain'
@@ -294,6 +301,12 @@ describe('lib/http-proxy/passes/web-outgoing.js', function () {
294301
'hello-on-my.old.domain; domain=my.old.domain; path=/',
295302
'hello-on-my.special.domain; domain=my.special.domain; path=/'
296303
];
304+
var setCookieValueIndex = this.proxyRes.rawHeaders.indexOf('Set-Cookie') + 1;
305+
this.proxyRes.rawHeaders[setCookieValueIndex] = [
306+
'hello-on-my.domain; domain=my.domain; path=/',
307+
'hello-on-my.old.domain; domain=my.old.domain; path=/',
308+
'hello-on-my.special.domain; domain=my.special.domain; path=/'
309+
];
297310

298311
httpProxy.writeHeaders({}, this.res, this.proxyRes, options);
299312

test/lib-http-proxy-test.js

+5
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,11 @@ describe('lib/http-proxy.js', function() {
148148
method: 'GET'
149149
}, function(res) {
150150
expect(res.statusCode).to.eql(200);
151+
expect(res.headers['content-type']).to.eql('text/plain');
152+
if (res.rawHeaders != undefined) {
153+
expect(res.rawHeaders.indexOf('Content-Type')).not.to.eql(-1);
154+
expect(res.rawHeaders.indexOf('text/plain')).not.to.eql(-1);
155+
}
151156

152157
res.on('data', function (data) {
153158
expect(data.toString()).to.eql('Hello from ' + ports.source);

0 commit comments

Comments
 (0)