| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 | /*! * 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 = charsetexports.charsets = { lookup: charset }exports.contentType = contentTypeexports.extension = extensionexports.extensions = Object.create(null)exports.lookup = lookupexports.types = Object.create(null)// Populate the extensions/types mapspopulateMaps(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    }  })}
 |