blob: 949d957520b020338ebf385419909fcef6b32fe1 [file] [log] [blame]
%% @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.