You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*! * mime-types * Copyright(c) 2014 Jonathan Ong * Copyright(c) 2015 Douglas Christopher Wilson * MIT Licensed */
'use strict'
/** * Module dependencies. * @private */
var db = require('mime-db') var extname = require('path').extname
/** * Module variables. * @private */
var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ var TEXT_TYPE_REGEXP = /^text\//i
/** * Module exports. * @public */
exports.charset = charset exports.charsets = { lookup: charset } exports.contentType = contentType exports.extension = extension exports.extensions = Object.create(null) exports.lookup = lookup exports.types = Object.create(null)
// Populate the extensions/types maps
populateMaps(exports.extensions, exports.types)
/** * Get the default charset for a MIME type. * * @param {string} type * @return {boolean|string} */
function charset (type) { if (!type || typeof type !== 'string') { return false }
// TODO: use media-typer
var match = EXTRACT_TYPE_REGEXP.exec(type) var mime = match && db[match[1].toLowerCase()]
if (mime && mime.charset) { return mime.charset }
// default text/* to utf-8
if (match && TEXT_TYPE_REGEXP.test(match[1])) { return 'UTF-8' }
return false }
/** * Create a full Content-Type header given a MIME type or extension. * * @param {string} str * @return {boolean|string} */
function contentType (str) { // TODO: should this even be in this module?
if (!str || typeof str !== 'string') { return false }
var mime = str.indexOf('/') === -1 ? exports.lookup(str) : str
if (!mime) { return false }
// TODO: use content-type or other module
if (mime.indexOf('charset') === -1) { var charset = exports.charset(mime) if (charset) mime += '; charset=' + charset.toLowerCase() }
return mime }
/** * Get the default extension for a MIME type. * * @param {string} type * @return {boolean|string} */
function extension (type) { if (!type || typeof type !== 'string') { return false }
// TODO: use media-typer
var match = EXTRACT_TYPE_REGEXP.exec(type)
// get extensions
var exts = match && exports.extensions[match[1].toLowerCase()]
if (!exts || !exts.length) { return false }
return exts[0] }
/** * Lookup the MIME type for a file path/extension. * * @param {string} path * @return {boolean|string} */
function lookup (path) { if (!path || typeof path !== 'string') { return false }
// get the extension ("ext" or ".ext" or full path)
var extension = extname('x.' + path) .toLowerCase() .substr(1)
if (!extension) { return false }
return exports.types[extension] || false }
/** * Populate the extensions and types maps. * @private */
function populateMaps (extensions, types) { // source preference (least -> most)
var preference = ['nginx', 'apache', undefined, 'iana']
Object.keys(db).forEach(function forEachMimeType (type) { var mime = db[type] var exts = mime.extensions
if (!exts || !exts.length) { return }
// mime -> extensions
extensions[type] = exts
// extension -> mime
for (var i = 0; i < exts.length; i++) { var extension = exts[i]
if (types[extension]) { var from = preference.indexOf(db[types[extension]].source) var to = preference.indexOf(mime.source)
if (types[extension] !== 'application/octet-stream' && (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { // skip the remapping
continue } }
// set the extension -> mime
types[extension] = type } }) }
|