diff --git a/Makefile b/Makefile index 0f66787..a86dc1e 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ GOFILES=\ routing.go\ static.go\ jsonp.go\ + mime.go\ include $(GOROOT)/src/Make.pkg diff --git a/mime.go b/mime.go new file mode 100644 index 0000000..0f8ea6b --- /dev/null +++ b/mime.go @@ -0,0 +1,614 @@ +package mango + +func MimeType(extension, fallback string) string { + if mime, found := MimeTypes[extension]; found { + return mime + } + return fallback +} + +var MimeTypes = map[string]string{ + ".123": "application/vnd.lotus-1-2-3", + ".3dml": "text/vnd.in3d.3dml", + ".3g2": "video/3gpp2", + ".3gp": "video/3gpp", + ".a": "application/octet-stream", + ".acc": "application/vnd.americandynamics.acc", + ".ace": "application/x-ace-compressed", + ".acu": "application/vnd.acucobol", + ".aep": "application/vnd.audiograph", + ".afp": "application/vnd.ibm.modcap", + ".ai": "application/postscript", + ".aif": "audio/x-aiff", + ".aiff": "audio/x-aiff", + ".ami": "application/vnd.amiga.ami", + ".apr": "application/vnd.lotus-approach", + ".asc": "application/pgp-signature", + ".asf": "video/x-ms-asf", + ".asm": "text/x-asm", + ".aso": "application/vnd.accpac.simply.aso", + ".asx": "video/x-ms-asf", + ".atc": "application/vnd.acucorp", + ".atom": "application/atom+xml", + ".atomcat": "application/atomcat+xml", + ".atomsvc": "application/atomsvc+xml", + ".atx": "application/vnd.antix.game-component", + ".au": "audio/basic", + ".avi": "video/x-msvideo", + ".bat": "application/x-msdownload", + ".bcpio": "application/x-bcpio", + ".bdm": "application/vnd.syncml.dm+wbxml", + ".bh2": "application/vnd.fujitsu.oasysprs", + ".bin": "application/octet-stream", + ".bmi": "application/vnd.bmi", + ".bmp": "image/bmp", + ".box": "application/vnd.previewsystems.box", + ".btif": "image/prs.btif", + ".bz": "application/x-bzip", + ".bz2": "application/x-bzip2", + ".c": "text/x-c", + ".c4g": "application/vnd.clonk.c4group", + ".cab": "application/vnd.ms-cab-compressed", + ".cc": "text/x-c", + ".ccxml": "application/ccxml+xml", + ".cdbcmsg": "application/vnd.contact.cmsg", + ".cdkey": "application/vnd.mediastation.cdkey", + ".cdx": "chemical/x-cdx", + ".cdxml": "application/vnd.chemdraw+xml", + ".cdy": "application/vnd.cinderella", + ".cer": "application/pkix-cert", + ".cgm": "image/cgm", + ".chat": "application/x-chat", + ".chm": "application/vnd.ms-htmlhelp", + ".chrt": "application/vnd.kde.kchart", + ".cif": "chemical/x-cif", + ".cii": "application/vnd.anser-web-certificate-issue-initiation", + ".cil": "application/vnd.ms-artgalry", + ".cla": "application/vnd.claymore", + ".class": "application/octet-stream", + ".clkk": "application/vnd.crick.clicker.keyboard", + ".clkp": "application/vnd.crick.clicker.palette", + ".clkt": "application/vnd.crick.clicker.template", + ".clkw": "application/vnd.crick.clicker.wordbank", + ".clkx": "application/vnd.crick.clicker", + ".clp": "application/x-msclip", + ".cmc": "application/vnd.cosmocaller", + ".cmdf": "chemical/x-cmdf", + ".cml": "chemical/x-cml", + ".cmp": "application/vnd.yellowriver-custom-menu", + ".cmx": "image/x-cmx", + ".com": "application/x-msdownload", + ".conf": "text/plain", + ".cpio": "application/x-cpio", + ".cpp": "text/x-c", + ".cpt": "application/mac-compactpro", + ".crd": "application/x-mscardfile", + ".crl": "application/pkix-crl", + ".crt": "application/x-x509-ca-cert", + ".csh": "application/x-csh", + ".csml": "chemical/x-csml", + ".csp": "application/vnd.commonspace", + ".css": "text/css", + ".csv": "text/csv", + ".curl": "application/vnd.curl", + ".cww": "application/prs.cww", + ".cxx": "text/x-c", + ".daf": "application/vnd.mobius.daf", + ".davmount": "application/davmount+xml", + ".dcr": "application/x-director", + ".dd2": "application/vnd.oma.dd2+xml", + ".ddd": "application/vnd.fujixerox.ddd", + ".deb": "application/x-debian-package", + ".der": "application/x-x509-ca-cert", + ".dfac": "application/vnd.dreamfactory", + ".diff": "text/x-diff", + ".dis": "application/vnd.mobius.dis", + ".djv": "image/vnd.djvu", + ".djvu": "image/vnd.djvu", + ".dll": "application/x-msdownload", + ".dmg": "application/octet-stream", + ".dna": "application/vnd.dna", + ".doc": "application/msword", + ".dot": "application/msword", + ".dp": "application/vnd.osgi.dp", + ".dpg": "application/vnd.dpgraph", + ".dsc": "text/prs.lines.tag", + ".dtd": "application/xml-dtd", + ".dts": "audio/vnd.dts", + ".dtshd": "audio/vnd.dts.hd", + ".dv": "video/x-dv", + ".dvi": "application/x-dvi", + ".dwf": "model/vnd.dwf", + ".dwg": "image/vnd.dwg", + ".dxf": "image/vnd.dxf", + ".dxp": "application/vnd.spotfire.dxp", + ".ear": "application/java-archive", + ".ecelp4800": "audio/vnd.nuera.ecelp4800", + ".ecelp7470": "audio/vnd.nuera.ecelp7470", + ".ecelp9600": "audio/vnd.nuera.ecelp9600", + ".ecma": "application/ecmascript", + ".edm": "application/vnd.novadigm.edm", + ".edx": "application/vnd.novadigm.edx", + ".efif": "application/vnd.picsel", + ".ei6": "application/vnd.pg.osasli", + ".eml": "message/rfc822", + ".eol": "audio/vnd.digital-winds", + ".eot": "application/vnd.ms-fontobject", + ".eps": "application/postscript", + ".es3": "application/vnd.eszigno3+xml", + ".esf": "application/vnd.epson.esf", + ".etx": "text/x-setext", + ".exe": "application/x-msdownload", + ".ext": "application/vnd.novadigm.ext", + ".ez": "application/andrew-inset", + ".ez2": "application/vnd.ezpix-album", + ".ez3": "application/vnd.ezpix-package", + ".f": "text/x-fortran", + ".f77": "text/x-fortran", + ".f90": "text/x-fortran", + ".fbs": "image/vnd.fastbidsheet", + ".fdf": "application/vnd.fdf", + ".fe_launch": "application/vnd.denovo.fcselayout-link", + ".fg5": "application/vnd.fujitsu.oasysgp", + ".fli": "video/x-fli", + ".flo": "application/vnd.micrografx.flo", + ".flv": "video/x-flv", + ".flw": "application/vnd.kde.kivio", + ".flx": "text/vnd.fmi.flexstor", + ".fly": "text/vnd.fly", + ".fm": "application/vnd.framemaker", + ".fnc": "application/vnd.frogans.fnc", + ".for": "text/x-fortran", + ".fpx": "image/vnd.fpx", + ".fsc": "application/vnd.fsc.weblaunch", + ".fst": "image/vnd.fst", + ".ftc": "application/vnd.fluxtime.clip", + ".fti": "application/vnd.anser-web-funds-transfer-initiation", + ".fvt": "video/vnd.fvt", + ".fzs": "application/vnd.fuzzysheet", + ".g3": "image/g3fax", + ".gac": "application/vnd.groove-account", + ".gdl": "model/vnd.gdl", + ".gem": "application/octet-stream", + ".gemspec": "text/x-script.ruby", + ".ghf": "application/vnd.groove-help", + ".gif": "image/gif", + ".gim": "application/vnd.groove-identity-message", + ".gmx": "application/vnd.gmx", + ".gph": "application/vnd.flographit", + ".gqf": "application/vnd.grafeq", + ".gram": "application/srgs", + ".grv": "application/vnd.groove-injector", + ".grxml": "application/srgs+xml", + ".gtar": "application/x-gtar", + ".gtm": "application/vnd.groove-tool-message", + ".gtw": "model/vnd.gtw", + ".gv": "text/vnd.graphviz", + ".gz": "application/x-gzip", + ".h": "text/x-c", + ".h261": "video/h261", + ".h263": "video/h263", + ".h264": "video/h264", + ".hbci": "application/vnd.hbci", + ".hdf": "application/x-hdf", + ".hh": "text/x-c", + ".hlp": "application/winhlp", + ".hpgl": "application/vnd.hp-hpgl", + ".hpid": "application/vnd.hp-hpid", + ".hps": "application/vnd.hp-hps", + ".hqx": "application/mac-binhex40", + ".htc": "text/x-component", + ".htke": "application/vnd.kenameaapp", + ".htm": "text/html", + ".html": "text/html", + ".hvd": "application/vnd.yamaha.hv-dic", + ".hvp": "application/vnd.yamaha.hv-voice", + ".hvs": "application/vnd.yamaha.hv-script", + ".icc": "application/vnd.iccprofile", + ".ice": "x-conference/x-cooltalk", + ".ico": "image/vnd.microsoft.icon", + ".ics": "text/calendar", + ".ief": "image/ief", + ".ifb": "text/calendar", + ".ifm": "application/vnd.shana.informed.formdata", + ".igl": "application/vnd.igloader", + ".igs": "model/iges", + ".igx": "application/vnd.micrografx.igx", + ".iif": "application/vnd.shana.informed.interchange", + ".imp": "application/vnd.accpac.simply.imp", + ".ims": "application/vnd.ms-ims", + ".ipk": "application/vnd.shana.informed.package", + ".irm": "application/vnd.ibm.rights-management", + ".irp": "application/vnd.irepository.package+xml", + ".iso": "application/octet-stream", + ".itp": "application/vnd.shana.informed.formtemplate", + ".ivp": "application/vnd.immervision-ivp", + ".ivu": "application/vnd.immervision-ivu", + ".jad": "text/vnd.sun.j2me.app-descriptor", + ".jam": "application/vnd.jam", + ".jar": "application/java-archive", + ".java": "text/x-java-source", + ".jisp": "application/vnd.jisp", + ".jlt": "application/vnd.hp-jlyt", + ".jnlp": "application/x-java-jnlp-file", + ".joda": "application/vnd.joost.joda-archive", + ".jp2": "image/jp2", + ".jpeg": "image/jpeg", + ".jpg": "image/jpeg", + ".jpgv": "video/jpeg", + ".jpm": "video/jpm", + ".js": "application/javascript", + ".json": "application/json", + ".karbon": "application/vnd.kde.karbon", + ".kfo": "application/vnd.kde.kformula", + ".kia": "application/vnd.kidspiration", + ".kml": "application/vnd.google-earth.kml+xml", + ".kmz": "application/vnd.google-earth.kmz", + ".kne": "application/vnd.kinar", + ".kon": "application/vnd.kde.kontour", + ".kpr": "application/vnd.kde.kpresenter", + ".ksp": "application/vnd.kde.kspread", + ".ktz": "application/vnd.kahootz", + ".kwd": "application/vnd.kde.kword", + ".latex": "application/x-latex", + ".lbd": "application/vnd.llamagraphics.life-balance.desktop", + ".lbe": "application/vnd.llamagraphics.life-balance.exchange+xml", + ".les": "application/vnd.hhe.lesson-player", + ".link66": "application/vnd.route66.link66+xml", + ".log": "text/plain", + ".lostxml": "application/lost+xml", + ".lrm": "application/vnd.ms-lrm", + ".ltf": "application/vnd.frogans.ltf", + ".lvp": "audio/vnd.lucent.voice", + ".lwp": "application/vnd.lotus-wordpro", + ".m3u": "audio/x-mpegurl", + ".m4a": "audio/mp4a-latm", + ".m4v": "video/mp4", + ".ma": "application/mathematica", + ".mag": "application/vnd.ecowin.chart", + ".man": "text/troff", + ".manifest": "text/cache-manifest", + ".mathml": "application/mathml+xml", + ".mbk": "application/vnd.mobius.mbk", + ".mbox": "application/mbox", + ".mc1": "application/vnd.medcalcdata", + ".mcd": "application/vnd.mcd", + ".mdb": "application/x-msaccess", + ".mdi": "image/vnd.ms-modi", + ".mdoc": "text/troff", + ".me": "text/troff", + ".mfm": "application/vnd.mfmp", + ".mgz": "application/vnd.proteus.magazine", + ".mid": "audio/midi", + ".midi": "audio/midi", + ".mif": "application/vnd.mif", + ".mime": "message/rfc822", + ".mj2": "video/mj2", + ".mlp": "application/vnd.dolby.mlp", + ".mmd": "application/vnd.chipnuts.karaoke-mmd", + ".mmf": "application/vnd.smaf", + ".mml": "application/mathml+xml", + ".mmr": "image/vnd.fujixerox.edmics-mmr", + ".mng": "video/x-mng", + ".mny": "application/x-msmoney", + ".mov": "video/quicktime", + ".movie": "video/x-sgi-movie", + ".mp3": "audio/mpeg", + ".mp4": "video/mp4", + ".mp4a": "audio/mp4", + ".mp4s": "application/mp4", + ".mp4v": "video/mp4", + ".mpc": "application/vnd.mophun.certificate", + ".mpeg": "video/mpeg", + ".mpg": "video/mpeg", + ".mpga": "audio/mpeg", + ".mpkg": "application/vnd.apple.installer+xml", + ".mpm": "application/vnd.blueice.multipass", + ".mpn": "application/vnd.mophun.application", + ".mpp": "application/vnd.ms-project", + ".mpy": "application/vnd.ibm.minipay", + ".mqy": "application/vnd.mobius.mqy", + ".mrc": "application/marc", + ".ms": "text/troff", + ".mscml": "application/mediaservercontrol+xml", + ".mseq": "application/vnd.mseq", + ".msf": "application/vnd.epson.msf", + ".msh": "model/mesh", + ".msi": "application/x-msdownload", + ".msl": "application/vnd.mobius.msl", + ".msty": "application/vnd.muvee.style", + ".mts": "model/vnd.mts", + ".mus": "application/vnd.musician", + ".mvb": "application/x-msmediaview", + ".mwf": "application/vnd.mfer", + ".mxf": "application/mxf", + ".mxl": "application/vnd.recordare.musicxml", + ".mxml": "application/xv+xml", + ".mxs": "application/vnd.triscape.mxs", + ".mxu": "video/vnd.mpegurl", + ".n": "application/vnd.nokia.n-gage.symbian.install", + ".nc": "application/x-netcdf", + ".ngdat": "application/vnd.nokia.n-gage.data", + ".nlu": "application/vnd.neurolanguage.nlu", + ".nml": "application/vnd.enliven", + ".nnd": "application/vnd.noblenet-directory", + ".nns": "application/vnd.noblenet-sealer", + ".nnw": "application/vnd.noblenet-web", + ".npx": "image/vnd.net-fpx", + ".nsf": "application/vnd.lotus-notes", + ".oa2": "application/vnd.fujitsu.oasys2", + ".oa3": "application/vnd.fujitsu.oasys3", + ".oas": "application/vnd.fujitsu.oasys", + ".obd": "application/x-msbinder", + ".oda": "application/oda", + ".odc": "application/vnd.oasis.opendocument.chart", + ".odf": "application/vnd.oasis.opendocument.formula", + ".odg": "application/vnd.oasis.opendocument.graphics", + ".odi": "application/vnd.oasis.opendocument.image", + ".odp": "application/vnd.oasis.opendocument.presentation", + ".ods": "application/vnd.oasis.opendocument.spreadsheet", + ".odt": "application/vnd.oasis.opendocument.text", + ".oga": "audio/ogg", + ".ogg": "application/ogg", + ".ogv": "video/ogg", + ".ogx": "application/ogg", + ".org": "application/vnd.lotus-organizer", + ".otc": "application/vnd.oasis.opendocument.chart-template", + ".otf": "application/vnd.oasis.opendocument.formula-template", + ".otg": "application/vnd.oasis.opendocument.graphics-template", + ".oth": "application/vnd.oasis.opendocument.text-web", + ".oti": "application/vnd.oasis.opendocument.image-template", + ".otm": "application/vnd.oasis.opendocument.text-master", + ".ots": "application/vnd.oasis.opendocument.spreadsheet-template", + ".ott": "application/vnd.oasis.opendocument.text-template", + ".oxt": "application/vnd.openofficeorg.extension", + ".p": "text/x-pascal", + ".p10": "application/pkcs10", + ".p12": "application/x-pkcs12", + ".p7b": "application/x-pkcs7-certificates", + ".p7m": "application/pkcs7-mime", + ".p7r": "application/x-pkcs7-certreqresp", + ".p7s": "application/pkcs7-signature", + ".pas": "text/x-pascal", + ".pbd": "application/vnd.powerbuilder6", + ".pbm": "image/x-portable-bitmap", + ".pcl": "application/vnd.hp-pcl", + ".pclxl": "application/vnd.hp-pclxl", + ".pcx": "image/x-pcx", + ".pdb": "chemical/x-pdb", + ".pdf": "application/pdf", + ".pem": "application/x-x509-ca-cert", + ".pfr": "application/font-tdpfr", + ".pgm": "image/x-portable-graymap", + ".pgn": "application/x-chess-pgn", + ".pgp": "application/pgp-encrypted", + ".pic": "image/x-pict", + ".pict": "image/pict", + ".pkg": "application/octet-stream", + ".pki": "application/pkixcmp", + ".pkipath": "application/pkix-pkipath", + ".pl": "text/x-script.perl", + ".plb": "application/vnd.3gpp.pic-bw-large", + ".plc": "application/vnd.mobius.plc", + ".plf": "application/vnd.pocketlearn", + ".pls": "application/pls+xml", + ".pm": "text/x-script.perl-module", + ".pml": "application/vnd.ctc-posml", + ".png": "image/png", + ".pnm": "image/x-portable-anymap", + ".pntg": "image/x-macpaint", + ".portpkg": "application/vnd.macports.portpkg", + ".ppd": "application/vnd.cups-ppd", + ".ppm": "image/x-portable-pixmap", + ".pps": "application/vnd.ms-powerpoint", + ".ppt": "application/vnd.ms-powerpoint", + ".prc": "application/vnd.palm", + ".pre": "application/vnd.lotus-freelance", + ".prf": "application/pics-rules", + ".ps": "application/postscript", + ".psb": "application/vnd.3gpp.pic-bw-small", + ".psd": "image/vnd.adobe.photoshop", + ".ptid": "application/vnd.pvi.ptid1", + ".pub": "application/x-mspublisher", + ".pvb": "application/vnd.3gpp.pic-bw-var", + ".pwn": "application/vnd.3m.post-it-notes", + ".py": "text/x-script.python", + ".pya": "audio/vnd.ms-playready.media.pya", + ".pyv": "video/vnd.ms-playready.media.pyv", + ".qam": "application/vnd.epson.quickanime", + ".qbo": "application/vnd.intu.qbo", + ".qfx": "application/vnd.intu.qfx", + ".qps": "application/vnd.publishare-delta-tree", + ".qt": "video/quicktime", + ".qtif": "image/x-quicktime", + ".qxd": "application/vnd.quark.quarkxpress", + ".ra": "audio/x-pn-realaudio", + ".rake": "text/x-script.ruby", + ".ram": "audio/x-pn-realaudio", + ".rar": "application/x-rar-compressed", + ".ras": "image/x-cmu-raster", + ".rb": "text/x-script.ruby", + ".rcprofile": "application/vnd.ipunplugged.rcprofile", + ".rdf": "application/rdf+xml", + ".rdz": "application/vnd.data-vision.rdz", + ".rep": "application/vnd.businessobjects", + ".rgb": "image/x-rgb", + ".rif": "application/reginfo+xml", + ".rl": "application/resource-lists+xml", + ".rlc": "image/vnd.fujixerox.edmics-rlc", + ".rld": "application/resource-lists-diff+xml", + ".rm": "application/vnd.rn-realmedia", + ".rmp": "audio/x-pn-realaudio-plugin", + ".rms": "application/vnd.jcp.javame.midlet-rms", + ".rnc": "application/relax-ng-compact-syntax", + ".roff": "text/troff", + ".rpm": "application/x-redhat-package-manager", + ".rpss": "application/vnd.nokia.radio-presets", + ".rpst": "application/vnd.nokia.radio-preset", + ".rq": "application/sparql-query", + ".rs": "application/rls-services+xml", + ".rsd": "application/rsd+xml", + ".rss": "application/rss+xml", + ".rtf": "application/rtf", + ".rtx": "text/richtext", + ".ru": "text/x-script.ruby", + ".s": "text/x-asm", + ".saf": "application/vnd.yamaha.smaf-audio", + ".sbml": "application/sbml+xml", + ".sc": "application/vnd.ibm.secure-container", + ".scd": "application/x-msschedule", + ".scm": "application/vnd.lotus-screencam", + ".scq": "application/scvp-cv-request", + ".scs": "application/scvp-cv-response", + ".sdkm": "application/vnd.solent.sdkm+xml", + ".sdp": "application/sdp", + ".see": "application/vnd.seemail", + ".sema": "application/vnd.sema", + ".semd": "application/vnd.semd", + ".semf": "application/vnd.semf", + ".setpay": "application/set-payment-initiation", + ".setreg": "application/set-registration-initiation", + ".sfd": "application/vnd.hydrostatix.sof-data", + ".sfs": "application/vnd.spotfire.sfs", + ".sgm": "text/sgml", + ".sgml": "text/sgml", + ".sh": "application/x-sh", + ".shar": "application/x-shar", + ".shf": "application/shf+xml", + ".sig": "application/pgp-signature", + ".sit": "application/x-stuffit", + ".sitx": "application/x-stuffitx", + ".skp": "application/vnd.koan", + ".slt": "application/vnd.epson.salt", + ".smi": "application/smil+xml", + ".snd": "audio/basic", + ".so": "application/octet-stream", + ".spf": "application/vnd.yamaha.smaf-phrase", + ".spl": "application/x-futuresplash", + ".spot": "text/vnd.in3d.spot", + ".spp": "application/scvp-vp-response", + ".spq": "application/scvp-vp-request", + ".src": "application/x-wais-source", + ".srx": "application/sparql-results+xml", + ".sse": "application/vnd.kodak-descriptor", + ".ssf": "application/vnd.epson.ssf", + ".ssml": "application/ssml+xml", + ".stf": "application/vnd.wt.stf", + ".stk": "application/hyperstudio", + ".str": "application/vnd.pg.format", + ".sus": "application/vnd.sus-calendar", + ".sv4cpio": "application/x-sv4cpio", + ".sv4crc": "application/x-sv4crc", + ".svd": "application/vnd.svd", + ".svg": "image/svg+xml", + ".svgz": "image/svg+xml", + ".swf": "application/x-shockwave-flash", + ".swi": "application/vnd.arastra.swi", + ".t": "text/troff", + ".tao": "application/vnd.tao.intent-module-archive", + ".tar": "application/x-tar", + ".tbz": "application/x-bzip-compressed-tar", + ".tcap": "application/vnd.3gpp2.tcap", + ".tcl": "application/x-tcl", + ".tex": "application/x-tex", + ".texi": "application/x-texinfo", + ".texinfo": "application/x-texinfo", + ".text": "text/plain", + ".tif": "image/tiff", + ".tiff": "image/tiff", + ".tmo": "application/vnd.tmobile-livetv", + ".torrent": "application/x-bittorrent", + ".tpl": "application/vnd.groove-tool-template", + ".tpt": "application/vnd.trid.tpt", + ".tr": "text/troff", + ".tra": "application/vnd.trueapp", + ".trm": "application/x-msterminal", + ".tsv": "text/tab-separated-values", + ".ttf": "application/octet-stream", + ".twd": "application/vnd.simtech-mindmapper", + ".txd": "application/vnd.genomatix.tuxedo", + ".txf": "application/vnd.mobius.txf", + ".txt": "text/plain", + ".ufd": "application/vnd.ufdl", + ".umj": "application/vnd.umajin", + ".unityweb": "application/vnd.unity", + ".uoml": "application/vnd.uoml+xml", + ".uri": "text/uri-list", + ".ustar": "application/x-ustar", + ".utz": "application/vnd.uiq.theme", + ".uu": "text/x-uuencode", + ".vcd": "application/x-cdlink", + ".vcf": "text/x-vcard", + ".vcg": "application/vnd.groove-vcard", + ".vcs": "text/x-vcalendar", + ".vcx": "application/vnd.vcx", + ".vis": "application/vnd.visionary", + ".viv": "video/vnd.vivo", + ".vrml": "model/vrml", + ".vsd": "application/vnd.visio", + ".vsf": "application/vnd.vsf", + ".vtu": "model/vnd.vtu", + ".vxml": "application/voicexml+xml", + ".war": "application/java-archive", + ".wav": "audio/x-wav", + ".wax": "audio/x-ms-wax", + ".wbmp": "image/vnd.wap.wbmp", + ".wbs": "application/vnd.criticaltools.wbs+xml", + ".wbxml": "application/vnd.wap.wbxml", + ".webm": "video/webm", + ".wm": "video/x-ms-wm", + ".wma": "audio/x-ms-wma", + ".wmd": "application/x-ms-wmd", + ".wmf": "application/x-msmetafile", + ".wml": "text/vnd.wap.wml", + ".wmlc": "application/vnd.wap.wmlc", + ".wmls": "text/vnd.wap.wmlscript", + ".wmlsc": "application/vnd.wap.wmlscriptc", + ".wmv": "video/x-ms-wmv", + ".wmx": "video/x-ms-wmx", + ".wmz": "application/x-ms-wmz", + ".woff": "application/octet-stream", + ".wpd": "application/vnd.wordperfect", + ".wpl": "application/vnd.ms-wpl", + ".wps": "application/vnd.ms-works", + ".wqd": "application/vnd.wqd", + ".wri": "application/x-mswrite", + ".wrl": "model/vrml", + ".wsdl": "application/wsdl+xml", + ".wspolicy": "application/wspolicy+xml", + ".wtb": "application/vnd.webturbo", + ".wvx": "video/x-ms-wvx", + ".x3d": "application/vnd.hzn-3d-crossword", + ".xar": "application/vnd.xara", + ".xbd": "application/vnd.fujixerox.docuworks.binder", + ".xbm": "image/x-xbitmap", + ".xdm": "application/vnd.syncml.dm+xml", + ".xdp": "application/vnd.adobe.xdp+xml", + ".xdw": "application/vnd.fujixerox.docuworks", + ".xenc": "application/xenc+xml", + ".xer": "application/patch-ops-error+xml", + ".xfdf": "application/vnd.adobe.xfdf", + ".xfdl": "application/vnd.xfdl", + ".xhtml": "application/xhtml+xml", + ".xif": "image/vnd.xiff", + ".xls": "application/vnd.ms-excel", + ".xml": "application/xml", + ".xo": "application/vnd.olpc-sugar", + ".xop": "application/xop+xml", + ".xpm": "image/x-xpixmap", + ".xpr": "application/vnd.is-xpr", + ".xps": "application/vnd.ms-xpsdocument", + ".xpw": "application/vnd.intercon.formnet", + ".xsl": "application/xml", + ".xslt": "application/xslt+xml", + ".xsm": "application/vnd.syncml+xml", + ".xspf": "application/xspf+xml", + ".xul": "application/vnd.mozilla.xul+xml", + ".xwd": "image/x-xwindowdump", + ".xyz": "chemical/x-xyz", + ".yaml": "text/yaml", + ".yml": "text/yaml", + ".zaz": "application/vnd.zzazz.deck+xml", + ".zip": "application/zip", + ".zmm": "application/vnd.handheld-entertainment+xml", +} diff --git a/mime_test.go b/mime_test.go new file mode 100644 index 0000000..d83a8fe --- /dev/null +++ b/mime_test.go @@ -0,0 +1,62 @@ +package mango + +import ( + "testing" +) + +func TestMimeType(t *testing.T) { + test := func(value, expected string) { + found := MimeType(value, "") + if found != expected { + t.Error("Expected", value, "to have mime type:", expected, "got:", found) + } + } + + test(".css", "text/css") + test(".js", "application/javascript") +} + +func TestMimeTypeFallback(t *testing.T) { + value := "bogus" + expected := "fallback/value" + found := MimeType(value, expected) + if found != expected { + t.Error("Expected", value, "to have fallback mime type:", expected, "got:", found) + } +} + +func TestAddingMimeTypes(t *testing.T) { + value := ".new" + expected := "new/type" + fallback := "fallback/type" + + found := MimeType(value, fallback) + if found != fallback { + t.Error("Expected", value, "to have fallback mime type:", fallback, "got:", found) + } + + MimeTypes[".new"] = "new/type" + + found = MimeType(value, fallback) + if found != expected { + t.Error("Expected", value, "to have new mime type:", expected, "got:", found) + } +} + +func TestRemovingMimeTypes(t *testing.T) { + value := ".jpg" + expected := "image/jpeg" + fallback := "fallback/type" + + found := MimeType(value, fallback) + if found != expected { + t.Error("Expected", value, "to have mime type:", expected, "got:", found) + } + + MimeTypes[".jpg"] = "", false + + found = MimeType(value, fallback) + if found != fallback { + t.Error("Expected", value, "to have fallback mime type:", fallback, "got:", found) + } +} diff --git a/static.go b/static.go index 0adf471..020d085 100644 --- a/static.go +++ b/static.go @@ -28,7 +28,8 @@ func Static(directory string) Middleware { file := path.Join(directory, env.Request().URL.Path) if fileExists(file) && (env.Request().Method == "GET" || env.Request().Method == "HEAD") { if body, err := readFile(file); err == nil { - return 200, Headers{}, Body(body) + mime_type := []string{MimeType(path.Ext(file), "application/octet-stream")} + return 200, Headers{"Content-Type": mime_type}, Body(body) } else { panic(err) } diff --git a/static_test.go b/static_test.go index aa3f286..c631dcb 100644 --- a/static_test.go +++ b/static_test.go @@ -22,7 +22,7 @@ func TestStaticSuccess(t *testing.T) { // Request against it request, err := http.NewRequest("GET", "http://localhost:3000/static.html", nil) - status, _, body := staticApp(Env{"mango.request": &Request{request}}) + status, headers, body := staticApp(Env{"mango.request": &Request{request}}) if err != nil { t.Error(err) @@ -36,6 +36,12 @@ func TestStaticSuccess(t *testing.T) { if string(body) != expected { t.Error("Expected body:", string(body), "to equal:", expected) } + + expected = "text/html" + got := headers.Get("Content-Type") + if got != expected { + t.Error("Expected Content-Type:", got, "to equal:", expected) + } } func TestStaticFail(t *testing.T) {