diff --git a/lib/context.js b/lib/context.js index a0a9cb7..93de857 100644 --- a/lib/context.js +++ b/lib/context.js @@ -179,6 +179,7 @@ delegate(proto, 'request') .access('url') .getter('subdomains') .getter('protocol') + .getter('hostname') .getter('header') .getter('secure') .getter('stale') diff --git a/lib/request.js b/lib/request.js index 8e1db36..719e99b 100644 --- a/lib/request.js +++ b/lib/request.js @@ -173,11 +173,11 @@ module.exports = { }, /** - * Parse the "Host" header field hostname + * Parse the "Host" header field host * and support X-Forwarded-Host when a * proxy is enabled. * - * @return {String} + * @return {String} hostname:port * @api public */ @@ -186,7 +186,7 @@ module.exports = { var host = proxy && this.get('X-Forwarded-Host'); host = host || this.get('Host'); if (!host) return; - return host.split(/\s*,\s*/)[0].split(':')[0]; + return host.split(/\s*,\s*/)[0]; }, /** @@ -200,6 +200,21 @@ module.exports = { this.req.headers.host = val; }, + /** + * Parse the "Host" header field hostname + * and support X-Forwarded-Host when a + * proxy is enabled. + * + * @return {String} hostname + * @api public + */ + + get hostname() { + var host = this.host; + if (!host) return; + return host.split(':')[0]; + }, + /** * Check if the request is fresh, aka * Last-Modified and/or the ETag diff --git a/test/request/host.js b/test/request/host.js index ee29d2c..7b3a0e9 100644 --- a/test/request/host.js +++ b/test/request/host.js @@ -2,10 +2,10 @@ var request = require('../context').request; describe('req.host', function(){ - it('should return host void of port', function(){ + it('should return host with port', function(){ var req = request(); req.header.host = 'foo.com:3000'; - req.host.should.equal('foo.com'); + req.host.should.equal('foo.com:3000'); }) describe('when X-Forwarded-Host is present', function(){ diff --git a/test/request/hostname.js b/test/request/hostname.js new file mode 100644 index 0000000..e60b95b --- /dev/null +++ b/test/request/hostname.js @@ -0,0 +1,31 @@ + +var request = require('../context').request; + +describe('req.hostname', function(){ + it('should return hostname void of port', function(){ + var req = request(); + req.header.host = 'foo.com:3000'; + req.hostname.should.equal('foo.com'); + }) + + describe('when X-Forwarded-Host is present', function(){ + describe('and proxy is not trusted', function(){ + it('should be ignored', function(){ + var req = request(); + req.header['x-forwarded-host'] = 'bar.com'; + req.header['host'] = 'foo.com'; + req.hostname.should.equal('foo.com') + }) + }) + + describe('and proxy is trusted', function(){ + it('should be used', function(){ + var req = request(); + req.app.proxy = true; + req.header['x-forwarded-host'] = 'bar.com, baz.com'; + req.header['host'] = 'foo.com'; + req.hostname.should.equal('bar.com') + }) + }) + }) +})