From 2de6514b4b4cc7e9629664faa56859da7e597265 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Mon, 8 Sep 2014 23:03:48 -0400 Subject: [PATCH] Support IP address host in req.subdomains fixes #2308 --- History.md | 1 + lib/request.js | 5 +++- test/req.subdomains.js | 54 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 0499b43633..60c04eebd3 100644 --- a/History.md +++ b/History.md @@ -2,6 +2,7 @@ === * Support `X-Forwarded-Host` in `req.subdomains` + * Support IP address host in `req.subdomains` * deps: connect@2.26.0 - deps: body-parser@~1.8.1 - deps: compression@~1.1.0 diff --git a/lib/request.js b/lib/request.js index 485c2962eb..24e8748d21 100644 --- a/lib/request.js +++ b/lib/request.js @@ -13,6 +13,7 @@ var http = require('http') , parse = require('parseurl') , proxyaddr = require('proxy-addr') , mime = connect.mime; +var isIP = require('net').isIP; /** * Request prototype. @@ -454,7 +455,9 @@ req.__defineGetter__('auth', function(){ req.__defineGetter__('subdomains', function(){ var host = this.host; var offset = this.app.get('subdomain offset'); - var subdomains = host.split('.').reverse(); + var subdomains = !isIP(host) + ? host.split('.').reverse() + : [host]; return subdomains.slice(offset); }); diff --git a/test/req.subdomains.js b/test/req.subdomains.js index 2ee4280377..7da382f478 100644 --- a/test/req.subdomains.js +++ b/test/req.subdomains.js @@ -17,6 +17,32 @@ describe('req', function(){ .set('Host', 'tobi.ferrets.example.com') .expect(["ferrets","tobi"], done); }) + + it('should work with IPv4 address', function(done){ + var app = express(); + + app.use(function(req, res){ + res.send(req.subdomains); + }); + + request(app) + .get('/') + .set('Host', '127.0.0.1') + .expect([], done); + }) + + it('should work with IPv6 address', function(done){ + var app = express(); + + app.use(function(req, res){ + res.send(req.subdomains); + }); + + request(app) + .get('/') + .set('Host', '[::1]') + .expect([], done); + }) }) describe('otherwise', function(){ @@ -80,6 +106,34 @@ describe('req', function(){ .set('Host', 'tobi.ferrets.sub.example.com') .expect(["com","example","sub","ferrets","tobi"], done); }) + + it('should return an array with the whole IPv4', function (done) { + var app = express(); + app.set('subdomain offset', 0); + + app.use(function(req, res){ + res.send(req.subdomains); + }); + + request(app) + .get('/') + .set('Host', '127.0.0.1') + .expect(['127.0.0.1'], done); + }) + + it('should return an array with the whole IPv6', function (done) { + var app = express(); + app.set('subdomain offset', 0); + + app.use(function(req, res){ + res.send(req.subdomains); + }); + + request(app) + .get('/') + .set('Host', '[::1]') + .expect(['[::1]'], done); + }) }) describe('when present', function(){