File Coverage

blib/lib/Plack/MIME.pm
Criterion Covered Total %
statement 9 11 81.8
branch 4 4 100.0
condition n/a
subroutine 3 4 75.0
pod 0 3 0.0
total 16 22 72.7


line stmt bran cond sub pod time code
1             package Plack::MIME;
2 11     11   9389 use strict;
  11         27  
  11         20493  
3              
4             # stolen from rack.mime.rb
5             our $MIME_TYPES = {
6             ".123" => "application/vnd.lotus-1-2-3",
7             ".3dml" => "text/vnd.in3d.3dml",
8             ".3g2" => "video/3gpp2",
9             ".3gp" => "video/3gpp",
10             ".a" => "application/octet-stream",
11             ".acc" => "application/vnd.americandynamics.acc",
12             ".ace" => "application/x-ace-compressed",
13             ".acu" => "application/vnd.acucobol",
14             ".aep" => "application/vnd.audiograph",
15             ".afp" => "application/vnd.ibm.modcap",
16             ".ai" => "application/postscript",
17             ".aif" => "audio/x-aiff",
18             ".aiff" => "audio/x-aiff",
19             ".ami" => "application/vnd.amiga.ami",
20             ".apng" => "image/apng",
21             ".appcache" => "text/cache-manifest",
22             ".apr" => "application/vnd.lotus-approach",
23             ".asc" => "application/pgp-signature",
24             ".asf" => "video/x-ms-asf",
25             ".asm" => "text/x-asm",
26             ".aso" => "application/vnd.accpac.simply.aso",
27             ".asx" => "video/x-ms-asf",
28             ".atc" => "application/vnd.acucorp",
29             ".atom" => "application/atom+xml",
30             ".atomcat" => "application/atomcat+xml",
31             ".atomsvc" => "application/atomsvc+xml",
32             ".atx" => "application/vnd.antix.game-component",
33             ".au" => "audio/basic",
34             ".avi" => "video/x-msvideo",
35             ".avif" => "image/avif",
36             ".bat" => "application/x-msdownload",
37             ".bcpio" => "application/x-bcpio",
38             ".bdm" => "application/vnd.syncml.dm+wbxml",
39             ".bh2" => "application/vnd.fujitsu.oasysprs",
40             ".bin" => "application/octet-stream",
41             ".bmi" => "application/vnd.bmi",
42             ".bmp" => "image/bmp",
43             ".box" => "application/vnd.previewsystems.box",
44             ".btif" => "image/prs.btif",
45             ".bz" => "application/x-bzip",
46             ".bz2" => "application/x-bzip2",
47             ".c" => "text/x-c",
48             ".c4g" => "application/vnd.clonk.c4group",
49             ".cab" => "application/vnd.ms-cab-compressed",
50             ".cc" => "text/x-c",
51             ".ccxml" => "application/ccxml+xml",
52             ".cdbcmsg" => "application/vnd.contact.cmsg",
53             ".cdkey" => "application/vnd.mediastation.cdkey",
54             ".cdx" => "chemical/x-cdx",
55             ".cdxml" => "application/vnd.chemdraw+xml",
56             ".cdy" => "application/vnd.cinderella",
57             ".cer" => "application/pkix-cert",
58             ".cgm" => "image/cgm",
59             ".chat" => "application/x-chat",
60             ".chm" => "application/vnd.ms-htmlhelp",
61             ".chrt" => "application/vnd.kde.kchart",
62             ".cif" => "chemical/x-cif",
63             ".cii" => "application/vnd.anser-web-certificate-issue-initiation",
64             ".cil" => "application/vnd.ms-artgalry",
65             ".cla" => "application/vnd.claymore",
66             ".class" => "application/octet-stream",
67             ".clkk" => "application/vnd.crick.clicker.keyboard",
68             ".clkp" => "application/vnd.crick.clicker.palette",
69             ".clkt" => "application/vnd.crick.clicker.template",
70             ".clkw" => "application/vnd.crick.clicker.wordbank",
71             ".clkx" => "application/vnd.crick.clicker",
72             ".clp" => "application/x-msclip",
73             ".cmc" => "application/vnd.cosmocaller",
74             ".cmdf" => "chemical/x-cmdf",
75             ".cml" => "chemical/x-cml",
76             ".cmp" => "application/vnd.yellowriver-custom-menu",
77             ".cmx" => "image/x-cmx",
78             ".com" => "application/x-msdownload",
79             ".conf" => "text/plain",
80             ".cpio" => "application/x-cpio",
81             ".cpp" => "text/x-c",
82             ".cpt" => "application/mac-compactpro",
83             ".crd" => "application/x-mscardfile",
84             ".crl" => "application/pkix-crl",
85             ".crt" => "application/x-x509-ca-cert",
86             ".csh" => "application/x-csh",
87             ".csml" => "chemical/x-csml",
88             ".csp" => "application/vnd.commonspace",
89             ".css" => "text/css",
90             ".csv" => "text/csv",
91             ".curl" => "application/vnd.curl",
92             ".cww" => "application/prs.cww",
93             ".cxx" => "text/x-c",
94             ".daf" => "application/vnd.mobius.daf",
95             ".davmount" => "application/davmount+xml",
96             ".dcr" => "application/x-director",
97             ".dd2" => "application/vnd.oma.dd2+xml",
98             ".ddd" => "application/vnd.fujixerox.ddd",
99             ".deb" => "application/x-debian-package",
100             ".der" => "application/x-x509-ca-cert",
101             ".dfac" => "application/vnd.dreamfactory",
102             ".diff" => "text/x-diff",
103             ".dis" => "application/vnd.mobius.dis",
104             ".djv" => "image/vnd.djvu",
105             ".djvu" => "image/vnd.djvu",
106             ".dll" => "application/x-msdownload",
107             ".dmg" => "application/octet-stream",
108             ".dna" => "application/vnd.dna",
109             ".doc" => "application/msword",
110             ".docm" => "application/vnd.ms-word.document.macroEnabled.12",
111             ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
112             ".dot" => "application/msword",
113             ".dotm" => "application/vnd.ms-word.template.macroEnabled.12",
114             ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
115             ".dp" => "application/vnd.osgi.dp",
116             ".dpg" => "application/vnd.dpgraph",
117             ".dsc" => "text/prs.lines.tag",
118             ".dtd" => "application/xml-dtd",
119             ".dts" => "audio/vnd.dts",
120             ".dtshd" => "audio/vnd.dts.hd",
121             ".dv" => "video/x-dv",
122             ".dvi" => "application/x-dvi",
123             ".dwf" => "model/vnd.dwf",
124             ".dwg" => "image/vnd.dwg",
125             ".dxf" => "image/vnd.dxf",
126             ".dxp" => "application/vnd.spotfire.dxp",
127             ".ear" => "application/java-archive",
128             ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
129             ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
130             ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
131             ".ecma" => "application/ecmascript",
132             ".edm" => "application/vnd.novadigm.edm",
133             ".edx" => "application/vnd.novadigm.edx",
134             ".efif" => "application/vnd.picsel",
135             ".ei6" => "application/vnd.pg.osasli",
136             ".eml" => "message/rfc822",
137             ".eol" => "audio/vnd.digital-winds",
138             ".eot" => "application/vnd.ms-fontobject",
139             ".eps" => "application/postscript",
140             ".es3" => "application/vnd.eszigno3+xml",
141             ".esf" => "application/vnd.epson.esf",
142             ".etx" => "text/x-setext",
143             ".exe" => "application/x-msdownload",
144             ".ext" => "application/vnd.novadigm.ext",
145             ".ez" => "application/andrew-inset",
146             ".ez2" => "application/vnd.ezpix-album",
147             ".ez3" => "application/vnd.ezpix-package",
148             ".f" => "text/x-fortran",
149             ".f77" => "text/x-fortran",
150             ".f90" => "text/x-fortran",
151             ".fbs" => "image/vnd.fastbidsheet",
152             ".fdf" => "application/vnd.fdf",
153             ".fe_launch" => "application/vnd.denovo.fcselayout-link",
154             ".fg5" => "application/vnd.fujitsu.oasysgp",
155             ".fli" => "video/x-fli",
156             ".flif" => "image/flif",
157             ".flo" => "application/vnd.micrografx.flo",
158             ".flv" => "video/x-flv",
159             ".flw" => "application/vnd.kde.kivio",
160             ".flx" => "text/vnd.fmi.flexstor",
161             ".fly" => "text/vnd.fly",
162             ".fm" => "application/vnd.framemaker",
163             ".fnc" => "application/vnd.frogans.fnc",
164             ".for" => "text/x-fortran",
165             ".fpx" => "image/vnd.fpx",
166             ".fsc" => "application/vnd.fsc.weblaunch",
167             ".fst" => "image/vnd.fst",
168             ".ftc" => "application/vnd.fluxtime.clip",
169             ".fti" => "application/vnd.anser-web-funds-transfer-initiation",
170             ".fvt" => "video/vnd.fvt",
171             ".fzs" => "application/vnd.fuzzysheet",
172             ".g3" => "image/g3fax",
173             ".gac" => "application/vnd.groove-account",
174             ".gdl" => "model/vnd.gdl",
175             ".gem" => "application/octet-stream",
176             ".gemspec" => "text/x-script.ruby",
177             ".ghf" => "application/vnd.groove-help",
178             ".gif" => "image/gif",
179             ".gim" => "application/vnd.groove-identity-message",
180             ".gmx" => "application/vnd.gmx",
181             ".gph" => "application/vnd.flographit",
182             ".gqf" => "application/vnd.grafeq",
183             ".gram" => "application/srgs",
184             ".grv" => "application/vnd.groove-injector",
185             ".grxml" => "application/srgs+xml",
186             ".gtar" => "application/x-gtar",
187             ".gtm" => "application/vnd.groove-tool-message",
188             ".gtw" => "model/vnd.gtw",
189             ".gv" => "text/vnd.graphviz",
190             ".gz" => "application/x-gzip",
191             ".h" => "text/x-c",
192             ".h261" => "video/h261",
193             ".h263" => "video/h263",
194             ".h264" => "video/h264",
195             ".hbci" => "application/vnd.hbci",
196             ".hdf" => "application/x-hdf",
197             ".heic" => "image/heic",
198             ".heics" => "image/heic-sequence",
199             ".heif" => "image/heif",
200             ".heifs" => "image/heif-sequence",
201             ".hh" => "text/x-c",
202             ".hlp" => "application/winhlp",
203             ".hpgl" => "application/vnd.hp-hpgl",
204             ".hpid" => "application/vnd.hp-hpid",
205             ".hps" => "application/vnd.hp-hps",
206             ".hqx" => "application/mac-binhex40",
207             ".htc" => "text/x-component",
208             ".htke" => "application/vnd.kenameaapp",
209             ".htm" => "text/html",
210             ".html" => "text/html",
211             ".hvd" => "application/vnd.yamaha.hv-dic",
212             ".hvp" => "application/vnd.yamaha.hv-voice",
213             ".hvs" => "application/vnd.yamaha.hv-script",
214             ".icc" => "application/vnd.iccprofile",
215             ".ice" => "x-conference/x-cooltalk",
216             ".ico" => "image/vnd.microsoft.icon",
217             ".ics" => "text/calendar",
218             ".ief" => "image/ief",
219             ".ifb" => "text/calendar",
220             ".ifm" => "application/vnd.shana.informed.formdata",
221             ".igl" => "application/vnd.igloader",
222             ".igs" => "model/iges",
223             ".igx" => "application/vnd.micrografx.igx",
224             ".iif" => "application/vnd.shana.informed.interchange",
225             ".imp" => "application/vnd.accpac.simply.imp",
226             ".ims" => "application/vnd.ms-ims",
227             ".ipk" => "application/vnd.shana.informed.package",
228             ".irm" => "application/vnd.ibm.rights-management",
229             ".irp" => "application/vnd.irepository.package+xml",
230             ".iso" => "application/octet-stream",
231             ".itp" => "application/vnd.shana.informed.formtemplate",
232             ".ivp" => "application/vnd.immervision-ivp",
233             ".ivu" => "application/vnd.immervision-ivu",
234             ".jad" => "text/vnd.sun.j2me.app-descriptor",
235             ".jam" => "application/vnd.jam",
236             ".jar" => "application/java-archive",
237             ".java" => "text/x-java-source",
238             ".jisp" => "application/vnd.jisp",
239             ".jlt" => "application/vnd.hp-jlyt",
240             ".jnlp" => "application/x-java-jnlp-file",
241             ".joda" => "application/vnd.joost.joda-archive",
242             ".jp2" => "image/jp2",
243             ".jpeg" => "image/jpeg",
244             ".jpg" => "image/jpeg",
245             ".jpgv" => "video/jpeg",
246             ".jpm" => "video/jpm",
247             ".js" => "text/javascript",
248             ".json" => "application/json",
249             ".karbon" => "application/vnd.kde.karbon",
250             ".kfo" => "application/vnd.kde.kformula",
251             ".kia" => "application/vnd.kidspiration",
252             ".kml" => "application/vnd.google-earth.kml+xml",
253             ".kmz" => "application/vnd.google-earth.kmz",
254             ".kne" => "application/vnd.kinar",
255             ".kon" => "application/vnd.kde.kontour",
256             ".kpr" => "application/vnd.kde.kpresenter",
257             ".ksp" => "application/vnd.kde.kspread",
258             ".ktz" => "application/vnd.kahootz",
259             ".kwd" => "application/vnd.kde.kword",
260             ".latex" => "application/x-latex",
261             ".lbd" => "application/vnd.llamagraphics.life-balance.desktop",
262             ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml",
263             ".les" => "application/vnd.hhe.lesson-player",
264             ".link66" => "application/vnd.route66.link66+xml",
265             ".log" => "text/plain",
266             ".lostxml" => "application/lost+xml",
267             ".lrm" => "application/vnd.ms-lrm",
268             ".ltf" => "application/vnd.frogans.ltf",
269             ".lvp" => "audio/vnd.lucent.voice",
270             ".lwp" => "application/vnd.lotus-wordpro",
271             ".m3u" => "audio/x-mpegurl",
272             ".m3u8" => "application/x-mpegurl",
273             ".m4a" => "audio/mp4a-latm",
274             ".m4v" => "video/mp4",
275             ".ma" => "application/mathematica",
276             ".mag" => "application/vnd.ecowin.chart",
277             ".man" => "text/troff",
278             ".manifest" => "text/cache-manifest",
279             ".mathml" => "application/mathml+xml",
280             ".mbk" => "application/vnd.mobius.mbk",
281             ".mbox" => "application/mbox",
282             ".mc1" => "application/vnd.medcalcdata",
283             ".mcd" => "application/vnd.mcd",
284             ".mdb" => "application/x-msaccess",
285             ".mdi" => "image/vnd.ms-modi",
286             ".mdoc" => "text/troff",
287             ".me" => "text/troff",
288             ".mfm" => "application/vnd.mfmp",
289             ".mgz" => "application/vnd.proteus.magazine",
290             ".mid" => "audio/midi",
291             ".midi" => "audio/midi",
292             ".mif" => "application/vnd.mif",
293             ".mime" => "message/rfc822",
294             ".mj2" => "video/mj2",
295             ".mjs" => "text/javascript",
296             ".mlp" => "application/vnd.dolby.mlp",
297             ".mmd" => "application/vnd.chipnuts.karaoke-mmd",
298             ".mmf" => "application/vnd.smaf",
299             ".mml" => "application/mathml+xml",
300             ".mmr" => "image/vnd.fujixerox.edmics-mmr",
301             ".mng" => "video/x-mng",
302             ".mny" => "application/x-msmoney",
303             ".mov" => "video/quicktime",
304             ".movie" => "video/x-sgi-movie",
305             ".mp3" => "audio/mpeg",
306             ".mp4" => "video/mp4",
307             ".mp4a" => "audio/mp4",
308             ".mp4s" => "application/mp4",
309             ".mp4v" => "video/mp4",
310             ".mpc" => "application/vnd.mophun.certificate",
311             ".mpd" => "application/dash+xml",
312             ".mpeg" => "video/mpeg",
313             ".mpg" => "video/mpeg",
314             ".mpga" => "audio/mpeg",
315             ".mpkg" => "application/vnd.apple.installer+xml",
316             ".mpm" => "application/vnd.blueice.multipass",
317             ".mpn" => "application/vnd.mophun.application",
318             ".mpp" => "application/vnd.ms-project",
319             ".mpy" => "application/vnd.ibm.minipay",
320             ".mqy" => "application/vnd.mobius.mqy",
321             ".mrc" => "application/marc",
322             ".ms" => "text/troff",
323             ".mscml" => "application/mediaservercontrol+xml",
324             ".mseq" => "application/vnd.mseq",
325             ".msf" => "application/vnd.epson.msf",
326             ".msh" => "model/mesh",
327             ".msi" => "application/x-msdownload",
328             ".msl" => "application/vnd.mobius.msl",
329             ".msty" => "application/vnd.muvee.style",
330             ".mts" => "model/vnd.mts",
331             ".mus" => "application/vnd.musician",
332             ".mvb" => "application/x-msmediaview",
333             ".mwf" => "application/vnd.mfer",
334             ".mxf" => "application/mxf",
335             ".mxl" => "application/vnd.recordare.musicxml",
336             ".mxml" => "application/xv+xml",
337             ".mxs" => "application/vnd.triscape.mxs",
338             ".mxu" => "video/vnd.mpegurl",
339             ".n" => "application/vnd.nokia.n-gage.symbian.install",
340             ".nc" => "application/x-netcdf",
341             ".ngdat" => "application/vnd.nokia.n-gage.data",
342             ".nlu" => "application/vnd.neurolanguage.nlu",
343             ".nml" => "application/vnd.enliven",
344             ".nnd" => "application/vnd.noblenet-directory",
345             ".nns" => "application/vnd.noblenet-sealer",
346             ".nnw" => "application/vnd.noblenet-web",
347             ".npx" => "image/vnd.net-fpx",
348             ".nsf" => "application/vnd.lotus-notes",
349             ".oa2" => "application/vnd.fujitsu.oasys2",
350             ".oa3" => "application/vnd.fujitsu.oasys3",
351             ".oas" => "application/vnd.fujitsu.oasys",
352             ".obd" => "application/x-msbinder",
353             ".oda" => "application/oda",
354             ".odc" => "application/vnd.oasis.opendocument.chart",
355             ".odf" => "application/vnd.oasis.opendocument.formula",
356             ".odg" => "application/vnd.oasis.opendocument.graphics",
357             ".odi" => "application/vnd.oasis.opendocument.image",
358             ".odp" => "application/vnd.oasis.opendocument.presentation",
359             ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
360             ".odt" => "application/vnd.oasis.opendocument.text",
361             ".oga" => "audio/ogg",
362             ".ogg" => "application/ogg",
363             ".ogv" => "video/ogg",
364             ".ogx" => "application/ogg",
365             ".org" => "application/vnd.lotus-organizer",
366             ".otc" => "application/vnd.oasis.opendocument.chart-template",
367             ".otf" => "font/otf",
368             ".otg" => "application/vnd.oasis.opendocument.graphics-template",
369             ".oth" => "application/vnd.oasis.opendocument.text-web",
370             ".oti" => "application/vnd.oasis.opendocument.image-template",
371             ".otm" => "application/vnd.oasis.opendocument.text-master",
372             ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
373             ".ott" => "application/vnd.oasis.opendocument.text-template",
374             ".oxt" => "application/vnd.openofficeorg.extension",
375             ".p" => "text/x-pascal",
376             ".p10" => "application/pkcs10",
377             ".p12" => "application/x-pkcs12",
378             ".p7b" => "application/x-pkcs7-certificates",
379             ".p7m" => "application/pkcs7-mime",
380             ".p7r" => "application/x-pkcs7-certreqresp",
381             ".p7s" => "application/pkcs7-signature",
382             ".pas" => "text/x-pascal",
383             ".pbd" => "application/vnd.powerbuilder6",
384             ".pbm" => "image/x-portable-bitmap",
385             ".pcl" => "application/vnd.hp-pcl",
386             ".pclxl" => "application/vnd.hp-pclxl",
387             ".pcx" => "image/x-pcx",
388             ".pdb" => "chemical/x-pdb",
389             ".pdf" => "application/pdf",
390             ".pem" => "application/x-x509-ca-cert",
391             ".pfr" => "application/font-tdpfr",
392             ".pgm" => "image/x-portable-graymap",
393             ".pgn" => "application/x-chess-pgn",
394             ".pgp" => "application/pgp-encrypted",
395             ".pic" => "image/x-pict",
396             ".pict" => "image/pict",
397             ".pkg" => "application/octet-stream",
398             ".pki" => "application/pkixcmp",
399             ".pkipath" => "application/pkix-pkipath",
400             ".pl" => "text/x-script.perl",
401             ".plb" => "application/vnd.3gpp.pic-bw-large",
402             ".plc" => "application/vnd.mobius.plc",
403             ".plf" => "application/vnd.pocketlearn",
404             ".pls" => "application/pls+xml",
405             ".pm" => "text/x-script.perl-module",
406             ".pml" => "application/vnd.ctc-posml",
407             ".png" => "image/png",
408             ".pnm" => "image/x-portable-anymap",
409             ".pntg" => "image/x-macpaint",
410             ".portpkg" => "application/vnd.macports.portpkg",
411             ".pot" => "application/vnd.ms-powerpoint",
412             ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12",
413             ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template",
414             ".ppa" => "application/vnd.ms-powerpoint",
415             ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12",
416             ".ppd" => "application/vnd.cups-ppd",
417             ".ppm" => "image/x-portable-pixmap",
418             ".pps" => "application/vnd.ms-powerpoint",
419             ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
420             ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
421             ".ppt" => "application/vnd.ms-powerpoint",
422             ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
423             ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
424             ".prc" => "application/vnd.palm",
425             ".pre" => "application/vnd.lotus-freelance",
426             ".prf" => "application/pics-rules",
427             ".ps" => "application/postscript",
428             ".psb" => "application/vnd.3gpp.pic-bw-small",
429             ".psd" => "image/vnd.adobe.photoshop",
430             ".ptid" => "application/vnd.pvi.ptid1",
431             ".pub" => "application/x-mspublisher",
432             ".pvb" => "application/vnd.3gpp.pic-bw-var",
433             ".pwn" => "application/vnd.3m.post-it-notes",
434             ".py" => "text/x-script.python",
435             ".pya" => "audio/vnd.ms-playready.media.pya",
436             ".pyv" => "video/vnd.ms-playready.media.pyv",
437             ".qam" => "application/vnd.epson.quickanime",
438             ".qbo" => "application/vnd.intu.qbo",
439             ".qfx" => "application/vnd.intu.qfx",
440             ".qps" => "application/vnd.publishare-delta-tree",
441             ".qt" => "video/quicktime",
442             ".qtif" => "image/x-quicktime",
443             ".qxd" => "application/vnd.quark.quarkxpress",
444             ".ra" => "audio/x-pn-realaudio",
445             ".rake" => "text/x-script.ruby",
446             ".ram" => "audio/x-pn-realaudio",
447             ".rar" => "application/x-rar-compressed",
448             ".ras" => "image/x-cmu-raster",
449             ".rb" => "text/x-script.ruby",
450             ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
451             ".rdf" => "application/rdf+xml",
452             ".rdz" => "application/vnd.data-vision.rdz",
453             ".rep" => "application/vnd.businessobjects",
454             ".rgb" => "image/x-rgb",
455             ".rif" => "application/reginfo+xml",
456             ".rl" => "application/resource-lists+xml",
457             ".rlc" => "image/vnd.fujixerox.edmics-rlc",
458             ".rld" => "application/resource-lists-diff+xml",
459             ".rm" => "application/vnd.rn-realmedia",
460             ".rmp" => "audio/x-pn-realaudio-plugin",
461             ".rms" => "application/vnd.jcp.javame.midlet-rms",
462             ".rnc" => "application/relax-ng-compact-syntax",
463             ".roff" => "text/troff",
464             ".rpm" => "application/x-redhat-package-manager",
465             ".rpss" => "application/vnd.nokia.radio-presets",
466             ".rpst" => "application/vnd.nokia.radio-preset",
467             ".rq" => "application/sparql-query",
468             ".rs" => "application/rls-services+xml",
469             ".rsd" => "application/rsd+xml",
470             ".rss" => "application/rss+xml",
471             ".rtf" => "application/rtf",
472             ".rtx" => "text/richtext",
473             ".ru" => "text/x-script.ruby",
474             ".s" => "text/x-asm",
475             ".saf" => "application/vnd.yamaha.smaf-audio",
476             ".sbml" => "application/sbml+xml",
477             ".sc" => "application/vnd.ibm.secure-container",
478             ".scd" => "application/x-msschedule",
479             ".scm" => "application/vnd.lotus-screencam",
480             ".scq" => "application/scvp-cv-request",
481             ".scs" => "application/scvp-cv-response",
482             ".sdkm" => "application/vnd.solent.sdkm+xml",
483             ".sdp" => "application/sdp",
484             ".see" => "application/vnd.seemail",
485             ".sema" => "application/vnd.sema",
486             ".semd" => "application/vnd.semd",
487             ".semf" => "application/vnd.semf",
488             ".setpay" => "application/set-payment-initiation",
489             ".setreg" => "application/set-registration-initiation",
490             ".sfd" => "application/vnd.hydrostatix.sof-data",
491             ".sfs" => "application/vnd.spotfire.sfs",
492             ".sgm" => "text/sgml",
493             ".sgml" => "text/sgml",
494             ".sh" => "application/x-sh",
495             ".shar" => "application/x-shar",
496             ".shf" => "application/shf+xml",
497             ".sig" => "application/pgp-signature",
498             ".sit" => "application/x-stuffit",
499             ".sitx" => "application/x-stuffitx",
500             ".skp" => "application/vnd.koan",
501             ".slt" => "application/vnd.epson.salt",
502             ".smi" => "application/smil+xml",
503             ".snd" => "audio/basic",
504             ".so" => "application/octet-stream",
505             ".spf" => "application/vnd.yamaha.smaf-phrase",
506             ".spl" => "application/x-futuresplash",
507             ".spot" => "text/vnd.in3d.spot",
508             ".spp" => "application/scvp-vp-response",
509             ".spq" => "application/scvp-vp-request",
510             ".src" => "application/x-wais-source",
511             ".srt" => "text/srt",
512             ".srx" => "application/sparql-results+xml",
513             ".sse" => "application/vnd.kodak-descriptor",
514             ".ssf" => "application/vnd.epson.ssf",
515             ".ssml" => "application/ssml+xml",
516             ".stf" => "application/vnd.wt.stf",
517             ".stk" => "application/hyperstudio",
518             ".str" => "application/vnd.pg.format",
519             ".sus" => "application/vnd.sus-calendar",
520             ".sv4cpio" => "application/x-sv4cpio",
521             ".sv4crc" => "application/x-sv4crc",
522             ".svd" => "application/vnd.svd",
523             ".svg" => "image/svg+xml",
524             ".svgz" => "image/svg+xml",
525             ".swf" => "application/x-shockwave-flash",
526             ".swi" => "application/vnd.arastra.swi",
527             ".t" => "text/troff",
528             ".tao" => "application/vnd.tao.intent-module-archive",
529             ".tar" => "application/x-tar",
530             ".tbz" => "application/x-bzip-compressed-tar",
531             ".tcap" => "application/vnd.3gpp2.tcap",
532             ".tcl" => "application/x-tcl",
533             ".tex" => "application/x-tex",
534             ".texi" => "application/x-texinfo",
535             ".texinfo" => "application/x-texinfo",
536             ".text" => "text/plain",
537             ".tif" => "image/tiff",
538             ".tiff" => "image/tiff",
539             ".tmo" => "application/vnd.tmobile-livetv",
540             ".torrent" => "application/x-bittorrent",
541             ".tpl" => "application/vnd.groove-tool-template",
542             ".tpt" => "application/vnd.trid.tpt",
543             ".tr" => "text/troff",
544             ".tra" => "application/vnd.trueapp",
545             ".trm" => "application/x-msterminal",
546             ".ts" => "video/mp2t",
547             ".tsv" => "text/tab-separated-values",
548             ".ttf" => "font/ttf",
549             ".twd" => "application/vnd.simtech-mindmapper",
550             ".txd" => "application/vnd.genomatix.tuxedo",
551             ".txf" => "application/vnd.mobius.txf",
552             ".txt" => "text/plain",
553             ".ufd" => "application/vnd.ufdl",
554             ".umj" => "application/vnd.umajin",
555             ".unityweb" => "application/vnd.unity",
556             ".uoml" => "application/vnd.uoml+xml",
557             ".uri" => "text/uri-list",
558             ".ustar" => "application/x-ustar",
559             ".utz" => "application/vnd.uiq.theme",
560             ".uu" => "text/x-uuencode",
561             ".vcd" => "application/x-cdlink",
562             ".vcf" => "text/x-vcard",
563             ".vcg" => "application/vnd.groove-vcard",
564             ".vcs" => "text/x-vcalendar",
565             ".vcx" => "application/vnd.vcx",
566             ".vis" => "application/vnd.visionary",
567             ".viv" => "video/vnd.vivo",
568             ".vrml" => "model/vrml",
569             ".vsd" => "application/vnd.visio",
570             ".vsf" => "application/vnd.vsf",
571             ".vtt" => "text/vtt",
572             ".vtu" => "model/vnd.vtu",
573             ".vxml" => "application/voicexml+xml",
574             ".war" => "application/java-archive",
575             ".wasm" => "application/wasm",
576             ".wav" => "audio/x-wav",
577             ".wax" => "audio/x-ms-wax",
578             ".wbmp" => "image/vnd.wap.wbmp",
579             ".wbs" => "application/vnd.criticaltools.wbs+xml",
580             ".wbxml" => "application/vnd.wap.wbxml",
581             ".webm" => "video/webm",
582             ".webp" => "image/webp",
583             ".wm" => "video/x-ms-wm",
584             ".wma" => "audio/x-ms-wma",
585             ".wmd" => "application/x-ms-wmd",
586             ".wmf" => "application/x-msmetafile",
587             ".wml" => "text/vnd.wap.wml",
588             ".wmlc" => "application/vnd.wap.wmlc",
589             ".wmls" => "text/vnd.wap.wmlscript",
590             ".wmlsc" => "application/vnd.wap.wmlscriptc",
591             ".wmv" => "video/x-ms-wmv",
592             ".wmx" => "video/x-ms-wmx",
593             ".wmz" => "application/x-ms-wmz",
594             ".woff" => "font/woff",
595             ".woff2" => "font/woff2",
596             ".wpd" => "application/vnd.wordperfect",
597             ".wpl" => "application/vnd.ms-wpl",
598             ".wps" => "application/vnd.ms-works",
599             ".wqd" => "application/vnd.wqd",
600             ".wri" => "application/x-mswrite",
601             ".wrl" => "model/vrml",
602             ".wsdl" => "application/wsdl+xml",
603             ".wspolicy" => "application/wspolicy+xml",
604             ".wtb" => "application/vnd.webturbo",
605             ".wvx" => "video/x-ms-wvx",
606             ".x3d" => "application/vnd.hzn-3d-crossword",
607             ".xar" => "application/vnd.xara",
608             ".xbd" => "application/vnd.fujixerox.docuworks.binder",
609             ".xbm" => "image/x-xbitmap",
610             ".xdm" => "application/vnd.syncml.dm+xml",
611             ".xdp" => "application/vnd.adobe.xdp+xml",
612             ".xdw" => "application/vnd.fujixerox.docuworks",
613             ".xenc" => "application/xenc+xml",
614             ".xer" => "application/patch-ops-error+xml",
615             ".xfdf" => "application/vnd.adobe.xfdf",
616             ".xfdl" => "application/vnd.xfdl",
617             ".xhtml" => "application/xhtml+xml",
618             ".xif" => "image/vnd.xiff",
619             ".xla" => "application/vnd.ms-excel",
620             ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12",
621             ".xls" => "application/vnd.ms-excel",
622             ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
623             ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
624             ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12",
625             ".xlt" => "application/vnd.ms-excel",
626             ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
627             ".xml" => "application/xml",
628             ".xo" => "application/vnd.olpc-sugar",
629             ".xop" => "application/xop+xml",
630             ".xpm" => "image/x-xpixmap",
631             ".xpr" => "application/vnd.is-xpr",
632             ".xps" => "application/vnd.ms-xpsdocument",
633             ".xpw" => "application/vnd.intercon.formnet",
634             ".xsl" => "application/xml",
635             ".xslt" => "application/xslt+xml",
636             ".xsm" => "application/vnd.syncml+xml",
637             ".xspf" => "application/xspf+xml",
638             ".xul" => "application/vnd.mozilla.xul+xml",
639             ".xwd" => "image/x-xwindowdump",
640             ".xyz" => "chemical/x-xyz",
641             ".yaml" => "text/yaml",
642             ".yml" => "text/yaml",
643             ".zaz" => "application/vnd.zzazz.deck+xml",
644             ".zip" => "application/zip",
645             ".zmm" => "application/vnd.handheld-entertainment+xml",
646             };
647              
648             my $fallback = sub { };
649              
650             sub mime_type {
651 30     30 0 291570 my($class, $file) = @_;
652 30 100       247 $file =~ /(\.[a-zA-Z0-9\-]+)$/ or return;
653 26 100       238 $MIME_TYPES->{lc $1} || $fallback->(lc $1);
654             }
655              
656             sub add_type {
657 4     4 0 489572 my $class = shift;
658 4         50 while (my($ext, $type) = splice @_, 0, 2) {
659 4         48 $MIME_TYPES->{lc $ext} = $type;
660             }
661             }
662              
663             sub set_fallback {
664 0     0 0   my($class, $cb) = @_;
665 0           $fallback = $cb;
666             }
667              
668             1;
669              
670             __END__