diff --git a/lib/router.js b/lib/router.js index 013cd0f94..e14c43a3a 100644 --- a/lib/router.js +++ b/lib/router.js @@ -468,9 +468,16 @@ Router.prototype.find = function find(req, res, callback) { // not the first one. However, if neither the client nor // server specified any version, we're done, because neither // cared - if (routes[i].versions.length === 0 && req.version() === '*') { - r = routes[i]; - break; + if (routes[i].versions.length === 0) { + if (req.version() === '*') { + r = routes[i]; + break; + } + callback(new InvalidVersionError('%s is not supported by %s %s', + req.version() || '?', + req.method, + req.path())); + return; } if (routes[i].versions.length > 0) { diff --git a/test/server.test.js b/test/server.test.js index 1cb51e6b6..a8f8e9c57 100644 --- a/test/server.test.js +++ b/test/server.test.js @@ -1204,6 +1204,47 @@ test('versioned route matching should not throw TypeError' , function (t) { }); +test('GH-652 throw InvalidVersion on version mismatch', function (t) { + function response (req, res, next) { + return res.send(req.route.version); + } + SERVER.get({ path: '/ping', version: '1.0.1' }, response); + SERVER.listen(0, '127.0.0.1', function () { + var opts = { + path: '/ping', + headers: { + 'accept-version': '1.0.2' + } + }; + CLIENT.get(opts, function (err, req, res, data) { + t.equal(res.statusCode, 400); + t.equal(data.code, 'InvalidVersion'); + t.done(); + }); + }); +}); + +test('GH-652 throw InvalidVersion on non-versioned route', function (t) { + function response (req, res, next) { + return res.send(req.route.version); + } + SERVER.get({ path: '/ping' }, response); + SERVER.listen(0, '127.0.0.1', function () { + var opts = { + path: '/ping', + headers: { + 'accept-version': '1.0.1' + } + }; + CLIENT.get(opts, function (err, req, res, data) { + t.equal(res.statusCode, 400); + t.equal(data.code, 'InvalidVersion'); + t.done(); + }); + }); +}); + + test('GH-959 matchedVersion() should return on cached routes', function (t) { SERVER.get({