diff options
Diffstat (limited to 'deps/npm/node_modules/request/node_modules/mime-types/index.js')
-rw-r--r-- | deps/npm/node_modules/request/node_modules/mime-types/index.js | 217 |
1 files changed, 171 insertions, 46 deletions
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/index.js b/deps/npm/node_modules/request/node_modules/mime-types/index.js index b46a202f5..9edf72b75 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/index.js +++ b/deps/npm/node_modules/request/node_modules/mime-types/index.js @@ -1,63 +1,188 @@ +/*! + * 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 -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] +/** + * Module variables. + * @private + */ + +var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/ +var textTypeRegExp = /^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) -Object.keys(db).forEach(function (name) { - var mime = db[name] - var exts = mime.extensions - if (!exts || !exts.length) return - exports.extensions[name] = exts - exts.forEach(function (ext) { - exports.types[ext] = name - }) -}) - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - // remove any leading paths, though we should just use path.basename - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} +// Populate the extensions/types maps +populateMaps(exports.extensions, exports.types) -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - // to do: use media-typer - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} +/** + * Get the default charset for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function charset(type) { + if (!type || typeof type !== 'string') { + return false + } -// type has to be an exact mime type -exports.charset = function (type) { - var mime = db[type] - if (mime && mime.charset) return mime.charset + // TODO: use media-typer + var match = extractTypeRegExp.exec(type) + var mime = match && db[match[1].toLowerCase()] + + if (mime && mime.charset) { + return mime.charset + } // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' + if (match && textTypeRegExp.test(match[1])) { + return 'UTF-8' + } return false } -// backwards compatibility -exports.charsets = { - lookup: exports.charset +/** + * 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 = extractTypeRegExp.exec(type) + + // get extensions + var exts = match && exports.extensions[match[1].toLowerCase()] + + if (!exts || !exts.length) { + return false + } + + return exts[0] } -// to do: maybe use set-type module or something -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() +/** + * 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 type + + 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 + return + } + } + + // set the extension -> mime + types[extension] = type + } + }) } |