Skip to content

Instantly share code, notes, and snippets.

@delvedor
Created November 18, 2017 17:08
Show Gist options
  • Save delvedor/0cbb4aadefc5384ae17ad8305ea567e8 to your computer and use it in GitHub Desktop.
Save delvedor/0cbb4aadefc5384ae17ad8305ea567e8 to your computer and use it in GitHub Desktop.
Routing based on the accept header
'use strict'
const assert = require('assert')
const Router = require('find-my-way')
const semver = require('semver')
function AcceptRouter (opts) {
if (!(this instanceof AcceptRouter)) {
return new AcceptRouter(opts)
}
this.opts = opts
this.accepts = {}
}
AcceptRouter.prototype.on = function on (method, path, version, handler, store) {
assert(semver.valid(version), 'The version should be a semver compatible string')
if (!this.hasRouter(version)) {
this.accepts[version] = Router(this.opts)
this.accepts[version].on(method, path, handler, store)
} else {
this.accepts[version].on(method, path, handler, store)
}
}
AcceptRouter.prototype.getRouter = function getVersion (version) {
const versions = Object.keys(this.accepts)
for (var i = 0, len = versions.length; i < len; i++) {
if (semver.satisfies(versions[i], version)) {
return this.accepts[versions[i]]
}
}
return null
}
AcceptRouter.prototype.hasRouter = function getVersion (version) {
const versions = Object.keys(this.accepts)
for (var i = 0, len = versions.length; i < len; i++) {
if (semver.satisfies(versions[i], version)) {
return true
}
}
return false
}
AcceptRouter.prototype.lookup = function lookup (req, res) {
var version = req.headers['accept-version']
if (!this.validVersion(version)) {
res.statusCode = 400
return res.end('Invalid version')
}
var router = this.getRouter(version)
if (router === null) {
res.statusCode = 400
res.end(`Version '${version}' is not supported`)
} else {
router.lookup(req, res)
}
}
AcceptRouter.prototype.validVersion = function validVersion (version) {
try {
semver.validRange(version)
return true
} catch (e) {}
try {
semver.valid(version)
return true
} catch (e) {}
return false
}
module.exports = AcceptRouter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment