add request.hostname(getter), fixed #224

make request.host and request.hostname work as node url lib
http://nodejs.org/api/url.html#url_url
this commit will change older request.host(getter)
This commit is contained in:
dead_horse 2014-02-26 14:03:05 +08:00
parent e8d3a37e9e
commit 72a9b69146
4 changed files with 53 additions and 6 deletions

View file

@ -179,6 +179,7 @@ delegate(proto, 'request')
.access('url') .access('url')
.getter('subdomains') .getter('subdomains')
.getter('protocol') .getter('protocol')
.getter('hostname')
.getter('header') .getter('header')
.getter('secure') .getter('secure')
.getter('stale') .getter('stale')

View file

@ -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 * and support X-Forwarded-Host when a
* proxy is enabled. * proxy is enabled.
* *
* @return {String} * @return {String} hostname:port
* @api public * @api public
*/ */
@ -186,7 +186,7 @@ module.exports = {
var host = proxy && this.get('X-Forwarded-Host'); var host = proxy && this.get('X-Forwarded-Host');
host = host || this.get('Host'); host = host || this.get('Host');
if (!host) return; 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; 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 * Check if the request is fresh, aka
* Last-Modified and/or the ETag * Last-Modified and/or the ETag
@ -579,4 +594,4 @@ module.exports = {
header: this.header header: this.header
} }
} }
}; };

View file

@ -2,10 +2,10 @@
var request = require('../context').request; var request = require('../context').request;
describe('req.host', function(){ describe('req.host', function(){
it('should return host void of port', function(){ it('should return host with port', function(){
var req = request(); var req = request();
req.header.host = 'foo.com:3000'; 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(){ describe('when X-Forwarded-Host is present', function(){

31
test/request/hostname.js Normal file
View file

@ -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')
})
})
})
})