UNPKG

@scuba-squad/acceptable

Version:

Content negotiation middleware for Express and Restify

55 lines (41 loc) 1.38 kB
'use strict'; // include dependencies const {flatten} = require('underscore'); const mime = require('mime'); const debug = require('debug')('@scuba-squad:acceptable'); const acceptable = (...accept) => { debug('build:acceptable(%o)', accept); accept = flatten(accept) .map((value) => { value = `${value}`.trim().toLowerCase(); const ext = mime.getExtension(value); const type = mime.getType(value); if (ext) { return value; } else if (type) { return type; } debug('error:Invalid extension or mime/type of %o', value); throw new TypeError('Invalid extension or mime/type provided'); }); // empty accept so allow any mime/type if (!accept.length) { accept.push('*/*'); } debug('build:acceptable mime/type = %o', accept); return (req, res, next) => { debug('call:acceptable(req, res, next)'); if (req.accepts(accept)) { debug('success:URL %s accepts %s', req.url, req.headers.accept); return next(); } const error = new Error(); error.code = 406; error.status = 'Not Acceptable'; error.message = `The requested document can not be provided as ${req.headers.accept}`; debug('error:URL %s does not accept %s', req.url, req.headers.accept); return next(error); }; }; // export middleware as commonjs module module.exports = acceptable;