Data URLs parsing in Golang
While working on a tool for extracting images from a webpage, I was surprised that HTML elements, like <a>
, <img>
, <svg>
, <picture>
, <iframe>
, <object>
may point to an image using data URL.
The idea is to have data inline, instead of hosting somewhere on external storage. Here is an example of embedding image directly into HTML element:
<img
src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw
AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH
hhx4dbgYKAAA7"
alt="Larry">
The Data URL consist of two components: content type and/or parameters and actual data. The content type represent what is encoded and parameters tells additional attributes of encoded data.
Parsing data URL’s is pretty straightforward and here is sample implementation in Golang:
// DataURI represents the parsed "data" URL
type DataURI struct {
Type string
Subtype string
Params map[string]string
IsBase64 bool
Data string
}
// IsDataURL return whether the URL is "data" URL
func IsDataURL(url string) bool {
return strings.HasPrefix(url, "data:")
}
// ParseDataURL parse the "data" URL into components.
func ParseDataURL(url string) (DataURI, error) {
const (
dataURIPrefix = "data:"
defaultType = "text"
defaultSubType = "plain"
defaultParam = "charset=US-ASCII"
base64Indicator = "base64"
)
if !IsDataURL(url) {
return DataURI{}, errors.New("Input URL is not correct Data URL")
}
data := url[len(dataURIPrefix):]
if !strings.Contains(data, ",") {
return DataURI{}, errors.New("Data not found in Data URI")
}
// split propeties and actual encoded data
comp := strings.SplitN(data, ",", 2)
properties, encodedData := comp[0], comp[1]
var result DataURI = DataURI{Data: encodedData,
Params: make(map[string]string)}
for i, prop := range strings.Split(properties, ";") {
if i == 0 {
if strings.Contains(prop, "/") {
appType := strings.SplitN(prop, "/", 2)
result.Type, result.Subtype = appType[0], appType[1]
} else {
params := strings.Split(defaultParam, "=")
result.Type, result.Subtype = defaultType, defaultSubType
result.Params[params[0]] = params[1]
}
} else {
if prop == base64Indicator {
result.IsBase64 = true
} else {
// ignore if not valid properties assignment
if strings.Contains(prop, "=") {
propComponets := strings.SplitN(prop, "=", 2)
result.Params[propComponets[0]] = propComponets[1]
}
}
}
}
return result, nil
}
Now let’s add some tests:
func TestIsDataURL(t *testing.T) {
type testCase struct {
dataURL string
valid bool
}
var testCases = []testCase{
{"data:,A%20brief%20note", true},
{"data:image/gif;base64,R0l", true},
{"data,A%20brief%20note", false},
{"data :,A%20brief%20note", false},
{"", false},
{" data:,", false},
}
for _, test := range testCases {
if IsDataURL(test.dataURL) != test.valid {
t.Errorf("IsDataURL('%s') != %t", test.dataURL, test.valid)
}
}
}
func TestParseDataURL(t *testing.T) {
type testCase struct {
dataURL string
parsedData DataURI
}
var testCases = []testCase{
{"data:image/gif;base64,XXX",
DataURI{Type: "image", Subtype: "gif", IsBase64: true,
Data: "XXX",
Params: make(map[string]string)}},
{`data:,A%20brief%20note`,
DataURI{Type: "text", Subtype: "plain", Data: `A%20brief%20note`,
Params: map[string]string{"charset": "US-ASCII"}}},
{`data:text/plain;charset=iso-8859-7,%be%fg%be`,
DataURI{Type: "text", Subtype: "plain", Data: "%be%fg%be",
Params: map[string]string{"charset": "iso-8859-7"}}},
{`data:application/vnd-xxx-query,select_vcount,fcol_from_fieldtable/local`,
DataURI{Type: "application", Subtype: "vnd-xxx-query",
Data: "select_vcount,fcol_from_fieldtable/local",
Params: make(map[string]string)}},
{`data:,`, DataURI{Type: "text", Subtype: "plain", Data: ``,
Params: map[string]string{"charset": "US-ASCII"}}},
{`data:boo/foo;,`, DataURI{Type: "boo", Subtype: "foo", Data: "",
Params: make(map[string]string)}},
}
for _, test := range testCases {
t.Run(test.dataURL, func(t *testing.T) {
result, _ := ParseDataURL(test.dataURL)
if !cmp.Equal(result, test.parsedData) {
t.Errorf("ParseDataURL return different result for input: %+v", result)
}
})
}
}
Another tricky part is to have MIME type converted to the actual file type extension(s). But, the good new is that, the httpd maintains mapping MIME types to file extensions and it can be easily converted to Golang map:
var MimeType2Ext = map[string][]string{
"application/x-dtbresource+xml": {"res"},
"application/xspf+xml": {"xspf"},
"model/vnd.mts": {"mts"},
"video/x-ms-wvx": {"wvx"},
"application/octet-stream": {"bin", "dms", "lrf", "mar", "so", "dist", "distz", "pkg", "bpk", "dump", "elc", "deploy"},
"application/vnd.android.package-archive": {"apk"},
"application/vnd.kde.kpresenter": {"kpr", "kpt"},
"application/vnd.ms-excel.sheet.binary.macroenabled.12": {"xlsb"},
"text/x-nfo": {"nfo"},
"application/vnd.ahead.space": {"ahead"},
"application/vnd.mophun.certificate": {"mpc"},
"application/vnd.stepmania.package": {"smzip"},
"application/vnd.uoml+xml": {"uoml"},
"application/sparql-query": {"rq"},
"application/vnd.oasis.opendocument.text-master": {"odm"},
"application/vnd.olpc-sugar": {"xo"},
"chemical/x-cml": {"cml"},
"application/cdmi-object": {"cdmio"},
"application/mp21": {"m21", "mp21"},
"application/oda": {"oda"},
"application/postscript": {"ai", "eps", "ps"},
"model/x3d+binary": {"x3db", "x3dbz"},
"application/vnd.cloanto.rp9": {"rp9"},
"application/vnd.groove-vcard": {"vcg"},
"application/vnd.immervision-ivu": {"ivu"},
"video/vnd.fvt": {"fvt"},
"video/ogg": {"ogv"},
"application/vnd.geonext": {"gxt"},
"application/vnd.isac.fcs": {"fcs"},
"application/vnd.stardivision.math": {"smf"},
"image/vnd.fujixerox.edmics-rlc": {"rlc"},
"application/vnd.crick.clicker.template": {"clkt"},
"application/vnd.immervision-ivp": {"ivp"},
"application/vnd.ms-pki.seccat": {"cat"},
"application/vnd.stardivision.draw": {"sda"},
"application/winhlp": {"hlp"},
"application/x-rar-compressed": {"rar"},
"image/x-mrsid-image": {"sid"},
"image/x-pict": {"pic", "pct"},
"video/x-f4v": {"f4v"},
"application/metalink+xml": {"metalink"},
"application/scvp-vp-response": {"spp"},
"application/vnd.dolby.mlp": {"mlp"},
"application/vnd.intu.qbo": {"qbo"},
"application/vnd.audiograph": {"aep"},
"video/vnd.dece.sd": {"uvs", "uvvs"},
"application/java-archive": {"jar"},
"application/prs.cww": {"cww"},
"application/vnd.airzip.filesecure.azf": {"azf"},
"application/vnd.apple.installer+xml": {"mpkg"},
"application/x-pkcs7-certreqresp": {"p7r"},
"audio/x-wav": {"wav"},
"image/ief": {"ief"},
"application/rss+xml": {"rss"},
"application/vnd.epson.esf": {"esf"},
"application/vnd.macports.portpkg": {"portpkg"},
"application/vnd.ms-fontobject": {"eot"},
"application/x-xliff+xml": {"xlf"},
"application/xhtml+xml": {"xhtml", "xht"},
"application/gxf": {"gxf"},
"application/lost+xml": {"lostxml"},
"application/x-mie": {"mie"},
"application/x-tar": {"tar"},
"application/vnd.micrografx.igx": {"igx"},
"application/x-chess-pgn": {"pgn"},
"image/vnd.dwg": {"dwg"},
"application/java-serialized-object": {"ser"},
"application/vnd.ezpix-album": {"ez2"},
"application/vnd.lotus-approach": {"apr"},
"application/vnd.mfmp": {"mfm"},
"application/xml": {"xml", "xsl"},
"application/yang": {"yang"},
"video/x-mng": {"mng"},
"application/vnd.dece.ttml+xml": {"uvt", "uvvt"},
"application/vnd.igloader": {"igl"},
"application/vnd.jam": {"jam"},
"application/vnd.shana.informed.formtemplate": {"itp"},
"application/vnd.smart.teacher": {"teacher"},
"application/xproc+xml": {"xpl"},
"video/mp4": {"mp4", "mp4v", "mpg4"},
"application/vnd.fujixerox.docuworks": {"xdw"},
"application/vnd.gmx": {"gmx"},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": {"docx"},
"application/vnd.previewsystems.box": {"box"},
"application/vnd.nokia.radio-presets": {"rpss"},
"application/vnd.oasis.opendocument.chart": {"odc"},
"model/vnd.dwf": {"dwf"},
"application/vnd.blueice.multipass": {"mpm"},
"application/vnd.hp-pclxl": {"pclxl"},
"application/vnd.ms-excel.template.macroenabled.12": {"xltm"},
"application/vnd.ms-powerpoint.slide.macroenabled.12": {"sldm"},
"application/vnd.sun.xml.math": {"sxm"},
"audio/x-ms-wax": {"wax"},
"application/atomcat+xml": {"atomcat"},
"application/vnd.claymore": {"cla"},
"application/vnd.fujitsu.oasys": {"oas"},
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": {"xltx"},
"video/vnd.vivo": {"viv"},
"application/vnd.adobe.xdp+xml": {"xdp"},
"application/vnd.joost.joda-archive": {"joda"},
"application/vnd.ms-artgalry": {"cil"},
"application/vnd.quark.quarkxpress": {"qxd", "qxt", "qwd", "qwt", "qxl", "qxb"},
"application/vnd.3gpp.pic-bw-small": {"psb"},
"application/vnd.businessobjects": {"rep"},
"application/vnd.handheld-entertainment+xml": {"zmm"},
"application/vnd.neurolanguage.nlu": {"nlu"},
"application/x-tex-tfm": {"tfm"},
"chemical/x-cif": {"cif"},
"image/bmp": {"bmp"},
"application/ssdl+xml": {"ssdl"},
"application/vnd.epson.salt": {"slt"},
"application/vnd.google-earth.kmz": {"kmz"},
"application/x-cbr": {"cbr", "cba", "cbt", "cbz", "cb7"},
"application/vnd.fdsn.mseed": {"mseed"},
"application/xcap-diff+xml": {"xdf"},
"audio/ogg": {"oga", "ogg", "spx", "opus"},
"application/vnd.ms-excel.addin.macroenabled.12": {"xlam"},
"application/vnd.pg.format": {"str"},
"application/x-gtar": {"gtar"},
"application/x-xz": {"xz"},
"application/ipfix": {"ipfix"},
"application/sru+xml": {"sru"},
"application/ssml+xml": {"ssml"},
"application/vnd.aristanetworks.swi": {"swi"},
"audio/adpcm": {"adp"},
"application/vnd.mfer": {"mwf"},
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": {"ppsx"},
"application/vnd.spotfire.dxp": {"dxp"},
"application/vnd.syncml.dm+wbxml": {"bdm"},
"application/mathml+xml": {"mathml"},
"application/pkcs7-signature": {"p7s"},
"application/vnd.ipunplugged.rcprofile": {"rcprofile"},
"application/vnd.kenameaapp": {"htke"},
"video/x-ms-vob": {"vob"},
"application/vnd.uiq.theme": {"utz"},
"application/x-bcpio": {"bcpio"},
"application/x-blorb": {"blb", "blorb"},
"application/x-font-linux-psf": {"psf"},
"application/vnd.smaf": {"mmf"},
"application/x-doom": {"wad"},
"image/vnd.fastbidsheet": {"fbs"},
"application/vnd.ecowin.chart": {"mag"},
"chemical/x-xyz": {"xyz"},
"application/x-ms-xbap": {"xbap"},
"audio/x-ms-wma": {"wma"},
"application/omdoc+xml": {"omdoc"},
"application/vnd.osgi.subsystem": {"esa"},
"application/vnd.sun.xml.draw.template": {"std"},
"application/x-freearc": {"arc"},
"application/vnd.yamaha.smaf-phrase": {"spf"},
"application/x-xpinstall": {"xpi"},
"audio/silk": {"sil"},
"text/vnd.in3d.3dml": {"3dml"},
"application/vnd.yamaha.smaf-audio": {"saf"},
"application/x-dtbncx+xml": {"ncx"},
"audio/vnd.dts": {"dts"},
"font/woff2": {"woff2"},
"application/mac-binhex40": {"hqx"},
"application/vnd.kde.kword": {"kwd", "kwt"},
"application/vnd.novadigm.ext": {"ext"},
"application/vnd.sailingtracker.track": {"st"},
"video/vnd.dece.video": {"uvv", "uvvv"},
"video/vnd.ms-playready.media.pyv": {"pyv"},
"application/vnd.dynageo": {"geo"},
"application/x-install-instructions": {"install"},
"audio/x-aac": {"aac"},
"image/x-freehand": {"fh", "fhc", "fh4", "fh5", "fh7"},
"application/x-authorware-map": {"aam"},
"image/vnd.fujixerox.edmics-mmr": {"mmr"},
"application/vnd.ibm.secure-container": {"sc"},
"application/vnd.kodak-descriptor": {"sse"},
"application/vnd.ms-htmlhelp": {"chm"},
"application/vnd.sun.xml.draw": {"sxd"},
"application/vnd.rig.cryptonote": {"cryptonote"},
"image/x-xbitmap": {"xbm"},
"application/vnd.contact.cmsg": {"cdbcmsg"},
"application/vnd.fuzzysheet": {"fzs"},
"application/vnd.kde.kivio": {"flw"},
"application/vnd.ms-officetheme": {"thmx"},
"text/calendar": {"ics", "ifb"},
"application/vnd.kde.kformula": {"kfo"},
"application/vnd.umajin": {"umj"},
"application/vnd.visio": {"vsd", "vst", "vss", "vsw"},
"application/x-msterminal": {"trm"},
"application/vnd.mophun.application": {"mpn"},
"application/vnd.openxmlformats-officedocument.presentationml.template": {"potx"},
"application/vnd.palm": {"pdb", "pqa", "oprc"},
"application/vnd.picsel": {"efif"},
"application/rls-services+xml": {"rs"},
"application/vnd.adobe.fxp": {"fxp", "fxpl"},
"application/vnd.frogans.ltf": {"ltf"},
"application/vnd.kde.kontour": {"kon"},
"application/vnd.stardivision.writer": {"sdw", "vor"},
"text/richtext": {"rtx"},
"text/vnd.curl.mcurl": {"mcurl"},
"application/vnd.fdsn.seed": {"seed", "dataless"},
"application/vnd.intercon.formnet": {"xpw", "xpx"},
"application/vnd.is-xpr": {"xpr"},
"application/vnd.vsf": {"vsf"},
"application/rsd+xml": {"rsd"},
"application/thraud+xml": {"tfi"},
"application/vnd.anser-web-funds-transfer-initiation": {"fti"},
"application/vnd.commonspace": {"csp"},
"application/vnd.wolfram.player": {"nbp"},
"application/wspolicy+xml": {"wspolicy"},
"audio/mpeg": {"mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"},
"font/collection": {"ttc"},
"application/vnd.medcalcdata": {"mc1"},
"application/vnd.tmobile-livetv": {"tmo"},
"application/vnd.yamaha.hv-dic": {"hvd"},
"font/woff": {"woff"},
"application/smil+xml": {"smi", "smil"},
"application/vnd.airzip.filesecure.azs": {"azs"},
"application/vnd.dece.data": {"uvf", "uvvf", "uvd", "uvvd"},
"application/vnd.google-earth.kml+xml": {"kml"},
"image/x-portable-pixmap": {"ppm"},
"application/vnd.americandynamics.acc": {"acc"},
"application/vnd.dpgraph": {"dpg"},
"application/x-futuresplash": {"spl"},
"text/sgml": {"sgml", "sgm"},
"text/prs.lines.tag": {"dsc"},
"text/uri-list": {"uri", "uris", "urls"},
"text/vnd.fly": {"fly"},
"application/inkml+xml": {"ink", "inkml"},
"application/sbml+xml": {"sbml"},
"application/x-msaccess": {"mdb"},
"application/x-msmoney": {"mny"},
"application/vnd.wap.wmlscriptc": {"wmlsc"},
"application/vnd.yamaha.hv-voice": {"hvp"},
"application/xslt+xml": {"xslt"},
"application/mxf": {"mxf"},
"application/oebps-package+xml": {"opf"},
"application/vnd.hp-hpgl": {"hpgl"},
"application/vnd.pocketlearn": {"plf"},
"audio/x-flac": {"flac"},
"application/vnd.epson.msf": {"msf"},
"application/vnd.lotus-organizer": {"org"},
"application/vnd.sun.xml.writer": {"sxw"},
"application/x-cfs-compressed": {"cfs"},
"audio/vnd.dra": {"dra"},
"audio/x-aiff": {"aif", "aiff", "aifc"},
"image/prs.btif": {"btif"},
"model/vnd.vtu": {"vtu"},
"application/vnd.cinderella": {"cdy"},
"application/vnd.ms-ims": {"ims"},
"application/vnd.yamaha.hv-script": {"hvs"},
"application/x-shar": {"shar"},
"application/x-dtbook+xml": {"dtb"},
"chemical/x-csml": {"csml"},
"video/vnd.dece.mobile": {"uvm", "uvvm"},
"application/exi": {"exi"},
"application/vnd.fsc.weblaunch": {"fsc"},
"application/vnd.noblenet-directory": {"nnd"},
"application/vnd.rn-realmedia": {"rm"},
"video/x-msvideo": {"avi"},
"x-conference/x-cooltalk": {"ice"},
"image/x-icon": {"ico"},
"text/vnd.curl": {"curl"},
"application/dssc+der": {"dssc"},
"application/vnd.dart": {"dart"},
"application/vnd.zul": {"zir", "zirz"},
"audio/vnd.nuera.ecelp7470": {"ecelp7470"},
"application/vnd.ms-powerpoint.addin.macroenabled.12": {"ppam"},
"application/x-envoy": {"evy"},
"application/x-font-type1": {"pfa", "pfb", "pfm", "afm"},
"application/x-sh": {"sh"},
"application/pkix-cert": {"cer"},
"application/rpki-manifest": {"mft"},
"application/scvp-cv-request": {"scq"},
"application/vnd.hhe.lesson-player": {"les"},
"audio/vnd.dece.audio": {"uva", "uvva"},
"text/x-asm": {"s", "asm"},
"application/sparql-results+xml": {"srx"},
"application/vnd.ms-excel": {"xls", "xlm", "xla", "xlc", "xlt", "xlw"},
"application/vnd.shana.informed.formdata": {"ifm"},
"application/vnd.visionary": {"vis"},
"application/x-msclip": {"clp"},
"application/x-stuffit": {"sit"},
"application/cdmi-queue": {"cdmiq"},
"application/pkcs7-mime": {"p7m", "p7c"},
"application/vnd.acucorp": {"atc", "acutc"},
"application/vnd.oasis.opendocument.text-web": {"oth"},
"application/vnd.llamagraphics.life-balance.exchange+xml": {"lbe"},
"application/vnd.mif": {"mif"},
"application/x-sql": {"sql"},
"text/x-vcard": {"vcf"},
"application/vnd.geogebra.tool": {"ggt"},
"application/vnd.mediastation.cdkey": {"cdkey"},
"application/vnd.oasis.opendocument.formula-template": {"odft"},
"application/vnd.openofficeorg.extension": {"oxt"},
"application/vnd.mcd": {"mcd"},
"audio/vnd.rip": {"rip"},
"application/jsonml+json": {"jsonml"},
"application/vnd.data-vision.rdz": {"rdz"},
"image/tiff": {"tiff", "tif"},
"image/x-cmx": {"cmx"},
"video/vnd.dece.hd": {"uvh", "uvvh"},
"application/andrew-inset": {"ez"},
"application/pskc+xml": {"pskcxml"},
"application/vnd.ms-excel.sheet.macroenabled.12": {"xlsm"},
"application/widget": {"wgt"},
"application/vnd.nokia.n-gage.symbian.install": {"n-gage"},
"application/vnd.trueapp": {"tra"},
"application/x-director": {"dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"},
"audio/vnd.lucent.voice": {"lvp"},
"application/metalink4+xml": {"meta4"},
"application/vnd.clonk.c4group": {"c4g", "c4d", "c4f", "c4p", "c4u"},
"application/vnd.enliven": {"nml"},
"application/vnd.mobius.txf": {"txf"},
"video/x-fli": {"fli"},
"application/vnd.powerbuilder6": {"pbd"},
"application/vnd.recordare.musicxml+xml": {"musicxml"},
"application/x-ace-compressed": {"ace"},
"image/gif": {"gif"},
"application/shf+xml": {"shf"},
"application/vnd.groove-tool-template": {"tpl"},
"application/vnd.kahootz": {"ktz", "ktr"},
"application/vnd.lotus-screencam": {"scm"},
"image/png": {"png"},
"video/x-ms-asf": {"asf", "asx"},
"application/vnd.xara": {"xar"},
"font/ttf": {"ttf"},
"video/x-ms-wm": {"wm"},
"application/ccxml+xml": {"ccxml"},
"application/mediaservercontrol+xml": {"mscml"},
"application/resource-lists-diff+xml": {"rld"},
"application/vnd.openxmlformats-officedocument.presentationml.slide": {"sldx"},
"application/vnd.groove-identity-message": {"gim"},
"application/vnd.groove-tool-message": {"gtm"},
"application/vnd.ms-powerpoint": {"ppt", "pps", "pot"},
"application/vnd.oma.dd2+xml": {"dd2"},
"application/vnd.3m.post-it-notes": {"pwn"},
"application/vnd.astraea-software.iota": {"iota"},
"application/vnd.ds-keypoint": {"kpxx"},
"application/vnd.eszigno3+xml": {"es3", "et3"},
"application/vnd.semd": {"semd"},
"application/vnd.sun.xml.calc": {"sxc"},
"application/zip": {"zip"},
"application/vnd.recordare.musicxml": {"mxl"},
"application/vnd.svd": {"svd"},
"application/x-authorware-bin": {"aab", "x32", "u32", "vox"},
"application/x-research-info-systems": {"ris"},
"application/ogg": {"ogx"},
"application/vnd.iccprofile": {"icc", "icm"},
"application/vnd.ms-lrm": {"lrm"},
"application/vnd.ms-word.template.macroenabled.12": {"dotm"},
"text/vnd.curl.scurl": {"scurl"},
"application/x-t3vm-image": {"t3"},
"application/xv+xml": {"mxml", "xhvml", "xvml", "xvm"},
"image/vnd.dxf": {"dxf"},
"image/x-rgb": {"rgb"},
"application/vnd.pvi.ptid1": {"ptid"},
"application/vnd.semf": {"semf"},
"application/vnd.wt.stf": {"stf"},
"application/x-tgif": {"obj"},
"application/json": {"json"},
"application/rdf+xml": {"rdf"},
"application/vnd.adobe.air-application-installer-package+zip": {"air"},
"application/vnd.crick.clicker": {"clkx"},
"text/vnd.sun.j2me.app-descriptor": {"jad"},
"video/x-ms-wmv": {"wmv"},
"application/x-bzip2": {"bz2", "boz"},
"application/pkixcmp": {"pki"},
"application/vnd.epson.quickanime": {"qam"},
"application/vnd.insors.igm": {"igm"},
"application/vnd.nokia.radio-preset": {"rpst"},
"text/x-sfv": {"sfv"},
"application/vnd.ms-powerpoint.presentation.macroenabled.12": {"pptm"},
"application/vnd.stardivision.writer-global": {"sgl"},
"model/vnd.gtw": {"gtw"},
"text/x-pascal": {"p", "pas"},
"application/x-nzb": {"nzb"},
"application/x-tex": {"tex"},
"application/x-zmachine": {"z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"},
"application/vnd.jisp": {"jisp"},
"application/vnd.lotus-wordpro": {"lwp"},
"application/vnd.ms-project": {"mpp", "mpt"},
"application/vnd.simtech-mindmapper": {"twd", "twds"},
"application/x-dvi": {"dvi"},
"application/x-font-snf": {"snf"},
"application/x-netcdf": {"nc", "cdf"},
"application/x-wais-source": {"src"},
"application/onenote": {"onetoc", "onetoc2", "onetmp", "onepkg"},
"application/vnd.ezpix-package": {"ez3"},
"application/vnd.groove-account": {"gac"},
"application/vnd.intergeo": {"i2g"},
"font/otf": {"otf"},
"image/x-3ds": {"3ds"},
"application/pgp-encrypted": {"pgp"},
"application/vnd.frogans.fnc": {"fnc"},
"application/vnd.groove-injector": {"grv"},
"application/x-xfig": {"fig"},
"application/vnd.hp-hpid": {"hpid"},
"application/x-mscardfile": {"crd"},
"application/vnd.3gpp2.tcap": {"tcap"},
"application/vnd.crick.clicker.wordbank": {"clkw"},
"application/vnd.ctc-posml": {"pml"},
"application/vnd.grafeq": {"gqf", "gqs"},
"application/voicexml+xml": {"vxml"},
"text/vnd.in3d.spot": {"spot"},
"application/tei+xml": {"tei", "teicorpus"},
"application/vnd.3gpp.pic-bw-large": {"plb"},
"application/vnd.bmi": {"bmi"},
"application/vnd.musician": {"mus"},
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": {"dotx"},
"application/vnd.sun.xml.writer.global": {"sxg"},
"chemical/x-cmdf": {"cmdf"},
"application/vnd.las.las+xml": {"lasxml"},
"application/vnd.mobius.plc": {"plc"},
"application/vnd.ms-powerpoint.template.macroenabled.12": {"potm"},
"application/vnd.mseq": {"mseq"},
"application/vnd.hal+xml": {"hal"},
"application/vnd.irepository.package+xml": {"irp"},
"application/vnd.tcpdump.pcap": {"pcap", "cap", "dmp"},
"model/iges": {"igs", "iges"},
"application/vnd.groove-help": {"ghf"},
"application/x-bzip": {"bz"},
"application/x-mobipocket-ebook": {"prc", "mobi"},
"model/vnd.collada+xml": {"dae"},
"application/epub+zip": {"epub"},
"application/vnd.crick.clicker.keyboard": {"clkk"},
"application/vnd.geogebra.file": {"ggb"},
"application/vnd.geoplan": {"g2w"},
"application/vnd.dece.unspecified": {"uvx", "uvvx"},
"application/vnd.fujixerox.ddd": {"ddd"},
"application/vnd.ibm.rights-management": {"irm"},
"video/h264": {"h264"},
"video/x-matroska": {"mkv", "mk3d", "mks"},
"application/vnd.criticaltools.wbs+xml": {"wbs"},
"application/x-msbinder": {"obd"},
"application/x-shockwave-flash": {"swf"},
"image/vnd.fst": {"fst"},
"application/vnd.lotus-freelance": {"pre"},
"application/vnd.wap.wmlc": {"wmlc"},
"application/vnd.ms-xpsdocument": {"xps"},
"application/vnd.noblenet-web": {"nnw"},
"application/vnd.vcx": {"vcx"},
"application/vnd.yamaha.openscoreformat": {"osf"},
"application/scvp-vp-request": {"spq"},
"application/vnd.acucobol": {"acu"},
"application/vnd.dreamfactory": {"dfac"},
"application/vnd.jcp.javame.midlet-rms": {"rms"},
"audio/vnd.dts.hd": {"dtshd"},
"application/vnd.openxmlformats-officedocument.presentationml.presentation": {"pptx"},
"application/x-ms-wmz": {"wmz"},
"text/x-uuencode": {"uu"},
"text/cache-manifest": {"appcache"},
"application/vnd.cluetrust.cartomobile-config-pkg": {"c11amz"},
"application/vnd.oasis.opendocument.database": {"odb"},
"application/vnd.oasis.opendocument.text": {"odt"},
"audio/vnd.ms-playready.media.pya": {"pya"},
"application/pkix-pkipath": {"pkipath"},
"application/vnd.syncml+xml": {"xsm"},
"application/vnd.zzazz.deck+xml": {"zaz"},
"application/x-debian-package": {"deb", "udeb"},
"application/x-font-bdf": {"bdf"},
"application/x-tcl": {"tcl"},
"audio/x-matroska": {"mka"},
"text/tab-separated-values": {"tsv"},
"application/gpx+xml": {"gpx"},
"application/vnd.fdf": {"fdf"},
"application/vnd.kinar": {"kne", "knp"},
"application/vnd.oasis.opendocument.graphics": {"odg"},
"application/vnd.oasis.opendocument.spreadsheet": {"ods"},
"application/x-7z-compressed": {"7z"},
"application/x-gca-compressed": {"gca"},
"video/mpeg": {"mpeg", "mpg", "mpe", "m1v", "m2v"},
"application/vnd.solent.sdkm+xml": {"sdkm", "sdkd"},
"application/x-glulx": {"ulx"},
"application/xop+xml": {"xop"},
"text/turtle": {"ttl"},
"application/set-registration-initiation": {"setreg"},
"application/vnd.adobe.formscentral.fcdt": {"fcdt"},
"application/vnd.mozilla.xul+xml": {"xul"},
"application/vnd.oasis.opendocument.graphics-template": {"otg"},
"text/vnd.fmi.flexstor": {"flx"},
"video/3gpp": {"3gp"},
"application/x-abiword": {"abw"},
"application/marc": {"mrc"},
"application/vnd.fluxtime.clip": {"ftc"},
"application/vnd.osgeo.mapguide.package": {"mgp"},
"application/vnd.yellowriver-custom-menu": {"cmp"},
"application/mets+xml": {"mets"},
"application/vnd.geospace": {"g3w"},
"application/vnd.mobius.mqy": {"mqy"},
"application/x-apple-diskimage": {"dmg"},
"application/vnd.flographit": {"gph"},
"application/vnd.micrografx.flo": {"flo"},
"application/x-java-jnlp-file": {"jnlp"},
"image/x-portable-anymap": {"pnm"},
"application/vnd.rim.cod": {"cod"},
"image/x-tga": {"tga"},
"application/vnd.crick.clicker.palette": {"clkp"},
"application/vnd.cups-ppd": {"ppd"},
"application/vnd.kde.kspread": {"ksp"},
"application/vnd.ms-works": {"wps", "wks", "wcm", "wdb"},
"application/vnd.shana.informed.interchange": {"iif"},
"application/vnd.trid.tpt": {"tpt"},
"application/x-sv4cpio": {"sv4cpio"},
"application/atomsvc+xml": {"atomsvc"},
"application/cdmi-container": {"cdmic"},
"application/vnd.noblenet-sealer": {"nns"},
"application/vnd.realvnc.bed": {"bed"},
"application/x-lzh-compressed": {"lzh", "lha"},
"image/vnd.net-fpx": {"npx"},
"application/hyperstudio": {"stk"},
"application/sdp": {"sdp"},
"application/vnd.epson.ssf": {"ssf"},
"application/x-csh": {"csh"},
"audio/xm": {"xm"},
"model/mesh": {"msh", "mesh", "silo"},
"text/vcard": {"vcard"},
"video/vnd.dvb.file": {"dvb"},
"application/vnd.ms-pki.stl": {"stl"},
"application/vnd.oasis.opendocument.formula": {"odf"},
"application/vnd.ufdl": {"ufd", "ufdl"},
"application/x-mspublisher": {"pub"},
"application/relax-ng-compact-syntax": {"rnc"},
"application/vnd.mobius.mbk": {"mbk"},
"image/x-pcx": {"pcx"},
"model/x3d+xml": {"x3d", "x3dz"},
"application/wsdl+xml": {"wsdl"},
"image/jpeg": {"jpeg", "jpg", "jpe"},
"application/srgs+xml": {"grxml"},
"application/vnd.oasis.opendocument.chart-template": {"otc"},
"application/vnd.oasis.opendocument.image": {"odi"},
"application/vnd.syncml.dm+xml": {"xdm"},
"application/vnd.denovo.fcselayout-link": {"fe_launch"},
"application/vnd.ms-wpl": {"wpl"},
"image/ktx": {"ktx"},
"application/java-vm": {"class"},
"application/oxps": {"oxps"},
"image/vnd.ms-modi": {"mdi"},
"video/vnd.mpegurl": {"mxu", "m4u"},
"application/vnd.hp-pcl": {"pcl"},
"application/vnd.publishare-delta-tree": {"qps"},
"application/vnd.stardivision.impress": {"sdd"},
"application/vnd.stepmania.stepchart": {"sm"},
"application/vnd.pmi.widget": {"wg"},
"audio/vnd.digital-winds": {"eol"},
"application/pdf": {"pdf"},
"application/vnd.3gpp.pic-bw-var": {"pvb"},
"application/vnd.curl.car": {"car"},
"application/vnd.oasis.opendocument.text-template": {"ott"},
"application/x-authorware-seg": {"aas"},
"image/x-cmu-raster": {"ras"},
"application/mac-compactpro": {"cpt"},
"application/marcxml+xml": {"mrcx"},
"application/pkcs8": {"p8"},
"application/vnd.tao.intent-module-archive": {"tao"},
"application/vnd.wqd": {"wqd"},
"application/mads+xml": {"mads"},
"application/mp4": {"mp4s"},
"application/vnd.hp-jlyt": {"jlt"},
"application/vnd.ibm.minipay": {"mpy"},
"application/x-cpio": {"cpio"},
"application/xenc+xml": {"xenc"},
"application/emma+xml": {"emma"},
"application/scvp-cv-response": {"scs"},
"application/vnd.hp-hps": {"hps"},
"application/vnd.sun.xml.writer.template": {"stw"},
"image/vnd.adobe.photoshop": {"psd"},
"video/mj2": {"mj2", "mjp2"},
"application/vnd.amiga.ami": {"ami"},
"application/vnd.hydrostatix.sof-data": {"sfd-hdstx"},
"application/vnd.pg.osasli": {"ei6"},
"application/x-tads": {"gam"},
"application/vnd.wordperfect": {"wpd"},
"application/x-texinfo": {"texinfo", "texi"},
"message/rfc822": {"eml", "mime"},
"text/csv": {"csv"},
"application/vnd.adobe.xfdf": {"xfdf"},
"application/vnd.anser-web-certificate-issue-initiation": {"cii"},
"application/vnd.shana.informed.package": {"ipk"},
"application/vnd.unity": {"unityweb"},
"text/vnd.wap.wmlscript": {"wmls"},
"video/x-m4v": {"m4v"},
"video/x-ms-wmx": {"wmx"},
"application/vnd.osgi.dp": {"dp"},
"application/vnd.proteus.magazine": {"mgz"},
"audio/mp4": {"m4a", "mp4a"},
"video/h263": {"h263"},
"application/vnd.accpac.simply.aso": {"aso"},
"application/vnd.nitf": {"ntf", "nitf"},
"application/vnd.nokia.n-gage.data": {"ngdat"},
"application/vnd.oasis.opendocument.presentation": {"odp"},
"application/vnd.fujitsu.oasysgp": {"fg5"},
"application/vnd.fujixerox.docuworks.binder": {"xbd"},
"application/vnd.wap.wbxml": {"wbxml"},
"application/x-ustar": {"ustar"},
"text/css": {"css"},
"text/vnd.dvb.subtitle": {"sub"},
"text/vnd.wap.wml": {"wml"},
"application/vnd.oasis.opendocument.spreadsheet-template": {"ots"},
"application/x-pkcs7-certificates": {"p7b", "spc"},
"audio/midi": {"mid", "midi", "kar", "rmi"},
"image/vnd.ms-photo": {"wdp"},
"video/h261": {"h261"},
"application/vnd.dvb.service": {"svc"},
"application/vnd.stardivision.calc": {"sdc"},
"application/yin+xml": {"yin"},
"audio/x-mpegurl": {"m3u"},
"application/vnd.triscape.mxs": {"mxs"},
"application/x-chat": {"chat"},
"text/n3": {"n3"},
"application/pics-rules": {"prf"},
"application/vnd.fujitsu.oasys2": {"oa2"},
"application/vnd.hbci": {"hbci"},
"application/vnd.oasis.opendocument.image-template": {"oti"},
"application/vnd.fujitsu.oasys3": {"oa3"},
"application/vnd.sema": {"sema"},
"audio/vnd.nuera.ecelp4800": {"ecelp4800"},
"text/x-java-source": {"java"},
"application/davmount+xml": {"davmount"},
"application/pgp-signature": {"asc", "sig"},
"application/pkcs10": {"p10"},
"application/reginfo+xml": {"rif"},
"application/vnd.amazon.ebook": {"azw"},
"application/vnd.sun.xml.impress.template": {"sti"},
"image/x-xwindowdump": {"xwd"},
"video/jpeg": {"jpgv"},
"chemical/x-cdx": {"cdx"},
"image/vnd.dvb.subtitle": {"sub"},
"application/x-latex": {"latex"},
"application/x-silverlight-app": {"xap"},
"image/cgm": {"cgm"},
"text/x-fortran": {"f", "for", "f77", "f90"},
"application/rpki-ghostbusters": {"gbr"},
"application/vnd.ibm.modcap": {"afp", "listafp", "list3820"},
"application/vnd.lotus-1-2-3": {"123"},
"application/vnd.novadigm.edm": {"edm"},
"application/mathematica": {"ma", "nb", "mb"},
"application/vnd.kidspiration": {"kia"},
"audio/x-caf": {"caf"},
"text/vnd.curl.dcurl": {"dcurl"},
"application/x-ms-wmd": {"wmd"},
"image/webp": {"webp"},
"application/javascript": {"js"},
"application/srgs": {"gram"},
"application/vnd.oasis.opendocument.presentation-template": {"otp"},
"application/vnd.pawaafile": {"paw"},
"application/vnd.ms-powerpoint.slideshow.macroenabled.12": {"ppsm"},
"application/x-eva": {"eva"},
"image/svg+xml": {"svg", "svgz"},
"application/vnd.mobius.msl": {"msl"},
"application/vnd.muvee.style": {"msty"},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {"xlsx"},
"application/x-sv4crc": {"sv4crc"},
"application/gml+xml": {"gml"},
"application/pkix-crl": {"crl"},
"application/set-payment-initiation": {"setpay"},
"application/vnd.genomatix.tuxedo": {"txd"},
"image/vnd.dece.graphic": {"uvi", "uvvi", "uvg", "uvvg"},
"image/vnd.wap.wbmp": {"wbmp"},
"text/x-setext": {"etx"},
"application/atom+xml": {"atom"},
"application/timestamped-data": {"tsd"},
"application/vnd.sun.xml.calc.template": {"stc"},
"application/vnd.yamaha.openscoreformat.osfpvg+xml": {"osfpvg"},
"application/x-stuffitx": {"sitx"},
"model/vrml": {"wrl", "vrml"},
"video/quicktime": {"qt", "mov"},
"application/cdmi-domain": {"cdmid"},
"application/vnd.geometry-explorer": {"gex", "gre"},
"application/x-gnumeric": {"gnumeric"},
"application/x-ms-shortcut": {"lnk"},
"application/vnd.spotfire.sfs": {"sfs"},
"application/x-gramps-xml": {"gramps"},
"application/x-pkcs12": {"p12", "pfx"},
"audio/vnd.nuera.ecelp9600": {"ecelp9600"},
"application/applixware": {"aw"},
"application/font-tdpfr": {"pfr"},
"application/vnd.dece.zip": {"uvz", "uvvz"},
"application/vnd.dna": {"dna"},
"image/vnd.xiff": {"xif"},
"text/html": {"html", "htm"},
"video/vnd.dece.pd": {"uvp", "uvvp"},
"application/vnd.kde.karbon": {"karbon"},
"application/vnd.kde.kchart": {"chrt"},
"application/vnd.koan": {"skp", "skd", "skt", "skm"},
"image/g3fax": {"g3"},
"application/x-cdlink": {"vcd"},
"application/x-msmediaview": {"mvb", "m13", "m14"},
"audio/s3m": {"s3m"},
"text/x-c": {"c", "cc", "cxx", "cpp", "h", "hh", "dic"},
"application/cdmi-capability": {"cdmia"},
"application/patch-ops-error+xml": {"xer"},
"application/vnd.chipnuts.karaoke-mmd": {"mmd"},
"application/vnd.lotus-notes": {"nsf"},
"video/x-smv": {"smv"},
"application/x-x509-ca-cert": {"der", "crt"},
"audio/basic": {"au", "snd"},
"application/rpki-roa": {"roa"},
"application/vnd.accpac.simply.imp": {"imp"},
"application/vnd.cosmocaller": {"cmc"},
"application/vnd.ms-word.document.macroenabled.12": {"docm"},
"application/x-mswrite": {"wri"},
"application/xaml+xml": {"xaml"},
"image/x-portable-graymap": {"pgm"},
"application/pkix-attr-cert": {"ac"},
"application/vnd.mobius.daf": {"daf"},
"application/vnd.sun.xml.impress": {"sxi"},
"application/x-font-pcf": {"pcf"},
"text/vnd.graphviz": {"gv"},
"video/jpm": {"jpm", "jpgm"},
"video/vnd.uvvu.mp4": {"uvu", "uvvu"},
"video/x-sgi-movie": {"movie"},
"application/vnd.apple.mpegurl": {"m3u8"},
"application/vnd.xfdl": {"xfdl"},
"application/x-font-ghostscript": {"gsf"},
"application/x-hdf": {"hdf"},
"text/troff": {"t", "tr", "roff", "man", "me", "ms"},
"application/msword": {"doc", "dot"},
"application/pls+xml": {"pls"},
"application/vnd.fujitsu.oasysprs": {"bh2"},
"application/vnd.symbian.install": {"sis", "sisx"},
"application/vnd.sus-calendar": {"sus", "susp"},
"application/x-conference": {"nsc"},
"image/vnd.djvu": {"djvu", "djv"},
"text/plain": {"txt", "text", "conf", "def", "list", "log", "in"},
"application/docbook+xml": {"dbk"},
"application/mods+xml": {"mods"},
"application/vnd.intu.qfx": {"qfx"},
"application/vnd.llamagraphics.life-balance.desktop": {"lbd"},
"text/x-vcalendar": {"vcs"},
"image/vnd.fpx": {"fpx"},
"video/x-flv": {"flv"},
"application/cu-seeme": {"cu"},
"application/vnd.mobius.dis": {"dis"},
"application/vnd.rn-realmedia-vbr": {"rmvb"},
"audio/x-pn-realaudio-plugin": {"rmp"},
"image/sgi": {"sgi"},
"application/rtf": {"rtf"},
"application/vnd.curl.pcurl": {"pcurl"},
"application/vnd.seemail": {"see"},
"application/vnd.webturbo": {"wtb"},
"application/mbox": {"mbox"},
"application/vnd.framemaker": {"fm", "frame", "maker", "book"},
"application/x-dgc-compressed": {"dgc"},
"video/webm": {"webm"},
"model/x3d+vrml": {"x3dv", "x3dvz"},
"video/3gpp2": {"3g2"},
"application/vnd.mynfc": {"taglet"},
"application/vnd.novadigm.edx": {"edx"},
"application/x-msdownload": {"exe", "dll", "com", "bat", "msi"},
"audio/x-pn-realaudio": {"ram", "ra"},
"application/vnd.route66.link66+xml": {"link66"},
"application/x-msschedule": {"scd"},
"application/xml-dtd": {"dtd"},
"image/x-xpixmap": {"xpm"},
"application/ecmascript": {"ecma"},
"application/resource-lists+xml": {"rl"},
"application/vnd.chemdraw+xml": {"cdxml"},
"application/vnd.ms-cab-compressed": {"cab"},
"audio/webm": {"weba"},
"model/vnd.gdl": {"gdl"},
"text/x-opml": {"opml"},
"application/x-bittorrent": {"torrent"},
"application/x-iso9660-image": {"iso"},
"application/x-ms-application": {"application"},
"application/x-subrip": {"srt"},
"application/vnd.antix.game-component": {"atx"},
"application/vnd.dvb.ait": {"ait"},
"application/dssc+xml": {"xdssc"},
"application/vnd.cluetrust.cartomobile-config": {"c11amc"},
"image/x-portable-bitmap": {"pbm"},
"application/x-msmetafile": {"wmf", "wmz", "emf", "emz"},
}