| %% @author Bob Ippolito <bob@mochimedia.com> |
| %% @copyright 2007 Mochi Media, Inc. |
| %% |
| %% Permission is hereby granted, free of charge, to any person obtaining a |
| %% copy of this software and associated documentation files (the "Software"), |
| %% to deal in the Software without restriction, including without limitation |
| %% the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| %% and/or sell copies of the Software, and to permit persons to whom the |
| %% Software is furnished to do so, subject to the following conditions: |
| %% |
| %% The above copyright notice and this permission notice shall be included in |
| %% all copies or substantial portions of the Software. |
| %% |
| %% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| %% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| %% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| %% THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| %% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| %% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| %% DEALINGS IN THE SOFTWARE. |
| |
| %% @doc Gives a good MIME type guess based on file extension. |
| |
| -module(mochiweb_mime). |
| -author('bob@mochimedia.com'). |
| -export([from_extension/1]). |
| |
| %% @spec from_extension(S::string()) -> string() | undefined |
| %% @doc Given a filename extension (e.g. ".html") return a guess for the MIME |
| %% type such as "text/html". Will return the atom undefined if no good |
| %% guess is available. |
| |
| from_extension(".stl") -> |
| "application/SLA"; |
| from_extension(".stp") -> |
| "application/STEP"; |
| from_extension(".step") -> |
| "application/STEP"; |
| from_extension(".dwg") -> |
| "application/acad"; |
| from_extension(".ez") -> |
| "application/andrew-inset"; |
| from_extension(".ccad") -> |
| "application/clariscad"; |
| from_extension(".drw") -> |
| "application/drafting"; |
| from_extension(".tsp") -> |
| "application/dsptype"; |
| from_extension(".dxf") -> |
| "application/dxf"; |
| from_extension(".xls") -> |
| "application/excel"; |
| from_extension(".unv") -> |
| "application/i-deas"; |
| from_extension(".jar") -> |
| "application/java-archive"; |
| from_extension(".hqx") -> |
| "application/mac-binhex40"; |
| from_extension(".cpt") -> |
| "application/mac-compactpro"; |
| from_extension(".pot") -> |
| "application/vnd.ms-powerpoint"; |
| from_extension(".ppt") -> |
| "application/vnd.ms-powerpoint"; |
| from_extension(".dms") -> |
| "application/octet-stream"; |
| from_extension(".lha") -> |
| "application/octet-stream"; |
| from_extension(".lzh") -> |
| "application/octet-stream"; |
| from_extension(".oda") -> |
| "application/oda"; |
| from_extension(".ogg") -> |
| "application/ogg"; |
| from_extension(".ogm") -> |
| "application/ogg"; |
| from_extension(".pdf") -> |
| "application/pdf"; |
| from_extension(".pgp") -> |
| "application/pgp"; |
| from_extension(".ai") -> |
| "application/postscript"; |
| from_extension(".eps") -> |
| "application/postscript"; |
| from_extension(".ps") -> |
| "application/postscript"; |
| from_extension(".prt") -> |
| "application/pro_eng"; |
| from_extension(".rtf") -> |
| "application/rtf"; |
| from_extension(".smi") -> |
| "application/smil"; |
| from_extension(".smil") -> |
| "application/smil"; |
| from_extension(".sol") -> |
| "application/solids"; |
| from_extension(".vda") -> |
| "application/vda"; |
| from_extension(".xlm") -> |
| "application/vnd.ms-excel"; |
| from_extension(".cod") -> |
| "application/vnd.rim.cod"; |
| from_extension(".pgn") -> |
| "application/x-chess-pgn"; |
| from_extension(".cpio") -> |
| "application/x-cpio"; |
| from_extension(".csh") -> |
| "application/x-csh"; |
| from_extension(".deb") -> |
| "application/x-debian-package"; |
| from_extension(".dcr") -> |
| "application/x-director"; |
| from_extension(".dir") -> |
| "application/x-director"; |
| from_extension(".dxr") -> |
| "application/x-director"; |
| from_extension(".gz") -> |
| "application/x-gzip"; |
| from_extension(".hdf") -> |
| "application/x-hdf"; |
| from_extension(".ipx") -> |
| "application/x-ipix"; |
| from_extension(".ips") -> |
| "application/x-ipscript"; |
| from_extension(".js") -> |
| "application/x-javascript"; |
| from_extension(".skd") -> |
| "application/x-koan"; |
| from_extension(".skm") -> |
| "application/x-koan"; |
| from_extension(".skp") -> |
| "application/x-koan"; |
| from_extension(".skt") -> |
| "application/x-koan"; |
| from_extension(".latex") -> |
| "application/x-latex"; |
| from_extension(".lsp") -> |
| "application/x-lisp"; |
| from_extension(".scm") -> |
| "application/x-lotusscreencam"; |
| from_extension(".mif") -> |
| "application/x-mif"; |
| from_extension(".com") -> |
| "application/x-msdos-program"; |
| from_extension(".exe") -> |
| "application/octet-stream"; |
| from_extension(".cdf") -> |
| "application/x-netcdf"; |
| from_extension(".nc") -> |
| "application/x-netcdf"; |
| from_extension(".pl") -> |
| "application/x-perl"; |
| from_extension(".pm") -> |
| "application/x-perl"; |
| from_extension(".rar") -> |
| "application/x-rar-compressed"; |
| from_extension(".sh") -> |
| "application/x-sh"; |
| from_extension(".shar") -> |
| "application/x-shar"; |
| from_extension(".swf") -> |
| "application/x-shockwave-flash"; |
| from_extension(".sit") -> |
| "application/x-stuffit"; |
| from_extension(".sv4cpio") -> |
| "application/x-sv4cpio"; |
| from_extension(".sv4crc") -> |
| "application/x-sv4crc"; |
| from_extension(".tar.gz") -> |
| "application/x-tar-gz"; |
| from_extension(".tgz") -> |
| "application/x-tar-gz"; |
| from_extension(".tar") -> |
| "application/x-tar"; |
| from_extension(".tcl") -> |
| "application/x-tcl"; |
| from_extension(".texi") -> |
| "application/x-texinfo"; |
| from_extension(".texinfo") -> |
| "application/x-texinfo"; |
| from_extension(".man") -> |
| "application/x-troff-man"; |
| from_extension(".me") -> |
| "application/x-troff-me"; |
| from_extension(".ms") -> |
| "application/x-troff-ms"; |
| from_extension(".roff") -> |
| "application/x-troff"; |
| from_extension(".t") -> |
| "application/x-troff"; |
| from_extension(".tr") -> |
| "application/x-troff"; |
| from_extension(".ustar") -> |
| "application/x-ustar"; |
| from_extension(".src") -> |
| "application/x-wais-source"; |
| from_extension(".zip") -> |
| "application/zip"; |
| from_extension(".tsi") -> |
| "audio/TSP-audio"; |
| from_extension(".au") -> |
| "audio/basic"; |
| from_extension(".snd") -> |
| "audio/basic"; |
| from_extension(".kar") -> |
| "audio/midi"; |
| from_extension(".mid") -> |
| "audio/midi"; |
| from_extension(".midi") -> |
| "audio/midi"; |
| from_extension(".mp2") -> |
| "audio/mpeg"; |
| from_extension(".mp3") -> |
| "audio/mpeg"; |
| from_extension(".mpga") -> |
| "audio/mpeg"; |
| from_extension(".aif") -> |
| "audio/x-aiff"; |
| from_extension(".aifc") -> |
| "audio/x-aiff"; |
| from_extension(".aiff") -> |
| "audio/x-aiff"; |
| from_extension(".m3u") -> |
| "audio/x-mpegurl"; |
| from_extension(".wax") -> |
| "audio/x-ms-wax"; |
| from_extension(".wma") -> |
| "audio/x-ms-wma"; |
| from_extension(".rpm") -> |
| "audio/x-pn-realaudio-plugin"; |
| from_extension(".ram") -> |
| "audio/x-pn-realaudio"; |
| from_extension(".rm") -> |
| "audio/x-pn-realaudio"; |
| from_extension(".ra") -> |
| "audio/x-realaudio"; |
| from_extension(".wav") -> |
| "audio/x-wav"; |
| from_extension(".pdb") -> |
| "chemical/x-pdb"; |
| from_extension(".ras") -> |
| "image/cmu-raster"; |
| from_extension(".gif") -> |
| "image/gif"; |
| from_extension(".ief") -> |
| "image/ief"; |
| from_extension(".jpe") -> |
| "image/jpeg"; |
| from_extension(".jpeg") -> |
| "image/jpeg"; |
| from_extension(".jpg") -> |
| "image/jpeg"; |
| from_extension(".jp2") -> |
| "image/jp2"; |
| from_extension(".png") -> |
| "image/png"; |
| from_extension(".tif") -> |
| "image/tiff"; |
| from_extension(".tiff") -> |
| "image/tiff"; |
| from_extension(".pnm") -> |
| "image/x-portable-anymap"; |
| from_extension(".pbm") -> |
| "image/x-portable-bitmap"; |
| from_extension(".pgm") -> |
| "image/x-portable-graymap"; |
| from_extension(".ppm") -> |
| "image/x-portable-pixmap"; |
| from_extension(".rgb") -> |
| "image/x-rgb"; |
| from_extension(".xbm") -> |
| "image/x-xbitmap"; |
| from_extension(".xwd") -> |
| "image/x-xwindowdump"; |
| from_extension(".iges") -> |
| "model/iges"; |
| from_extension(".igs") -> |
| "model/iges"; |
| from_extension(".mesh") -> |
| "model/mesh"; |
| from_extension(".") -> |
| ""; |
| from_extension(".msh") -> |
| "model/mesh"; |
| from_extension(".silo") -> |
| "model/mesh"; |
| from_extension(".vrml") -> |
| "model/vrml"; |
| from_extension(".wrl") -> |
| "model/vrml"; |
| from_extension(".css") -> |
| "text/css"; |
| from_extension(".htm") -> |
| "text/html"; |
| from_extension(".html") -> |
| "text/html"; |
| from_extension(".asc") -> |
| "text/plain"; |
| from_extension(".c") -> |
| "text/plain"; |
| from_extension(".cc") -> |
| "text/plain"; |
| from_extension(".f90") -> |
| "text/plain"; |
| from_extension(".f") -> |
| "text/plain"; |
| from_extension(".hh") -> |
| "text/plain"; |
| from_extension(".m") -> |
| "text/plain"; |
| from_extension(".txt") -> |
| "text/plain"; |
| from_extension(".rtx") -> |
| "text/richtext"; |
| from_extension(".sgm") -> |
| "text/sgml"; |
| from_extension(".sgml") -> |
| "text/sgml"; |
| from_extension(".tsv") -> |
| "text/tab-separated-values"; |
| from_extension(".jad") -> |
| "text/vnd.sun.j2me.app-descriptor"; |
| from_extension(".etx") -> |
| "text/x-setext"; |
| from_extension(".xml") -> |
| "application/xml"; |
| from_extension(".dl") -> |
| "video/dl"; |
| from_extension(".fli") -> |
| "video/fli"; |
| from_extension(".flv") -> |
| "video/x-flv"; |
| from_extension(".gl") -> |
| "video/gl"; |
| from_extension(".mp4") -> |
| "video/mp4"; |
| from_extension(".mpe") -> |
| "video/mpeg"; |
| from_extension(".mpeg") -> |
| "video/mpeg"; |
| from_extension(".mpg") -> |
| "video/mpeg"; |
| from_extension(".mov") -> |
| "video/quicktime"; |
| from_extension(".qt") -> |
| "video/quicktime"; |
| from_extension(".viv") -> |
| "video/vnd.vivo"; |
| from_extension(".vivo") -> |
| "video/vnd.vivo"; |
| from_extension(".asf") -> |
| "video/x-ms-asf"; |
| from_extension(".asx") -> |
| "video/x-ms-asx"; |
| from_extension(".wmv") -> |
| "video/x-ms-wmv"; |
| from_extension(".wmx") -> |
| "video/x-ms-wmx"; |
| from_extension(".wvx") -> |
| "video/x-ms-wvx"; |
| from_extension(".avi") -> |
| "video/x-msvideo"; |
| from_extension(".movie") -> |
| "video/x-sgi-movie"; |
| from_extension(".mime") -> |
| "www/mime"; |
| from_extension(".ice") -> |
| "x-conference/x-cooltalk"; |
| from_extension(".vrm") -> |
| "x-world/x-vrml"; |
| from_extension(".spx") -> |
| "audio/ogg"; |
| from_extension(".xhtml") -> |
| "application/xhtml+xml"; |
| from_extension(".bz2") -> |
| "application/x-bzip2"; |
| from_extension(".doc") -> |
| "application/msword"; |
| from_extension(".z") -> |
| "application/x-compress"; |
| from_extension(".ico") -> |
| "image/x-icon"; |
| from_extension(".bmp") -> |
| "image/bmp"; |
| from_extension(".m4a") -> |
| "audio/mpeg"; |
| from_extension(".csv") -> |
| "text/csv"; |
| from_extension(".eot") -> |
| "application/vnd.ms-fontobject"; |
| from_extension(".m4v") -> |
| "video/mp4"; |
| from_extension(".svg") -> |
| "image/svg+xml"; |
| from_extension(".svgz") -> |
| "image/svg+xml"; |
| from_extension(".ttc") -> |
| "application/x-font-ttf"; |
| from_extension(".ttf") -> |
| "application/x-font-ttf"; |
| from_extension(".vcf") -> |
| "text/x-vcard"; |
| from_extension(".webm") -> |
| "video/web"; |
| from_extension(".webp") -> |
| "image/web"; |
| from_extension(".woff") -> |
| "application/x-font-woff"; |
| from_extension(".otf") -> |
| "font/opentype"; |
| from_extension(_) -> |
| undefined. |
| |
| %% |
| %% Tests |
| %% |
| -ifdef(TEST). |
| -include_lib("eunit/include/eunit.hrl"). |
| |
| exhaustive_from_extension_test() -> |
| T = mochiweb_cover:clause_lookup_table(?MODULE, from_extension), |
| [?assertEqual(V, from_extension(K)) || {K, V} <- T]. |
| |
| from_extension_test() -> |
| ?assertEqual("text/html", |
| from_extension(".html")), |
| ?assertEqual(undefined, |
| from_extension("")), |
| ?assertEqual(undefined, |
| from_extension(".wtf")), |
| ok. |
| |
| -endif. |