diff --git a/lib/request.js b/lib/request.js index 1eb7f9ca16a..547ab2338c8 100644 --- a/lib/request.js +++ b/lib/request.js @@ -75,10 +75,10 @@ req.header = function header(name) { switch (lc) { case 'referer': case 'referrer': - return this.headers.referrer - || this.headers.referer; + return getHeader(this.headers, 'referrer') + || getHeader(this.headers, 'referer'); default: - return this.headers[lc]; + return getHeader(this.headers, lc); } }; @@ -525,3 +525,26 @@ function defineGetter(obj, name, getter) { get: getter }); } + +/** + * Get a header value with case-insensitive matching. + * + * @param {Object} headers + * @param {String} name + * @return {String} + * @private + */ + +function getHeader(headers, name) { + var value = headers[name]; + + if (value !== undefined) { + return value; + } + + for (var key in headers) { + if (key.toLowerCase() === name) { + return headers[key]; + } + } +} diff --git a/test/req.get.js b/test/req.get.js index e73d109c84a..92aba2a71c4 100644 --- a/test/req.get.js +++ b/test/req.get.js @@ -20,6 +20,23 @@ describe('req', function(){ .expect('application/json', done); }) + it('should return header field value set with non-lowercase key', function (done) { + var app = express() + + app.use(function (req, res, next) { + req.headers['X-Filipe'] = 'filipe' + next() + }) + + app.use(function (req, res) { + res.end(req.get('x-filipe')) + }) + + request(app) + .get('/') + .expect('filipe', done) + }) + it('should special-case Referer', function(done){ var app = express();