diff options
author | 2022-03-25 07:12:02 -0700 | |
---|---|---|
committer | 2022-03-25 07:12:02 -0700 | |
commit | e3fb88b06af43665128083cec2cf8cad45148cf6 (patch) | |
tree | 405ea57a73fa3b5446987cc3d8593cff8d6f4ac2 /src | |
parent | be5789fe01eb510ba56c101e2cef82b37dc2ad07 (diff) | |
download | bun-e3fb88b06af43665128083cec2cf8cad45148cf6.tar.gz bun-e3fb88b06af43665128083cec2cf8cad45148cf6.tar.zst bun-e3fb88b06af43665128083cec2cf8cad45148cf6.zip |
[bun.js] configuration and error handling for HTTP server
Diffstat (limited to 'src')
-rw-r--r-- | src/bundler/entry_points.zig | 12 | ||||
-rw-r--r-- | src/bunfig.zig | 12 | ||||
-rw-r--r-- | src/comptime_string_map.zig | 8 | ||||
-rw-r--r-- | src/deps/uws.zig | 4 | ||||
-rw-r--r-- | src/http/mime_type.zig | 2453 | ||||
-rw-r--r-- | src/http/websocket.zig | 4 | ||||
-rw-r--r-- | src/javascript/jsc/api/bun.zig | 39 | ||||
-rw-r--r-- | src/javascript/jsc/api/html_rewriter.zig | 31 | ||||
-rw-r--r-- | src/javascript/jsc/api/server.zig | 389 | ||||
-rw-r--r-- | src/javascript/jsc/bindings/bindings.zig | 7 | ||||
-rw-r--r-- | src/javascript/jsc/webcore/response.zig | 211 | ||||
-rw-r--r-- | src/jsc.zig | 3 | ||||
-rw-r--r-- | src/runtime.version | 2 | ||||
-rw-r--r-- | src/runtime/hmr.ts | 20 |
14 files changed, 1787 insertions, 1408 deletions
diff --git a/src/bundler/entry_points.zig b/src/bundler/entry_points.zig index 252cfd9b1..6c9e7a278 100644 --- a/src/bundler/entry_points.zig +++ b/src/bundler/entry_points.zig @@ -189,8 +189,16 @@ pub const ServerEntryPoint = struct { \\if ('default' in start && "__internalIsCommonJSNamespace" in globalThis && __internalIsCommonJSNamespace(start)) {{ \\ entryNamespace = start.default(); \\}} - \\if(typeof entryNamespace?.default?.fetch === 'function') Bun.startServer(entryNamespace.default.fetch); - \\if(typeof entryNamespace?.default?.cli === 'function') Bun.startServer(entryNamespace.default.cli); + \\if (typeof entryNamespace?.then === 'function') {{ + \\ entryNamespace = entryNamespace.then((entryNamespace) => {{ + \\ if(typeof entryNamespace?.default?.fetch === 'function') {{ + \\ Bun.serve(entryNamespace.default); + \\ }} + \\ }}, reportError); + \\}} else if (typeof entryNamespace?.default?.fetch === 'function') {{ + \\ Bun.serve(entryNamespace); + \\}} + \\ , .{ dir_to_use, diff --git a/src/bunfig.zig b/src/bunfig.zig index 4298a2b26..2592f91db 100644 --- a/src/bunfig.zig +++ b/src/bunfig.zig @@ -148,6 +148,18 @@ pub const Bunfig = struct { this.bunfig.origin = try expr.data.e_string.string(allocator); } + if (comptime cmd == .RunCommand or cmd == .AutoCommand) { + if (json.get("serve")) |expr| { + if (expr.get("port")) |port| { + try this.expect(port, .e_number); + this.bunfig.port = port.data.e_number.toU16(); + if (this.bunfig.port.? == 0) { + this.bunfig.port = 3000; + } + } + } + } + if (comptime cmd == .DevCommand or cmd == .AutoCommand) { if (json.get("dev")) |expr| { if (expr.get("disableBunJS")) |disable| { diff --git a/src/comptime_string_map.zig b/src/comptime_string_map.zig index bae2fce8a..b4cc733e1 100644 --- a/src/comptime_string_map.zig +++ b/src/comptime_string_map.zig @@ -16,7 +16,7 @@ pub fn ComptimeStringMapWithKeyType(comptime KeyType: type, comptime V: type, co }; const precomputed = comptime blk: { - @setEvalBranchQuota(2000); + @setEvalBranchQuota(99999); var sorted_kvs: [kvs_list.len]KV = undefined; const lenAsc = (struct { @@ -47,7 +47,10 @@ pub fn ComptimeStringMapWithKeyType(comptime KeyType: type, comptime V: type, co var len_indexes: [max_len + 1]usize = undefined; var len: usize = 0; var i: usize = 0; + while (len <= max_len) : (len += 1) { + @setEvalBranchQuota(99999); + // find the first keyword len == len while (len > sorted_kvs[i].key.len) { i += 1; @@ -73,7 +76,10 @@ pub fn ComptimeStringMapWithKeyType(comptime KeyType: type, comptime V: type, co pub fn getWithLength(str: []const KeyType, comptime len: usize) ?V { const end = comptime brk: { var i = len_indexes[len]; + @setEvalBranchQuota(99999); + while (i < kvs.len and kvs[i].key.len == len) : (i += 1) {} + break :brk i; }; diff --git a/src/deps/uws.zig b/src/deps/uws.zig index 2769373f5..4fb544136 100644 --- a/src/deps/uws.zig +++ b/src/deps/uws.zig @@ -396,10 +396,10 @@ pub fn NewApp(comptime ssl: bool) type { pub fn getNativeHandle(app: *ThisApp) ?*anyopaque { return uws_get_native_handle(ssl_flag, app); } - pub fn removeServerName(app: *ThisApp, hostname_pattern: [:0]const u8) void { + pub fn removeServerName(app: *ThisApp, hostname_pattern: [*:0]const u8) void { return uws_remove_server_name(ssl_flag, @ptrCast(*uws_app_t, app), hostname_pattern); } - pub fn addServerName(app: *ThisApp, hostname_pattern: [:0]const u8) void { + pub fn addServerName(app: *ThisApp, hostname_pattern: [*:0]const u8) void { return uws_add_server_name(ssl_flag, @ptrCast(*uws_app_t, app), hostname_pattern); } pub fn addServerNameWithOptions(app: *ThisApp, hostname_pattern: [:0]const u8, opts: us_socket_context_options_t) void { diff --git a/src/http/mime_type.zig b/src/http/mime_type.zig index 3d7c16c85..5818c88ea 100644 --- a/src/http/mime_type.zig +++ b/src/http/mime_type.zig @@ -41,9 +41,11 @@ pub const Category = enum { video, javascript, wasm, + application, + model, + message, @"x-conference", @"x-shader", - @"x-shader", @"chemical", @"multipart", @@ -162,11 +164,16 @@ pub fn byLoader(loader: Loader, ext: string) MimeType { } pub fn byExtension(ext: string) MimeType { - return all.extensions.get(ext) orelse MimeType.other; + return byExtensionNoDefault(ext) orelse MimeType.other; +} + +pub fn byExtensionNoDefault(ext: string) ?MimeType { + return extensions.get(ext); } // this is partially auto-generated pub const all = struct { + pub const @"application/webassembly" = wasm; pub const @"application/1d-interleaved-parityfec": MimeType = MimeType{ .category = .@"application", .value = "application/1d-interleaved-parityfec" }; pub const @"application/3gpdash-qoe-report+xml": MimeType = MimeType{ .category = .@"application", .value = "application/3gpdash-qoe-report+xml" }; pub const @"application/3gpp-ims+xml": MimeType = MimeType{ .category = .@"application", .value = "application/3gpp-ims+xml" }; @@ -2455,1231 +2462,1219 @@ pub const all = struct { }; pub const extensions = ComptimeStringMap(MimeType, .{ - .{ .@"123", all.@"application/vnd.lotus-1-2-3" }, - .{ .@"1km", all.@"application/vnd.1000minds.decision-model+xml" }, - .{ .@"3dml", all.@"text/vnd.in3d.3dml" }, - .{ .@"3ds", all.@"image/x-3ds" }, - .{ .@"3g2", all.@"video/3gpp2" }, - .{ .@"3gp", all.@"video/3gpp" }, - .{ .@"3gpp", all.@"audio/3gpp" }, - .{ .@"3gpp", all.@"video/3gpp" }, - .{ .@"3mf", all.@"model/3mf" }, - .{ .@"7z", all.@"application/x-7z-compressed" }, - .{ .@"aab", all.@"application/x-authorware-bin" }, - .{ .@"aac", all.@"audio/x-aac" }, - .{ .@"aam", all.@"application/x-authorware-map" }, - .{ .@"aas", all.@"application/x-authorware-seg" }, - .{ .@"abw", all.@"application/x-abiword" }, - .{ .@"ac", all.@"application/pkix-attr-cert" }, - .{ .@"ac", all.@"application/vnd.nokia.n-gage.ac+xml" }, - .{ .@"acc", all.@"application/vnd.americandynamics.acc" }, - .{ .@"ace", all.@"application/x-ace-compressed" }, - .{ .@"acu", all.@"application/vnd.acucobol" }, - .{ .@"acutc", all.@"application/vnd.acucorp" }, - .{ .@"adp", all.@"audio/adpcm" }, - .{ .@"aep", all.@"application/vnd.audiograph" }, - .{ .@"afm", all.@"application/x-font-type1" }, - .{ .@"afp", all.@"application/vnd.ibm.modcap" }, - .{ .@"age", all.@"application/vnd.age" }, - .{ .@"ahead", all.@"application/vnd.ahead.space" }, - .{ .@"ai", all.@"application/postscript" }, - .{ .@"aif", all.@"audio/x-aiff" }, - .{ .@"aifc", all.@"audio/x-aiff" }, - .{ .@"aiff", all.@"audio/x-aiff" }, - .{ .@"air", all.@"application/vnd.adobe.air-application-installer-package+zip" }, - .{ .@"ait", all.@"application/vnd.dvb.ait" }, - .{ .@"ami", all.@"application/vnd.amiga.ami" }, - .{ .@"amr", all.@"audio/amr" }, - .{ .@"apk", all.@"application/vnd.android.package-archive" }, - .{ .@"apng", all.@"image/apng" }, - .{ .@"appcache", all.@"text/cache-manifest" }, - .{ .@"application", all.@"application/x-ms-application" }, - .{ .@"apr", all.@"application/vnd.lotus-approach" }, - .{ .@"arc", all.@"application/x-freearc" }, - .{ .@"arj", all.@"application/x-arj" }, - .{ .@"asc", all.@"application/pgp-keys" }, - .{ .@"asc", all.@"application/pgp-signature" }, - .{ .@"asf", all.@"video/x-ms-asf" }, - .{ .@"asm", all.@"text/x-asm" }, - .{ .@"aso", all.@"application/vnd.accpac.simply.aso" }, - .{ .@"asx", all.@"video/x-ms-asf" }, - .{ .@"atc", all.@"application/vnd.acucorp" }, - .{ .@"atom", all.@"application/atom+xml" }, - .{ .@"atomcat", all.@"application/atomcat+xml" }, - .{ .@"atomdeleted", all.@"application/atomdeleted+xml" }, - .{ .@"atomsvc", all.@"application/atomsvc+xml" }, - .{ .@"atx", all.@"application/vnd.antix.game-component" }, - .{ .@"au", all.@"audio/basic" }, - .{ .@"avci", all.@"image/avci" }, - .{ .@"avcs", all.@"image/avcs" }, - .{ .@"avi", all.@"video/x-msvideo" }, - .{ .@"avif", all.@"image/avif" }, - .{ .@"aw", all.@"application/applixware" }, - .{ .@"azf", all.@"application/vnd.airzip.filesecure.azf" }, - .{ .@"azs", all.@"application/vnd.airzip.filesecure.azs" }, - .{ .@"azv", all.@"image/vnd.airzip.accelerator.azv" }, - .{ .@"azw", all.@"application/vnd.amazon.ebook" }, - .{ .@"b16", all.@"image/vnd.pco.b16" }, - .{ .@"bat", all.@"application/x-msdownload" }, - .{ .@"bcpio", all.@"application/x-bcpio" }, - .{ .@"bdf", all.@"application/x-font-bdf" }, - .{ .@"bdm", all.@"application/vnd.syncml.dm+wbxml" }, - .{ .@"bdoc", all.@"application/bdoc" }, - .{ .@"bdoc", all.@"application/x-bdoc" }, - .{ .@"bed", all.@"application/vnd.realvnc.bed" }, - .{ .@"bh2", all.@"application/vnd.fujitsu.oasysprs" }, - .{ .@"bin", all.@"application/octet-stream" }, - .{ .@"blb", all.@"application/x-blorb" }, - .{ .@"blorb", all.@"application/x-blorb" }, - .{ .@"bmi", all.@"application/vnd.bmi" }, - .{ .@"bmml", all.@"application/vnd.balsamiq.bmml+xml" }, - .{ .@"bmp", all.@"image/bmp" }, - .{ .@"bmp", all.@"image/x-ms-bmp" }, - .{ .@"book", all.@"application/vnd.framemaker" }, - .{ .@"box", all.@"application/vnd.previewsystems.box" }, - .{ .@"boz", all.@"application/x-bzip2" }, - .{ .@"bpk", all.@"application/octet-stream" }, - .{ .@"bsp", all.@"model/vnd.valve.source.compiled-map" }, - .{ .@"btif", all.@"image/prs.btif" }, - .{ .@"buffer", all.@"application/octet-stream" }, - .{ .@"bz", all.@"application/x-bzip" }, - .{ .@"bz2", all.@"application/x-bzip2" }, - .{ .@"c", all.@"text/x-c" }, - .{ .@"c11amc", all.@"application/vnd.cluetrust.cartomobile-config" }, - .{ .@"c11amz", all.@"application/vnd.cluetrust.cartomobile-config-pkg" }, - .{ .@"c4d", all.@"application/vnd.clonk.c4group" }, - .{ .@"c4f", all.@"application/vnd.clonk.c4group" }, - .{ .@"c4g", all.@"application/vnd.clonk.c4group" }, - .{ .@"c4p", all.@"application/vnd.clonk.c4group" }, - .{ .@"c4u", all.@"application/vnd.clonk.c4group" }, - .{ .@"cab", all.@"application/vnd.ms-cab-compressed" }, - .{ .@"caf", all.@"audio/x-caf" }, - .{ .@"cap", all.@"application/vnd.tcpdump.pcap" }, - .{ .@"car", all.@"application/vnd.curl.car" }, - .{ .@"cat", all.@"application/vnd.ms-pki.seccat" }, - .{ .@"cb7", all.@"application/x-cbr" }, - .{ .@"cba", all.@"application/x-cbr" }, - .{ .@"cbr", all.@"application/x-cbr" }, - .{ .@"cbt", all.@"application/x-cbr" }, - .{ .@"cbz", all.@"application/x-cbr" }, - .{ .@"cc", all.@"text/x-c" }, - .{ .@"cco", all.@"application/x-cocoa" }, - .{ .@"cct", all.@"application/x-director" }, - .{ .@"ccxml", all.@"application/ccxml+xml" }, - .{ .@"cdbcmsg", all.@"application/vnd.contact.cmsg" }, - .{ .@"cdf", all.@"application/x-netcdf" }, - .{ .@"cdfx", all.@"application/cdfx+xml" }, - .{ .@"cdkey", all.@"application/vnd.mediastation.cdkey" }, - .{ .@"cdmia", all.@"application/cdmi-capability" }, - .{ .@"cdmic", all.@"application/cdmi-container" }, - .{ .@"cdmid", all.@"application/cdmi-domain" }, - .{ .@"cdmio", all.@"application/cdmi-object" }, - .{ .@"cdmiq", all.@"application/cdmi-queue" }, - .{ .@"cdx", all.@"chemical/x-cdx" }, - .{ .@"cdxml", all.@"application/vnd.chemdraw+xml" }, - .{ .@"cdy", all.@"application/vnd.cinderella" }, - .{ .@"cer", all.@"application/pkix-cert" }, - .{ .@"cfs", all.@"application/x-cfs-compressed" }, - .{ .@"cgm", all.@"image/cgm" }, - .{ .@"chat", all.@"application/x-chat" }, - .{ .@"chm", all.@"application/vnd.ms-htmlhelp" }, - .{ .@"chrt", all.@"application/vnd.kde.kchart" }, - .{ .@"cif", all.@"chemical/x-cif" }, - .{ .@"cii", all.@"application/vnd.anser-web-certificate-issue-initiation" }, - .{ .@"cil", all.@"application/vnd.ms-artgalry" }, - .{ .@"cjs", all.@"application/javascript" }, - .{ .@"cla", all.@"application/vnd.claymore" }, - .{ .@"class", all.@"application/java-vm" }, - .{ .@"clkk", all.@"application/vnd.crick.clicker.keyboard" }, - .{ .@"clkp", all.@"application/vnd.crick.clicker.palette" }, - .{ .@"clkt", all.@"application/vnd.crick.clicker.template" }, - .{ .@"clkw", all.@"application/vnd.crick.clicker.wordbank" }, - .{ .@"clkx", all.@"application/vnd.crick.clicker" }, - .{ .@"clp", all.@"application/x-msclip" }, - .{ .@"cmc", all.@"application/vnd.cosmocaller" }, - .{ .@"cmdf", all.@"chemical/x-cmdf" }, - .{ .@"cml", all.@"chemical/x-cml" }, - .{ .@"cmp", all.@"application/vnd.yellowriver-custom-menu" }, - .{ .@"cmx", all.@"image/x-cmx" }, - .{ .@"cod", all.@"application/vnd.rim.cod" }, - .{ .@"coffee", all.@"text/coffeescript" }, - .{ .@"com", all.@"application/x-msdownload" }, - .{ .@"conf", all.@"text/plain" }, - .{ .@"cpio", all.@"application/x-cpio" }, - .{ .@"cpl", all.@"application/cpl+xml" }, - .{ .@"cpp", all.@"text/x-c" }, - .{ .@"cpt", all.@"application/mac-compactpro" }, - .{ .@"crd", all.@"application/x-mscardfile" }, - .{ .@"crl", all.@"application/pkix-crl" }, - .{ .@"crt", all.@"application/x-x509-ca-cert" }, - .{ .@"crx", all.@"application/x-chrome-extension" }, - .{ .@"cryptonote", all.@"application/vnd.rig.cryptonote" }, - .{ .@"csh", all.@"application/x-csh" }, - .{ .@"csl", all.@"application/vnd.citationstyles.style+xml" }, - .{ .@"csml", all.@"chemical/x-csml" }, - .{ .@"csp", all.@"application/vnd.commonspace" }, - .{ .@"css", all.@"text/css" }, - .{ .@"cst", all.@"application/x-director" }, - .{ .@"csv", all.@"text/csv" }, - .{ .@"cts", all.@"application/javascript" }, - .{ .@"cu", all.@"application/cu-seeme" }, - .{ .@"curl", all.@"text/vnd.curl" }, - .{ .@"cww", all.@"application/prs.cww" }, - .{ .@"cxt", all.@"application/x-director" }, - .{ .@"cxx", all.@"text/x-c" }, - .{ .@"dae", all.@"model/vnd.collada+xml" }, - .{ .@"daf", all.@"application/vnd.mobius.daf" }, - .{ .@"dart", all.@"application/vnd.dart" }, - .{ .@"dataless", all.@"application/vnd.fdsn.seed" }, - .{ .@"davmount", all.@"application/davmount+xml" }, - .{ .@"dbf", all.@"application/vnd.dbf" }, - .{ .@"dbk", all.@"application/docbook+xml" }, - .{ .@"dcr", all.@"application/x-director" }, - .{ .@"dcurl", all.@"text/vnd.curl.dcurl" }, - .{ .@"dd2", all.@"application/vnd.oma.dd2+xml" }, - .{ .@"ddd", all.@"application/vnd.fujixerox.ddd" }, - .{ .@"ddf", all.@"application/vnd.syncml.dmddf+xml" }, - .{ .@"dds", all.@"image/vnd.ms-dds" }, - .{ .@"deb", all.@"application/octet-stream" }, - .{ .@"deb", all.@"application/x-debian-package" }, - .{ .@"def", all.@"text/plain" }, - .{ .@"deploy", all.@"application/octet-stream" }, - .{ .@"der", all.@"application/x-x509-ca-cert" }, - .{ .@"dfac", all.@"application/vnd.dreamfactory" }, - .{ .@"dgc", all.@"application/x-dgc-compressed" }, - .{ .@"dic", all.@"text/x-c" }, - .{ .@"dir", all.@"application/x-director" }, - .{ .@"dis", all.@"application/vnd.mobius.dis" }, - .{ .@"disposition-notification", all.@"message/disposition-notification" }, - .{ .@"dist", all.@"application/octet-stream" }, - .{ .@"distz", all.@"application/octet-stream" }, - .{ .@"djv", all.@"image/vnd.djvu" }, - .{ .@"djvu", all.@"image/vnd.djvu" }, - .{ .@"dll", all.@"application/octet-stream" }, - .{ .@"dll", all.@"application/x-msdownload" }, - .{ .@"dmg", all.@"application/octet-stream" }, - .{ .@"dmg", all.@"application/x-apple-diskimage" }, - .{ .@"dmp", all.@"application/vnd.tcpdump.pcap" }, - .{ .@"dms", all.@"application/octet-stream" }, - .{ .@"dna", all.@"application/vnd.dna" }, - .{ .@"doc", all.@"application/msword" }, - .{ .@"docm", all.@"application/vnd.ms-word.document.macroenabled.12" }, - .{ .@"docx", all.@"application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, - .{ .@"dot", all.@"application/msword" }, - .{ .@"dotm", all.@"application/vnd.ms-word.template.macroenabled.12" }, - .{ .@"dotx", all.@"application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, - .{ .@"dp", all.@"application/vnd.osgi.dp" }, - .{ .@"dpg", all.@"application/vnd.dpgraph" }, - .{ .@"dra", all.@"audio/vnd.dra" }, - .{ .@"drle", all.@"image/dicom-rle" }, - .{ .@"dsc", all.@"text/prs.lines.tag" }, - .{ .@"dssc", all.@"application/dssc+der" }, - .{ .@"dtb", all.@"application/x-dtbook+xml" }, - .{ .@"dtd", all.@"application/xml-dtd" }, - .{ .@"dts", all.@"audio/vnd.dts" }, - .{ .@"dtshd", all.@"audio/vnd.dts.hd" }, - .{ .@"dump", all.@"application/octet-stream" }, - .{ .@"dvb", all.@"video/vnd.dvb.file" }, - .{ .@"dvi", all.@"application/x-dvi" }, - .{ .@"dwd", all.@"application/atsc-dwd+xml" }, - .{ .@"dwf", all.@"model/vnd.dwf" }, - .{ .@"dwg", all.@"image/vnd.dwg" }, - .{ .@"dxf", all.@"image/vnd.dxf" }, - .{ .@"dxp", all.@"application/vnd.spotfire.dxp" }, - .{ .@"dxr", all.@"application/x-director" }, - .{ .@"ear", all.@"application/java-archive" }, - .{ .@"ecelp4800", all.@"audio/vnd.nuera.ecelp4800" }, - .{ .@"ecelp7470", all.@"audio/vnd.nuera.ecelp7470" }, - .{ .@"ecelp9600", all.@"audio/vnd.nuera.ecelp9600" }, - .{ .@"ecma", all.@"application/ecmascript" }, - .{ .@"edm", all.@"application/vnd.novadigm.edm" }, - .{ .@"edx", all.@"application/vnd.novadigm.edx" }, - .{ .@"efif", all.@"application/vnd.picsel" }, - .{ .@"ei6", all.@"application/vnd.pg.osasli" }, - .{ .@"elc", all.@"application/octet-stream" }, - .{ .@"emf", all.@"application/x-msmetafile" }, - .{ .@"emf", all.@"image/emf" }, - .{ .@"eml", all.@"message/rfc822" }, - .{ .@"emma", all.@"application/emma+xml" }, - .{ .@"emotionml", all.@"application/emotionml+xml" }, - .{ .@"emz", all.@"application/x-msmetafile" }, - .{ .@"eol", all.@"audio/vnd.digital-winds" }, - .{ .@"eot", all.@"application/vnd.ms-fontobject" }, - .{ .@"eps", all.@"application/postscript" }, - .{ .@"epub", all.@"application/epub+zip" }, - .{ .@"es", all.@"application/ecmascript" }, - .{ .@"es3", all.@"application/vnd.eszigno3+xml" }, - .{ .@"esa", all.@"application/vnd.osgi.subsystem" }, - .{ .@"esf", all.@"application/vnd.epson.esf" }, - .{ .@"et3", all.@"application/vnd.eszigno3+xml" }, - .{ .@"etx", all.@"text/x-setext" }, - .{ .@"eva", all.@"application/x-eva" }, - .{ .@"evy", all.@"application/x-envoy" }, - .{ .@"exe", all.@"application/octet-stream" }, - .{ .@"exe", all.@"application/x-msdos-program" }, - .{ .@"exe", all.@"application/x-msdownload" }, - .{ .@"exi", all.@"application/exi" }, - .{ .@"exp", all.@"application/express" }, - .{ .@"exr", all.@"image/aces" }, - .{ .@"ext", all.@"application/vnd.novadigm.ext" }, - .{ .@"ez", all.@"application/andrew-inset" }, - .{ .@"ez2", all.@"application/vnd.ezpix-album" }, - .{ .@"ez3", all.@"application/vnd.ezpix-package" }, - .{ .@"f", all.@"text/x-fortran" }, - .{ .@"f4v", all.@"video/x-f4v" }, - .{ .@"f77", all.@"text/x-fortran" }, - .{ .@"f90", all.@"text/x-fortran" }, - .{ .@"fbs", all.@"image/vnd.fastbidsheet" }, - .{ .@"fcdt", all.@"application/vnd.adobe.formscentral.fcdt" }, - .{ .@"fcs", all.@"application/vnd.isac.fcs" }, - .{ .@"fdf", all.@"application/vnd.fdf" }, - .{ .@"fdt", all.@"application/fdt+xml" }, - .{ .@"fe_launch", all.@"application/vnd.denovo.fcselayout-link" }, - .{ .@"fg5", all.@"application/vnd.fujitsu.oasysgp" }, - .{ .@"fgd", all.@"application/x-director" }, - .{ .@"fh", all.@"image/x-freehand" }, - .{ .@"fh4", all.@"image/x-freehand" }, - .{ .@"fh5", all.@"image/x-freehand" }, - .{ .@"fh7", all.@"image/x-freehand" }, - .{ .@"fhc", all.@"image/x-freehand" }, - .{ .@"fig", all.@"application/x-xfig" }, - .{ .@"fits", all.@"image/fits" }, - .{ .@"flac", all.@"audio/x-flac" }, - .{ .@"fli", all.@"video/x-fli" }, - .{ .@"flo", all.@"application/vnd.micrografx.flo" }, - .{ .@"flv", all.@"video/x-flv" }, - .{ .@"flw", all.@"application/vnd.kde.kivio" }, - .{ .@"flx", all.@"text/vnd.fmi.flexstor" }, - .{ .@"fly", all.@"text/vnd.fly" }, - .{ .@"fm", all.@"application/vnd.framemaker" }, - .{ .@"fnc", all.@"application/vnd.frogans.fnc" }, - .{ .@"fo", all.@"application/vnd.software602.filler.form+xml" }, - .{ .@"for", all.@"text/x-fortran" }, - .{ .@"fpx", all.@"image/vnd.fpx" }, - .{ .@"frame", all.@"application/vnd.framemaker" }, - .{ .@"fsc", all.@"application/vnd.fsc.weblaunch" }, - .{ .@"fst", all.@"image/vnd.fst" }, - .{ .@"ftc", all.@"application/vnd.fluxtime.clip" }, - .{ .@"fti", all.@"application/vnd.anser-web-funds-transfer-initiation" }, - .{ .@"fvt", all.@"video/vnd.fvt" }, - .{ .@"fxp", all.@"application/vnd.adobe.fxp" }, - .{ .@"fxpl", all.@"application/vnd.adobe.fxp" }, - .{ .@"fzs", all.@"application/vnd.fuzzysheet" }, - .{ .@"g2w", all.@"application/vnd.geoplan" }, - .{ .@"g3", all.@"image/g3fax" }, - .{ .@"g3w", all.@"application/vnd.geospace" }, - .{ .@"gac", all.@"application/vnd.groove-account" }, - .{ .@"gam", all.@"application/x-tads" }, - .{ .@"gbr", all.@"application/rpki-ghostbusters" }, - .{ .@"gca", all.@"application/x-gca-compressed" }, - .{ .@"gdl", all.@"model/vnd.gdl" }, - .{ .@"gdoc", all.@"application/vnd.google-apps.document" }, - .{ .@"ged", all.@"text/vnd.familysearch.gedcom" }, - .{ .@"geo", all.@"application/vnd.dynageo" }, - .{ .@"geojson", all.@"application/geo+json" }, - .{ .@"gex", all.@"application/vnd.geometry-explorer" }, - .{ .@"ggb", all.@"application/vnd.geogebra.file" }, - .{ .@"ggt", all.@"application/vnd.geogebra.tool" }, - .{ .@"ghf", all.@"application/vnd.groove-help" }, - .{ .@"gif", all.@"image/gif" }, - .{ .@"gim", all.@"application/vnd.groove-identity-message" }, - .{ .@"glb", all.@"model/gltf-binary" }, - .{ .@"gltf", all.@"model/gltf+json" }, - .{ .@"gml", all.@"application/gml+xml" }, - .{ .@"gmx", all.@"application/vnd.gmx" }, - .{ .@"gnumeric", all.@"application/x-gnumeric" }, - .{ .@"gph", all.@"application/vnd.flographit" }, - .{ .@"gpx", all.@"application/gpx+xml" }, - .{ .@"gqf", all.@"application/vnd.grafeq" }, - .{ .@"gqs", all.@"application/vnd.grafeq" }, - .{ .@"gram", all.@"application/srgs" }, - .{ .@"gramps", all.@"application/x-gramps-xml" }, - .{ .@"gre", all.@"application/vnd.geometry-explorer" }, - .{ .@"grv", all.@"application/vnd.groove-injector" }, - .{ .@"grxml", all.@"application/srgs+xml" }, - .{ .@"gsf", all.@"application/x-font-ghostscript" }, - .{ .@"gsheet", all.@"application/vnd.google-apps.spreadsheet" }, - .{ .@"gslides", all.@"application/vnd.google-apps.presentation" }, - .{ .@"gtar", all.@"application/x-gtar" }, - .{ .@"gtm", all.@"application/vnd.groove-tool-message" }, - .{ .@"gtw", all.@"model/vnd.gtw" }, - .{ .@"gv", all.@"text/vnd.graphviz" }, - .{ .@"gxf", all.@"application/gxf" }, - .{ .@"gxt", all.@"application/vnd.geonext" }, - .{ .@"gz", all.@"application/gzip" }, - .{ .@"h", all.@"text/x-c" }, - .{ .@"h261", all.@"video/h261" }, - .{ .@"h263", all.@"video/h263" }, - .{ .@"h264", all.@"video/h264" }, - .{ .@"hal", all.@"application/vnd.hal+xml" }, - .{ .@"hbci", all.@"application/vnd.hbci" }, - .{ .@"hbs", all.@"text/x-handlebars-template" }, - .{ .@"hdd", all.@"application/x-virtualbox-hdd" }, - .{ .@"hdf", all.@"application/x-hdf" }, - .{ .@"heic", all.@"image/heic" }, - .{ .@"heics", all.@"image/heic-sequence" }, - .{ .@"heif", all.@"image/heif" }, - .{ .@"heifs", all.@"image/heif-sequence" }, - .{ .@"hej2", all.@"image/hej2k" }, - .{ .@"held", all.@"application/atsc-held+xml" }, - .{ .@"hh", all.@"text/x-c" }, - .{ .@"hjson", all.@"application/hjson" }, - .{ .@"hlp", all.@"application/winhlp" }, - .{ .@"hpgl", all.@"application/vnd.hp-hpgl" }, - .{ .@"hpid", all.@"application/vnd.hp-hpid" }, - .{ .@"hps", all.@"application/vnd.hp-hps" }, - .{ .@"hqx", all.@"application/mac-binhex40" }, - .{ .@"hsj2", all.@"image/hsj2" }, - .{ .@"htc", all.@"text/x-component" }, - .{ .@"htke", all.@"application/vnd.kenameaapp" }, - .{ .@"htm", all.@"text/html" }, - .{ .@"html", all.@"text/html" }, - .{ .@"hvd", all.@"application/vnd.yamaha.hv-dic" }, - .{ .@"hvp", all.@"application/vnd.yamaha.hv-voice" }, - .{ .@"hvs", all.@"application/vnd.yamaha.hv-script" }, - .{ .@"i2g", all.@"application/vnd.intergeo" }, - .{ .@"icc", all.@"application/vnd.iccprofile" }, - .{ .@"ice", all.@"x-conference/x-cooltalk" }, - .{ .@"icm", all.@"application/vnd.iccprofile" }, - .{ .@"ico", all.@"image/vnd.microsoft.icon" }, - .{ .@"ico", all.@"image/x-icon" }, - .{ .@"ics", all.@"text/calendar" }, - .{ .@"ief", all.@"image/ief" }, - .{ .@"ifb", all.@"text/calendar" }, - .{ .@"ifm", all.@"application/vnd.shana.informed.formdata" }, - .{ .@"iges", all.@"model/iges" }, - .{ .@"igl", all.@"application/vnd.igloader" }, - .{ .@"igm", all.@"application/vnd.insors.igm" }, - .{ .@"igs", all.@"model/iges" }, - .{ .@"igx", all.@"application/vnd.micrografx.igx" }, - .{ .@"iif", all.@"application/vnd.shana.informed.interchange" }, - .{ .@"img", all.@"application/octet-stream" }, - .{ .@"imp", all.@"application/vnd.accpac.simply.imp" }, - .{ .@"ims", all.@"application/vnd.ms-ims" }, - .{ .@"in", all.@"text/plain" }, - .{ .@"ini", all.@"text/plain" }, - .{ .@"ink", all.@"application/inkml+xml" }, - .{ .@"inkml", all.@"application/inkml+xml" }, - .{ .@"install", all.@"application/x-install-instructions" }, - .{ .@"iota", all.@"application/vnd.astraea-software.iota" }, - .{ .@"ipfix", all.@"application/ipfix" }, - .{ .@"ipk", all.@"application/vnd.shana.informed.package" }, - .{ .@"irm", all.@"application/vnd.ibm.rights-management" }, - .{ .@"irp", all.@"application/vnd.irepository.package+xml" }, - .{ .@"iso", all.@"application/octet-stream" }, - .{ .@"iso", all.@"application/x-iso9660-image" }, - .{ .@"itp", all.@"application/vnd.shana.informed.formtemplate" }, - .{ .@"its", all.@"application/its+xml" }, - .{ .@"ivp", all.@"application/vnd.immervision-ivp" }, - .{ .@"ivu", all.@"application/vnd.immervision-ivu" }, - .{ .@"jad", all.@"text/vnd.sun.j2me.app-descriptor" }, - .{ .@"jade", all.@"text/jade" }, - .{ .@"jam", all.@"application/vnd.jam" }, - .{ .@"jar", all.@"application/java-archive" }, - .{ .@"jardiff", all.@"application/x-java-archive-diff" }, - .{ .@"java", all.@"text/x-java-source" }, - .{ .@"jhc", all.@"image/jphc" }, - .{ .@"jisp", all.@"application/vnd.jisp" }, - .{ .@"jls", all.@"image/jls" }, - .{ .@"jlt", all.@"application/vnd.hp-jlyt" }, - .{ .@"jng", all.@"image/x-jng" }, - .{ .@"jnlp", all.@"application/x-java-jnlp-file" }, - .{ .@"joda", all.@"application/vnd.joost.joda-archive" }, - .{ .@"jp2", all.@"image/jp2" }, - .{ .@"jpe", all.@"image/jpeg" }, - .{ .@"jpeg", all.@"image/jpeg" }, - .{ .@"jpf", all.@"image/jpx" }, - .{ .@"jpg", all.@"image/jpeg" }, - .{ .@"jpg2", all.@"image/jp2" }, - .{ .@"jpgm", all.@"video/jpm" }, - .{ .@"jpgv", all.@"video/jpeg" }, - .{ .@"jph", all.@"image/jph" }, - .{ .@"jpm", all.@"image/jpm" }, - .{ .@"jpm", all.@"video/jpm" }, - .{ .@"jpx", all.@"image/jpx" }, - .{ .@"js", all.@"application/javascript" }, - .{ .@"json", all.@"application/json" }, - .{ .@"json5", all.@"application/json5" }, - .{ .@"jsonld", all.@"application/ld+json" }, - .{ .@"jsonml", all.@"application/jsonml+json" }, - .{ .@"jsx", all.@"text/jsx" }, - .{ .@"jxr", all.@"image/jxr" }, - .{ .@"jxra", all.@"image/jxra" }, - .{ .@"jxrs", all.@"image/jxrs" }, - .{ .@"jxs", all.@"image/jxs" }, - .{ .@"jxsc", all.@"image/jxsc" }, - .{ .@"jxsi", all.@"image/jxsi" }, - .{ .@"jxss", all.@"image/jxss" }, - .{ .@"kar", all.@"audio/midi" }, - .{ .@"karbon", all.@"application/vnd.kde.karbon" }, - .{ .@"kdbx", all.@"application/x-keepass2" }, - .{ .@"key", all.@"application/vnd.apple.keynote" }, - .{ .@"key", all.@"application/x-iwork-keynote-sffkey" }, - .{ .@"kfo", all.@"application/vnd.kde.kformula" }, - .{ .@"kia", all.@"application/vnd.kidspiration" }, - .{ .@"kml", all.@"application/vnd.google-earth.kml+xml" }, - .{ .@"kmz", all.@"application/vnd.google-earth.kmz" }, - .{ .@"kne", all.@"application/vnd.kinar" }, - .{ .@"knp", all.@"application/vnd.kinar" }, - .{ .@"kon", all.@"application/vnd.kde.kontour" }, - .{ .@"kpr", all.@"application/vnd.kde.kpresenter" }, - .{ .@"kpt", all.@"application/vnd.kde.kpresenter" }, - .{ .@"kpxx", all.@"application/vnd.ds-keypoint" }, - .{ .@"ksp", all.@"application/vnd.kde.kspread" }, - .{ .@"ktr", all.@"application/vnd.kahootz" }, - .{ .@"ktx", all.@"image/ktx" }, - .{ .@"ktx2", all.@"image/ktx2" }, - .{ .@"ktz", all.@"application/vnd.kahootz" }, - .{ .@"kwd", all.@"application/vnd.kde.kword" }, - .{ .@"kwt", all.@"application/vnd.kde.kword" }, - .{ .@"lasxml", all.@"application/vnd.las.las+xml" }, - .{ .@"latex", all.@"application/x-latex" }, - .{ .@"lbd", all.@"application/vnd.llamagraphics.life-balance.desktop" }, - .{ .@"lbe", all.@"application/vnd.llamagraphics.life-balance.exchange+xml" }, - .{ .@"les", all.@"application/vnd.hhe.lesson-player" }, - .{ .@"less", all.@"text/less" }, - .{ .@"lgr", all.@"application/lgr+xml" }, - .{ .@"lha", all.@"application/x-lzh-compressed" }, - .{ .@"link66", all.@"application/vnd.route66.link66+xml" }, - .{ .@"list", all.@"text/plain" }, - .{ .@"list3820", all.@"application/vnd.ibm.modcap" }, - .{ .@"listafp", all.@"application/vnd.ibm.modcap" }, - .{ .@"litcoffee", all.@"text/coffeescript" }, - .{ .@"lnk", all.@"application/x-ms-shortcut" }, - .{ .@"log", all.@"text/plain" }, - .{ .@"lostxml", all.@"application/lost+xml" }, - .{ .@"lrf", all.@"application/octet-stream" }, - .{ .@"lrm", all.@"application/vnd.ms-lrm" }, - .{ .@"ltf", all.@"application/vnd.frogans.ltf" }, - .{ .@"lua", all.@"text/x-lua" }, - .{ .@"luac", all.@"application/x-lua-bytecode" }, - .{ .@"lvp", all.@"audio/vnd.lucent.voice" }, - .{ .@"lwp", all.@"application/vnd.lotus-wordpro" }, - .{ .@"lzh", all.@"application/x-lzh-compressed" }, - .{ .@"m13", all.@"application/x-msmediaview" }, - .{ .@"m14", all.@"application/x-msmediaview" }, - .{ .@"m1v", all.@"video/mpeg" }, - .{ .@"m21", all.@"application/mp21" }, - .{ .@"m2a", all.@"audio/mpeg" }, - .{ .@"m2v", all.@"video/mpeg" }, - .{ .@"m3a", all.@"audio/mpeg" }, - .{ .@"m3u", all.@"audio/x-mpegurl" }, - .{ .@"m3u8", all.@"application/vnd.apple.mpegurl" }, - .{ .@"m4a", all.@"audio/mp4" }, - .{ .@"m4a", all.@"audio/x-m4a" }, - .{ .@"m4p", all.@"application/mp4" }, - .{ .@"m4s", all.@"video/iso.segment" }, - .{ .@"m4u", all.@"video/vnd.mpegurl" }, - .{ .@"m4v", all.@"video/x-m4v" }, - .{ .@"ma", all.@"application/mathematica" }, - .{ .@"mads", all.@"application/mads+xml" }, - .{ .@"maei", all.@"application/mmt-aei+xml" }, - .{ .@"mag", all.@"application/vnd.ecowin.chart" }, - .{ .@"maker", all.@"application/vnd.framemaker" }, - .{ .@"man", all.@"text/troff" }, - .{ .@"manifest", all.@"text/cache-manifest" }, - .{ .@"map", all.@"application/json" }, - .{ .@"mar", all.@"application/octet-stream" }, - .{ .@"markdown", all.@"text/markdown" }, - .{ .@"mathml", all.@"application/mathml+xml" }, - .{ .@"mb", all.@"application/mathematica" }, - .{ .@"mbk", all.@"application/vnd.mobius.mbk" }, - .{ .@"mbox", all.@"application/mbox" }, - .{ .@"mc1", all.@"application/vnd.medcalcdata" }, - .{ .@"mcd", all.@"application/vnd.mcd" }, - .{ .@"mcurl", all.@"text/vnd.curl.mcurl" }, - .{ .@"md", all.@"text/markdown" }, - .{ .@"mdb", all.@"application/x-msaccess" }, - .{ .@"mdi", all.@"image/vnd.ms-modi" }, - .{ .@"mdx", all.@"text/mdx" }, - .{ .@"me", all.@"text/troff" }, - .{ .@"mesh", all.@"model/mesh" }, - .{ .@"meta4", all.@"application/metalink4+xml" }, - .{ .@"metalink", all.@"application/metalink+xml" }, - .{ .@"mets", all.@"application/mets+xml" }, - .{ .@"mfm", all.@"application/vnd.mfmp" }, - .{ .@"mft", all.@"application/rpki-manifest" }, - .{ .@"mgp", all.@"application/vnd.osgeo.mapguide.package" }, - .{ .@"mgz", all.@"application/vnd.proteus.magazine" }, - .{ .@"mid", all.@"audio/midi" }, - .{ .@"midi", all.@"audio/midi" }, - .{ .@"mie", all.@"application/x-mie" }, - .{ .@"mif", all.@"application/vnd.mif" }, - .{ .@"mime", all.@"message/rfc822" }, - .{ .@"mj2", all.@"video/mj2" }, - .{ .@"mjp2", all.@"video/mj2" }, - .{ .@"mjs", all.@"application/javascript" }, - .{ .@"mk3d", all.@"video/x-matroska" }, - .{ .@"mka", all.@"audio/x-matroska" }, - .{ .@"mkd", all.@"text/x-markdown" }, - .{ .@"mks", all.@"video/x-matroska" }, - .{ .@"mkv", all.@"video/x-matroska" }, - .{ .@"mlp", all.@"application/vnd.dolby.mlp" }, - .{ .@"mmd", all.@"application/vnd.chipnuts.karaoke-mmd" }, - .{ .@"mmf", all.@"application/vnd.smaf" }, - .{ .@"mml", all.@"text/mathml" }, - .{ .@"mmr", all.@"image/vnd.fujixerox.edmics-mmr" }, - .{ .@"mng", all.@"video/x-mng" }, - .{ .@"mny", all.@"application/x-msmoney" }, - .{ .@"mobi", all.@"application/x-mobipocket-ebook" }, - .{ .@"mods", all.@"application/mods+xml" }, - .{ .@"mov", all.@"video/quicktime" }, - .{ .@"movie", all.@"video/x-sgi-movie" }, - .{ .@"mp2", all.@"audio/mpeg" }, - .{ .@"mp21", all.@"application/mp21" }, - .{ .@"mp2a", all.@"audio/mpeg" }, - .{ .@"mp3", all.@"audio/mp3" }, - .{ .@"mp3", all.@"audio/mpeg" }, - .{ .@"mp4", all.@"video/mp4" }, - .{ .@"mp4a", all.@"audio/mp4" }, - .{ .@"mp4s", all.@"application/mp4" }, - .{ .@"mp4v", all.@"video/mp4" }, - .{ .@"mpc", all.@"application/vnd.mophun.certificate" }, - .{ .@"mpd", all.@"application/dash+xml" }, - .{ .@"mpe", all.@"video/mpeg" }, - .{ .@"mpeg", all.@"video/mpeg" }, - .{ .@"mpf", all.@"application/media-policy-dataset+xml" }, - .{ .@"mpg", all.@"video/mpeg" }, - .{ .@"mpg4", all.@"video/mp4" }, - .{ .@"mpga", all.@"audio/mpeg" }, - .{ .@"mpkg", all.@"application/vnd.apple.installer+xml" }, - .{ .@"mpm", all.@"application/vnd.blueice.multipass" }, - .{ .@"mpn", all.@"application/vnd.mophun.application" }, - .{ .@"mpp", all.@"application/dash-patch+xml" }, - .{ .@"mpp", all.@"application/vnd.ms-project" }, - .{ .@"mpt", all.@"application/vnd.ms-project" }, - .{ .@"mpy", all.@"application/vnd.ibm.minipay" }, - .{ .@"mqy", all.@"application/vnd.mobius.mqy" }, - .{ .@"mrc", all.@"application/marc" }, - .{ .@"mrcx", all.@"application/marcxml+xml" }, - .{ .@"ms", all.@"text/troff" }, - .{ .@"mscml", all.@"application/mediaservercontrol+xml" }, - .{ .@"mseed", all.@"application/vnd.fdsn.mseed" }, - .{ .@"mseq", all.@"application/vnd.mseq" }, - .{ .@"msf", all.@"application/vnd.epson.msf" }, - .{ .@"msg", all.@"application/vnd.ms-outlook" }, - .{ .@"msh", all.@"model/mesh" }, - .{ .@"msi", all.@"application/octet-stream" }, - .{ .@"msi", all.@"application/x-msdownload" }, - .{ .@"msl", all.@"application/vnd.mobius.msl" }, - .{ .@"msm", all.@"application/octet-stream" }, - .{ .@"msp", all.@"application/octet-stream" }, - .{ .@"msty", all.@"application/vnd.muvee.style" }, - .{ .@"mtl", all.@"model/mtl" }, - .{ .@"mts", all.@"application/javascript" }, - .{ .@"mts", all.@"model/vnd.mts" }, - .{ .@"mtsx", all.@"application/javascript" }, - .{ .@"mus", all.@"application/vnd.musician" }, - .{ .@"musd", all.@"application/mmt-usd+xml" }, - .{ .@"musicxml", all.@"application/vnd.recordare.musicxml+xml" }, - .{ .@"mvb", all.@"application/x-msmediaview" }, - .{ .@"mvt", all.@"application/vnd.mapbox-vector-tile" }, - .{ .@"mwf", all.@"application/vnd.mfer" }, - .{ .@"mxf", all.@"application/mxf" }, - .{ .@"mxl", all.@"application/vnd.recordare.musicxml" }, - .{ .@"mxmf", all.@"audio/mobile-xmf" }, - .{ .@"mxml", all.@"application/xv+xml" }, - .{ .@"mxs", all.@"application/vnd.triscape.mxs" }, - .{ .@"mxu", all.@"video/vnd.mpegurl" }, - .{ .@"n-gage", all.@"application/vnd.nokia.n-gage.symbian.install" }, - .{ .@"n3", all.@"text/n3" }, - .{ .@"nb", all.@"application/mathematica" }, - .{ .@"nbp", all.@"application/vnd.wolfram.player" }, - .{ .@"nc", all.@"application/x-netcdf" }, - .{ .@"ncx", all.@"application/x-dtbncx+xml" }, - .{ .@"nfo", all.@"text/x-nfo" }, - .{ .@"ngdat", all.@"application/vnd.nokia.n-gage.data" }, - .{ .@"nitf", all.@"application/vnd.nitf" }, - .{ .@"nlu", all.@"application/vnd.neurolanguage.nlu" }, - .{ .@"nml", all.@"application/vnd.enliven" }, - .{ .@"nnd", all.@"application/vnd.noblenet-directory" }, - .{ .@"nns", all.@"application/vnd.noblenet-sealer" }, - .{ .@"nnw", all.@"application/vnd.noblenet-web" }, - .{ .@"npx", all.@"image/vnd.net-fpx" }, - .{ .@"nq", all.@"application/n-quads" }, - .{ .@"nsc", all.@"application/x-conference" }, - .{ .@"nsf", all.@"application/vnd.lotus-notes" }, - .{ .@"nt", all.@"application/n-triples" }, - .{ .@"ntf", all.@"application/vnd.nitf" }, - .{ .@"numbers", all.@"application/vnd.apple.numbers" }, - .{ .@"numbers", all.@"application/x-iwork-numbers-sffnumbers" }, - .{ .@"nzb", all.@"application/x-nzb" }, - .{ .@"oa2", all.@"application/vnd.fujitsu.oasys2" }, - .{ .@"oa3", all.@"application/vnd.fujitsu.oasys3" }, - .{ .@"oas", all.@"application/vnd.fujitsu.oasys" }, - .{ .@"obd", all.@"application/x-msbinder" }, - .{ .@"obgx", all.@"application/vnd.openblox.game+xml" }, - .{ .@"obj", all.@"application/x-tgif" }, - .{ .@"obj", all.@"model/obj" }, - .{ .@"oda", all.@"application/oda" }, - .{ .@"odb", all.@"application/vnd.oasis.opendocument.database" }, - .{ .@"odc", all.@"application/vnd.oasis.opendocument.chart" }, - .{ .@"odf", all.@"application/vnd.oasis.opendocument.formula" }, - .{ .@"odft", all.@"application/vnd.oasis.opendocument.formula-template" }, - .{ .@"odg", all.@"application/vnd.oasis.opendocument.graphics" }, - .{ .@"odi", all.@"application/vnd.oasis.opendocument.image" }, - .{ .@"odm", all.@"application/vnd.oasis.opendocument.text-master" }, - .{ .@"odp", all.@"application/vnd.oasis.opendocument.presentation" }, - .{ .@"ods", all.@"application/vnd.oasis.opendocument.spreadsheet" }, - .{ .@"odt", all.@"application/vnd.oasis.opendocument.text" }, - .{ .@"oga", all.@"audio/ogg" }, - .{ .@"ogex", all.@"model/vnd.opengex" }, - .{ .@"ogg", all.@"audio/ogg" }, - .{ .@"ogv", all.@"video/ogg" }, - .{ .@"ogx", all.@"application/ogg" }, - .{ .@"omdoc", all.@"application/omdoc+xml" }, - .{ .@"onepkg", all.@"application/onenote" }, - .{ .@"onetmp", all.@"application/onenote" }, - .{ .@"onetoc", all.@"application/onenote" }, - .{ .@"onetoc2", all.@"application/onenote" }, - .{ .@"opf", all.@"application/oebps-package+xml" }, - .{ .@"opml", all.@"text/x-opml" }, - .{ .@"oprc", all.@"application/vnd.palm" }, - .{ .@"opus", all.@"audio/ogg" }, - .{ .@"org", all.@"application/vnd.lotus-organizer" }, - .{ .@"org", all.@"text/x-org" }, - .{ .@"osf", all.@"application/vnd.yamaha.openscoreformat" }, - .{ .@"osfpvg", all.@"application/vnd.yamaha.openscoreformat.osfpvg+xml" }, - .{ .@"osm", all.@"application/vnd.openstreetmap.data+xml" }, - .{ .@"otc", all.@"application/vnd.oasis.opendocument.chart-template" }, - .{ .@"otf", all.@"font/otf" }, - .{ .@"otg", all.@"application/vnd.oasis.opendocument.graphics-template" }, - .{ .@"oth", all.@"application/vnd.oasis.opendocument.text-web" }, - .{ .@"oti", all.@"application/vnd.oasis.opendocument.image-template" }, - .{ .@"otp", all.@"application/vnd.oasis.opendocument.presentation-template" }, - .{ .@"ots", all.@"application/vnd.oasis.opendocument.spreadsheet-template" }, - .{ .@"ott", all.@"application/vnd.oasis.opendocument.text-template" }, - .{ .@"ova", all.@"application/x-virtualbox-ova" }, - .{ .@"ovf", all.@"application/x-virtualbox-ovf" }, - .{ .@"owl", all.@"application/rdf+xml" }, - .{ .@"oxps", all.@"application/oxps" }, - .{ .@"oxt", all.@"application/vnd.openofficeorg.extension" }, - .{ .@"p", all.@"text/x-pascal" }, - .{ .@"p10", all.@"application/pkcs10" }, - .{ .@"p12", all.@"application/x-pkcs12" }, - .{ .@"p7b", all.@"application/x-pkcs7-certificates" }, - .{ .@"p7c", all.@"application/pkcs7-mime" }, - .{ .@"p7m", all.@"application/pkcs7-mime" }, - .{ .@"p7r", all.@"application/x-pkcs7-certreqresp" }, - .{ .@"p7s", all.@"application/pkcs7-signature" }, - .{ .@"p8", all.@"application/pkcs8" }, - .{ .@"pac", all.@"application/x-ns-proxy-autoconfig" }, - .{ .@"pages", all.@"application/vnd.apple.pages" }, - .{ .@"pages", all.@"application/x-iwork-pages-sffpages" }, - .{ .@"pas", all.@"text/x-pascal" }, - .{ .@"paw", all.@"application/vnd.pawaafile" }, - .{ .@"pbd", all.@"application/vnd.powerbuilder6" }, - .{ .@"pbm", all.@"image/x-portable-bitmap" }, - .{ .@"pcap", all.@"application/vnd.tcpdump.pcap" }, - .{ .@"pcf", all.@"application/x-font-pcf" }, - .{ .@"pcl", all.@"application/vnd.hp-pcl" }, - .{ .@"pclxl", all.@"application/vnd.hp-pclxl" }, - .{ .@"pct", all.@"image/x-pict" }, - .{ .@"pcurl", all.@"application/vnd.curl.pcurl" }, - .{ .@"pcx", all.@"image/vnd.zbrush.pcx" }, - .{ .@"pcx", all.@"image/x-pcx" }, - .{ .@"pdb", all.@"application/vnd.palm" }, - .{ .@"pdb", all.@"application/x-pilot" }, - .{ .@"pde", all.@"text/x-processing" }, - .{ .@"pdf", all.@"application/pdf" }, - .{ .@"pem", all.@"application/x-x509-ca-cert" }, - .{ .@"pfa", all.@"application/x-font-type1" }, - .{ .@"pfb", all.@"application/x-font-type1" }, - .{ .@"pfm", all.@"application/x-font-type1" }, - .{ .@"pfr", all.@"application/font-tdpfr" }, - .{ .@"pfx", all.@"application/x-pkcs12" }, - .{ .@"pgm", all.@"image/x-portable-graymap" }, - .{ .@"pgn", all.@"application/x-chess-pgn" }, - .{ .@"pgp", all.@"application/pgp-encrypted" }, - .{ .@"php", all.@"application/x-httpd-php" }, - .{ .@"pic", all.@"image/x-pict" }, - .{ .@"pkg", all.@"application/octet-stream" }, - .{ .@"pki", all.@"application/pkixcmp" }, - .{ .@"pkipath", all.@"application/pkix-pkipath" }, - .{ .@"pkpass", all.@"application/vnd.apple.pkpass" }, - .{ .@"pl", all.@"application/x-perl" }, - .{ .@"plb", all.@"application/vnd.3gpp.pic-bw-large" }, - .{ .@"plc", all.@"application/vnd.mobius.plc" }, - .{ .@"plf", all.@"application/vnd.pocketlearn" }, - .{ .@"pls", all.@"application/pls+xml" }, - .{ .@"pm", all.@"application/x-perl" }, - .{ .@"pml", all.@"application/vnd.ctc-posml" }, - .{ .@"png", all.@"image/png" }, - .{ .@"pnm", all.@"image/x-portable-anymap" }, - .{ .@"portpkg", all.@"application/vnd.macports.portpkg" }, - .{ .@"pot", all.@"application/vnd.ms-powerpoint" }, - .{ .@"potm", all.@"application/vnd.ms-powerpoint.template.macroenabled.12" }, - .{ .@"potx", all.@"application/vnd.openxmlformats-officedocument.presentationml.template" }, - .{ .@"ppam", all.@"application/vnd.ms-powerpoint.addin.macroenabled.12" }, - .{ .@"ppd", all.@"application/vnd.cups-ppd" }, - .{ .@"ppm", all.@"image/x-portable-pixmap" }, - .{ .@"pps", all.@"application/vnd.ms-powerpoint" }, - .{ .@"ppsm", all.@"application/vnd.ms-powerpoint.slideshow.macroenabled.12" }, - .{ .@"ppsx", all.@"application/vnd.openxmlformats-officedocument.presentationml.slideshow" }, - .{ .@"ppt", all.@"application/vnd.ms-powerpoint" }, - .{ .@"pptm", all.@"application/vnd.ms-powerpoint.presentation.macroenabled.12" }, - .{ .@"pptx", all.@"application/vnd.openxmlformats-officedocument.presentationml.presentation" }, - .{ .@"pqa", all.@"application/vnd.palm" }, - .{ .@"prc", all.@"application/x-mobipocket-ebook" }, - .{ .@"prc", all.@"application/x-pilot" }, - .{ .@"prc", all.@"model/prc" }, - .{ .@"pre", all.@"application/vnd.lotus-freelance" }, - .{ .@"prf", all.@"application/pics-rules" }, - .{ .@"provx", all.@"application/provenance+xml" }, - .{ .@"ps", all.@"application/postscript" }, - .{ .@"psb", all.@"application/vnd.3gpp.pic-bw-small" }, - .{ .@"psd", all.@"image/vnd.adobe.photoshop" }, - .{ .@"psf", all.@"application/x-font-linux-psf" }, - .{ .@"pskcxml", all.@"application/pskc+xml" }, - .{ .@"pti", all.@"image/prs.pti" }, - .{ .@"ptid", all.@"application/vnd.pvi.ptid1" }, - .{ .@"pub", all.@"application/x-mspublisher" }, - .{ .@"pvb", all.@"application/vnd.3gpp.pic-bw-var" }, - .{ .@"pwn", all.@"application/vnd.3m.post-it-notes" }, - .{ .@"pya", all.@"audio/vnd.ms-playready.media.pya" }, - .{ .@"pyv", all.@"video/vnd.ms-playready.media.pyv" }, - .{ .@"qam", all.@"application/vnd.epson.quickanime" }, - .{ .@"qbo", all.@"application/vnd.intu.qbo" }, - .{ .@"qfx", all.@"application/vnd.intu.qfx" }, - .{ .@"qps", all.@"application/vnd.publishare-delta-tree" }, - .{ .@"qt", all.@"video/quicktime" }, - .{ .@"qwd", all.@"application/vnd.quark.quarkxpress" }, - .{ .@"qwt", all.@"application/vnd.quark.quarkxpress" }, - .{ .@"qxb", all.@"application/vnd.quark.quarkxpress" }, - .{ .@"qxd", all.@"application/vnd.quark.quarkxpress" }, - .{ .@"qxl", all.@"application/vnd.quark.quarkxpress" }, - .{ .@"qxt", all.@"application/vnd.quark.quarkxpress" }, - .{ .@"ra", all.@"audio/x-pn-realaudio" }, - .{ .@"ra", all.@"audio/x-realaudio" }, - .{ .@"ram", all.@"audio/x-pn-realaudio" }, - .{ .@"raml", all.@"application/raml+yaml" }, - .{ .@"rapd", all.@"application/route-apd+xml" }, - .{ .@"rar", all.@"application/vnd.rar" }, - .{ .@"rar", all.@"application/x-rar-compressed" }, - .{ .@"ras", all.@"image/x-cmu-raster" }, - .{ .@"rcprofile", all.@"application/vnd.ipunplugged.rcprofile" }, - .{ .@"rdf", all.@"application/rdf+xml" }, - .{ .@"rdz", all.@"application/vnd.data-vision.rdz" }, - .{ .@"relo", all.@"application/p2p-overlay+xml" }, - .{ .@"rep", all.@"application/vnd.businessobjects" }, - .{ .@"res", all.@"application/x-dtbresource+xml" }, - .{ .@"rgb", all.@"image/x-rgb" }, - .{ .@"rif", all.@"application/reginfo+xml" }, - .{ .@"rip", all.@"audio/vnd.rip" }, - .{ .@"ris", all.@"application/x-research-info-systems" }, - .{ .@"rl", all.@"application/resource-lists+xml" }, - .{ .@"rlc", all.@"image/vnd.fujixerox.edmics-rlc" }, - .{ .@"rld", all.@"application/resource-lists-diff+xml" }, - .{ .@"rm", all.@"application/vnd.rn-realmedia" }, - .{ .@"rmi", all.@"audio/midi" }, - .{ .@"rmp", all.@"audio/x-pn-realaudio-plugin" }, - .{ .@"rms", all.@"application/vnd.jcp.javame.midlet-rms" }, - .{ .@"rmvb", all.@"application/vnd.rn-realmedia-vbr" }, - .{ .@"rnc", all.@"application/relax-ng-compact-syntax" }, - .{ .@"rng", all.@"application/xml" }, - .{ .@"roa", all.@"application/rpki-roa" }, - .{ .@"roff", all.@"text/troff" }, - .{ .@"rp9", all.@"application/vnd.cloanto.rp9" }, - .{ .@"rpm", all.@"application/x-redhat-package-manager" }, - .{ .@"rpss", all.@"application/vnd.nokia.radio-presets" }, - .{ .@"rpst", all.@"application/vnd.nokia.radio-preset" }, - .{ .@"rq", all.@"application/sparql-query" }, - .{ .@"rs", all.@"application/rls-services+xml" }, - .{ .@"rsat", all.@"application/atsc-rsat+xml" }, - .{ .@"rsd", all.@"application/rsd+xml" }, - .{ .@"rsheet", all.@"application/urc-ressheet+xml" }, - .{ .@"rss", all.@"application/rss+xml" }, - .{ .@"rtf", all.@"application/rtf" }, - .{ .@"rtf", all.@"text/rtf" }, - .{ .@"rtx", all.@"text/richtext" }, - .{ .@"run", all.@"application/x-makeself" }, - .{ .@"rusd", all.@"application/route-usd+xml" }, - .{ .@"s", all.@"text/x-asm" }, - .{ .@"s3m", all.@"audio/s3m" }, - .{ .@"saf", all.@"application/vnd.yamaha.smaf-audio" }, - .{ .@"sass", all.@"text/x-sass" }, - .{ .@"sbml", all.@"application/sbml+xml" }, - .{ .@"sc", all.@"application/vnd.ibm.secure-container" }, - .{ .@"scd", all.@"application/x-msschedule" }, - .{ .@"scm", all.@"application/vnd.lotus-screencam" }, - .{ .@"scq", all.@"application/scvp-cv-request" }, - .{ .@"scs", all.@"application/scvp-cv-response" }, - .{ .@"scss", all.@"text/x-scss" }, - .{ .@"scurl", all.@"text/vnd.curl.scurl" }, - .{ .@"sda", all.@"application/vnd.stardivision.draw" }, - .{ .@"sdc", all.@"application/vnd.stardivision.calc" }, - .{ .@"sdd", all.@"application/vnd.stardivision.impress" }, - .{ .@"sdkd", all.@"application/vnd.solent.sdkm+xml" }, - .{ .@"sdkm", all.@"application/vnd.solent.sdkm+xml" }, - .{ .@"sdp", all.@"application/sdp" }, - .{ .@"sdw", all.@"application/vnd.stardivision.writer" }, - .{ .@"sea", all.@"application/x-sea" }, - .{ .@"see", all.@"application/vnd.seemail" }, - .{ .@"seed", all.@"application/vnd.fdsn.seed" }, - .{ .@"sema", all.@"application/vnd.sema" }, - .{ .@"semd", all.@"application/vnd.semd" }, - .{ .@"semf", all.@"application/vnd.semf" }, - .{ .@"senmlx", all.@"application/senml+xml" }, - .{ .@"sensmlx", all.@"application/sensml+xml" }, - .{ .@"ser", all.@"application/java-serialized-object" }, - .{ .@"setpay", all.@"application/set-payment-initiation" }, - .{ .@"setreg", all.@"application/set-registration-initiation" }, - .{ .@"sfd-hdstx", all.@"application/vnd.hydrostatix.sof-data" }, - .{ .@"sfs", all.@"application/vnd.spotfire.sfs" }, - .{ .@"sfv", all.@"text/x-sfv" }, - .{ .@"sgi", all.@"image/sgi" }, - .{ .@"sgl", all.@"application/vnd.stardivision.writer-global" }, - .{ .@"sgm", all.@"text/sgml" }, - .{ .@"sgml", all.@"text/sgml" }, - .{ .@"sh", all.@"application/x-sh" }, - .{ .@"shar", all.@"application/x-shar" }, - .{ .@"shex", all.@"text/shex" }, - .{ .@"shf", all.@"application/shf+xml" }, - .{ .@"shtml", all.@"text/html" }, - .{ .@"sid", all.@"image/x-mrsid-image" }, - .{ .@"sieve", all.@"application/sieve" }, - .{ .@"sig", all.@"application/pgp-signature" }, - .{ .@"sil", all.@"audio/silk" }, - .{ .@"silo", all.@"model/mesh" }, - .{ .@"sis", all.@"application/vnd.symbian.install" }, - .{ .@"sisx", all.@"application/vnd.symbian.install" }, - .{ .@"sit", all.@"application/x-stuffit" }, - .{ .@"sitx", all.@"application/x-stuffitx" }, - .{ .@"siv", all.@"application/sieve" }, - .{ .@"skd", all.@"application/vnd.koan" }, - .{ .@"skm", all.@"application/vnd.koan" }, - .{ .@"skp", all.@"application/vnd.koan" }, - .{ .@"skt", all.@"application/vnd.koan" }, - .{ .@"sldm", all.@"application/vnd.ms-powerpoint.slide.macroenabled.12" }, - .{ .@"sldx", all.@"application/vnd.openxmlformats-officedocument.presentationml.slide" }, - .{ .@"slim", all.@"text/slim" }, - .{ .@"slm", all.@"text/slim" }, - .{ .@"sls", all.@"application/route-s-tsid+xml" }, - .{ .@"slt", all.@"application/vnd.epson.salt" }, - .{ .@"sm", all.@"application/vnd.stepmania.stepchart" }, - .{ .@"smf", all.@"application/vnd.stardivision.math" }, - .{ .@"smi", all.@"application/smil+xml" }, - .{ .@"smil", all.@"application/smil+xml" }, - .{ .@"smv", all.@"video/x-smv" }, - .{ .@"smzip", all.@"application/vnd.stepmania.package" }, - .{ .@"snd", all.@"audio/basic" }, - .{ .@"snf", all.@"application/x-font-snf" }, - .{ .@"so", all.@"application/octet-stream" }, - .{ .@"spc", all.@"application/x-pkcs7-certificates" }, - .{ .@"spdx", all.@"text/spdx" }, - .{ .@"spf", all.@"application/vnd.yamaha.smaf-phrase" }, - .{ .@"spl", all.@"application/x-futuresplash" }, - .{ .@"spot", all.@"text/vnd.in3d.spot" }, - .{ .@"spp", all.@"application/scvp-vp-response" }, - .{ .@"spq", all.@"application/scvp-vp-request" }, - .{ .@"spx", all.@"audio/ogg" }, - .{ .@"sql", all.@"application/x-sql" }, - .{ .@"src", all.@"application/x-wais-source" }, - .{ .@"srt", all.@"application/x-subrip" }, - .{ .@"sru", all.@"application/sru+xml" }, - .{ .@"srx", all.@"application/sparql-results+xml" }, - .{ .@"ssdl", all.@"application/ssdl+xml" }, - .{ .@"sse", all.@"application/vnd.kodak-descriptor" }, - .{ .@"ssf", all.@"application/vnd.epson.ssf" }, - .{ .@"ssml", all.@"application/ssml+xml" }, - .{ .@"st", all.@"application/vnd.sailingtracker.track" }, - .{ .@"stc", all.@"application/vnd.sun.xml.calc.template" }, - .{ .@"std", all.@"application/vnd.sun.xml.draw.template" }, - .{ .@"stf", all.@"application/vnd.wt.stf" }, - .{ .@"sti", all.@"application/vnd.sun.xml.impress.template" }, - .{ .@"stk", all.@"application/hyperstudio" }, - .{ .@"stl", all.@"application/vnd.ms-pki.stl" }, - .{ .@"stl", all.@"model/stl" }, - .{ .@"stpx", all.@"model/step+xml" }, - .{ .@"stpxz", all.@"model/step-xml+zip" }, - .{ .@"stpz", all.@"model/step+zip" }, - .{ .@"str", all.@"application/vnd.pg.format" }, - .{ .@"stw", all.@"application/vnd.sun.xml.writer.template" }, - .{ .@"styl", all.@"text/stylus" }, - .{ .@"stylus", all.@"text/stylus" }, - .{ .@"sub", all.@"image/vnd.dvb.subtitle" }, - .{ .@"sub", all.@"text/vnd.dvb.subtitle" }, - .{ .@"sus", all.@"application/vnd.sus-calendar" }, - .{ .@"susp", all.@"application/vnd.sus-calendar" }, - .{ .@"sv4cpio", all.@"application/x-sv4cpio" }, - .{ .@"sv4crc", all.@"application/x-sv4crc" }, - .{ .@"svc", all.@"application/vnd.dvb.service" }, - .{ .@"svd", all.@"application/vnd.svd" }, - .{ .@"svg", all.@"image/svg+xml" }, - .{ .@"svgz", all.@"image/svg+xml" }, - .{ .@"swa", all.@"application/x-director" }, - .{ .@"swf", all.@"application/x-shockwave-flash" }, - .{ .@"swi", all.@"application/vnd.aristanetworks.swi" }, - .{ .@"swidtag", all.@"application/swid+xml" }, - .{ .@"sxc", all.@"application/vnd.sun.xml.calc" }, - .{ .@"sxd", all.@"application/vnd.sun.xml.draw" }, - .{ .@"sxg", all.@"application/vnd.sun.xml.writer.global" }, - .{ .@"sxi", all.@"application/vnd.sun.xml.impress" }, - .{ .@"sxm", all.@"application/vnd.sun.xml.math" }, - .{ .@"sxw", all.@"application/vnd.sun.xml.writer" }, - .{ .@"t", all.@"text/troff" }, - .{ .@"t3", all.@"application/x-t3vm-image" }, - .{ .@"t38", all.@"image/t38" }, - .{ .@"taglet", all.@"application/vnd.mynfc" }, - .{ .@"tao", all.@"application/vnd.tao.intent-module-archive" }, - .{ .@"tap", all.@"image/vnd.tencent.tap" }, - .{ .@"tar", all.@"application/x-tar" }, - .{ .@"tcap", all.@"application/vnd.3gpp2.tcap" }, - .{ .@"tcl", all.@"application/x-tcl" }, - .{ .@"td", all.@"application/urc-targetdesc+xml" }, - .{ .@"teacher", all.@"application/vnd.smart.teacher" }, - .{ .@"tei", all.@"application/tei+xml" }, - .{ .@"teicorpus", all.@"application/tei+xml" }, - .{ .@"tex", all.@"application/x-tex" }, - .{ .@"texi", all.@"application/x-texinfo" }, - .{ .@"texinfo", all.@"application/x-texinfo" }, - .{ .@"text", all.@"text/plain" }, - .{ .@"tfi", all.@"application/thraud+xml" }, - .{ .@"tfm", all.@"application/x-tex-tfm" }, - .{ .@"tfx", all.@"image/tiff-fx" }, - .{ .@"tga", all.@"image/x-tga" }, - .{ .@"thmx", all.@"application/vnd.ms-officetheme" }, - .{ .@"tif", all.@"image/tiff" }, - .{ .@"tiff", all.@"image/tiff" }, - .{ .@"tk", all.@"application/x-tcl" }, - .{ .@"tmo", all.@"application/vnd.tmobile-livetv" }, - .{ .@"toml", all.@"application/toml" }, - .{ .@"torrent", all.@"application/x-bittorrent" }, - .{ .@"tpl", all.@"application/vnd.groove-tool-template" }, - .{ .@"tpt", all.@"application/vnd.trid.tpt" }, - .{ .@"tr", all.@"text/troff" }, - .{ .@"tra", all.@"application/vnd.trueapp" }, - .{ .@"trig", all.@"application/trig" }, - .{ .@"trm", all.@"application/x-msterminal" }, - .{ .@"ts", all.@"application/javascript" }, - .{ .@"ts", all.@"video/mp2t" }, - .{ .@"tsd", all.@"application/timestamped-data" }, - .{ .@"tsv", all.@"text/tab-separated-values" }, - .{ .@"tsx", all.@"application/javascript" }, - .{ .@"ttc", all.@"font/collection" }, - .{ .@"ttf", all.@"font/ttf" }, - .{ .@"ttl", all.@"text/turtle" }, - .{ .@"ttml", all.@"application/ttml+xml" }, - .{ .@"twd", all.@"application/vnd.simtech-mindmapper" }, - .{ .@"twds", all.@"application/vnd.simtech-mindmapper" }, - .{ .@"txd", all.@"application/vnd.genomatix.tuxedo" }, - .{ .@"txf", all.@"application/vnd.mobius.txf" }, - .{ .@"txt", all.@"text/plain" }, - .{ .@"u32", all.@"application/x-authorware-bin" }, - .{ .@"u3d", all.@"model/u3d" }, - .{ .@"u8dsn", all.@"message/global-delivery-status" }, - .{ .@"u8hdr", all.@"message/global-headers" }, - .{ .@"u8mdn", all.@"message/global-disposition-notification" }, - .{ .@"u8msg", all.@"message/global" }, - .{ .@"ubj", all.@"application/ubjson" }, - .{ .@"udeb", all.@"application/x-debian-package" }, - .{ .@"ufd", all.@"application/vnd.ufdl" }, - .{ .@"ufdl", all.@"application/vnd.ufdl" }, - .{ .@"ulx", all.@"application/x-glulx" }, - .{ .@"umj", all.@"application/vnd.umajin" }, - .{ .@"unityweb", all.@"application/vnd.unity" }, - .{ .@"uoml", all.@"application/vnd.uoml+xml" }, - .{ .@"uri", all.@"text/uri-list" }, - .{ .@"uris", all.@"text/uri-list" }, - .{ .@"urls", all.@"text/uri-list" }, - .{ .@"usdz", all.@"model/vnd.usdz+zip" }, - .{ .@"ustar", all.@"application/x-ustar" }, - .{ .@"utz", all.@"application/vnd.uiq.theme" }, - .{ .@"uu", all.@"text/x-uuencode" }, - .{ .@"uva", all.@"audio/vnd.dece.audio" }, - .{ .@"uvd", all.@"application/vnd.dece.data" }, - .{ .@"uvf", all.@"application/vnd.dece.data" }, - .{ .@"uvg", all.@"image/vnd.dece.graphic" }, - .{ .@"uvh", all.@"video/vnd.dece.hd" }, - .{ .@"uvi", all.@"image/vnd.dece.graphic" }, - .{ .@"uvm", all.@"video/vnd.dece.mobile" }, - .{ .@"uvp", all.@"video/vnd.dece.pd" }, - .{ .@"uvs", all.@"video/vnd.dece.sd" }, - .{ .@"uvt", all.@"application/vnd.dece.ttml+xml" }, - .{ .@"uvu", all.@"video/vnd.uvvu.mp4" }, - .{ .@"uvv", all.@"video/vnd.dece.video" }, - .{ .@"uvva", all.@"audio/vnd.dece.audio" }, - .{ .@"uvvd", all.@"application/vnd.dece.data" }, - .{ .@"uvvf", all.@"application/vnd.dece.data" }, - .{ .@"uvvg", all.@"image/vnd.dece.graphic" }, - .{ .@"uvvh", all.@"video/vnd.dece.hd" }, - .{ .@"uvvi", all.@"image/vnd.dece.graphic" }, - .{ .@"uvvm", all.@"video/vnd.dece.mobile" }, - .{ .@"uvvp", all.@"video/vnd.dece.pd" }, - .{ .@"uvvs", all.@"video/vnd.dece.sd" }, - .{ .@"uvvt", all.@"application/vnd.dece.ttml+xml" }, - .{ .@"uvvu", all.@"video/vnd.uvvu.mp4" }, - .{ .@"uvvv", all.@"video/vnd.dece.video" }, - .{ .@"uvvx", all.@"application/vnd.dece.unspecified" }, - .{ .@"uvvz", all.@"application/vnd.dece.zip" }, - .{ .@"uvx", all.@"application/vnd.dece.unspecified" }, - .{ .@"uvz", all.@"application/vnd.dece.zip" }, - .{ .@"vbox-extpack", all.@"application/x-virtualbox-vbox-extpack" }, - .{ .@"vbox", all.@"application/x-virtualbox-vbox" }, - .{ .@"vcard", all.@"text/vcard" }, - .{ .@"vcd", all.@"application/x-cdlink" }, - .{ .@"vcf", all.@"text/x-vcard" }, - .{ .@"vcg", all.@"application/vnd.groove-vcard" }, - .{ .@"vcs", all.@"text/x-vcalendar" }, - .{ .@"vcx", all.@"application/vnd.vcx" }, - .{ .@"vdi", all.@"application/x-virtualbox-vdi" }, - .{ .@"vds", all.@"model/vnd.sap.vds" }, - .{ .@"vhd", all.@"application/x-virtualbox-vhd" }, - .{ .@"vis", all.@"application/vnd.visionary" }, - .{ .@"viv", all.@"video/vnd.vivo" }, - .{ .@"vmdk", all.@"application/x-virtualbox-vmdk" }, - .{ .@"vob", all.@"video/x-ms-vob" }, - .{ .@"vor", all.@"application/vnd.stardivision.writer" }, - .{ .@"vox", all.@"application/x-authorware-bin" }, - .{ .@"vrml", all.@"model/vrml" }, - .{ .@"vsd", all.@"application/vnd.visio" }, - .{ .@"vsf", all.@"application/vnd.vsf" }, - .{ .@"vss", all.@"application/vnd.visio" }, - .{ .@"vst", all.@"application/vnd.visio" }, - .{ .@"vsw", all.@"application/vnd.visio" }, - .{ .@"vtf", all.@"image/vnd.valve.source.texture" }, - .{ .@"vtt", all.@"text/vtt" }, - .{ .@"vtu", all.@"model/vnd.vtu" }, - .{ .@"vxml", all.@"application/voicexml+xml" }, - .{ .@"w3d", all.@"application/x-director" }, - .{ .@"wad", all.@"application/x-doom" }, - .{ .@"wadl", all.@"application/vnd.sun.wadl+xml" }, - .{ .@"war", all.@"application/java-archive" }, - .{ .@"wasm", wasm }, - .{ .@"wav", all.@"audio/wav" }, - .{ .@"wav", all.@"audio/wave" }, - .{ .@"wav", all.@"audio/x-wav" }, - .{ .@"wax", all.@"audio/x-ms-wax" }, - .{ .@"wbmp", all.@"image/vnd.wap.wbmp" }, - .{ .@"wbs", all.@"application/vnd.criticaltools.wbs+xml" }, - .{ .@"wbxml", all.@"application/vnd.wap.wbxml" }, - .{ .@"wcm", all.@"application/vnd.ms-works" }, - .{ .@"wdb", all.@"application/vnd.ms-works" }, - .{ .@"wdp", all.@"image/vnd.ms-photo" }, - .{ .@"weba", all.@"audio/webm" }, - .{ .@"webapp", all.@"application/x-web-app-manifest+json" }, - .{ .@"webm", all.@"video/webm" }, - .{ .@"webmanifest", all.@"application/manifest+json" }, - .{ .@"webp", all.@"image/webp" }, - .{ .@"wg", all.@"application/vnd.pmi.widget" }, - .{ .@"wgt", all.@"application/widget" }, - .{ .@"wif", all.@"application/watcherinfo+xml" }, - .{ .@"wks", all.@"application/vnd.ms-works" }, - .{ .@"wm", all.@"video/x-ms-wm" }, - .{ .@"wma", all.@"audio/x-ms-wma" }, - .{ .@"wmd", all.@"application/x-ms-wmd" }, - .{ .@"wmf", all.@"application/x-msmetafile" }, - .{ .@"wmf", all.@"image/wmf" }, - .{ .@"wml", all.@"text/vnd.wap.wml" }, - .{ .@"wmlc", all.@"application/vnd.wap.wmlc" }, - .{ .@"wmls", all.@"text/vnd.wap.wmlscript" }, - .{ .@"wmlsc", all.@"application/vnd.wap.wmlscriptc" }, - .{ .@"wmv", all.@"video/x-ms-wmv" }, - .{ .@"wmx", all.@"video/x-ms-wmx" }, - .{ .@"wmz", all.@"application/x-ms-wmz" }, - .{ .@"wmz", all.@"application/x-msmetafile" }, - .{ .@"woff", all.@"font/woff" }, - .{ .@"woff2", all.@"font/woff2" }, - .{ .@"wpd", all.@"application/vnd.wordperfect" }, - .{ .@"wpl", all.@"application/vnd.ms-wpl" }, - .{ .@"wps", all.@"application/vnd.ms-works" }, - .{ .@"wqd", all.@"application/vnd.wqd" }, - .{ .@"wri", all.@"application/x-mswrite" }, - .{ .@"wrl", all.@"model/vrml" }, - .{ .@"wsc", all.@"message/vnd.wfa.wsc" }, - .{ .@"wsdl", all.@"application/wsdl+xml" }, - .{ .@"wspolicy", all.@"application/wspolicy+xml" }, - .{ .@"wtb", all.@"application/vnd.webturbo" }, - .{ .@"wvx", all.@"video/x-ms-wvx" }, - .{ .@"x_b", all.@"model/vnd.parasolid.transmit.binary" }, - .{ .@"x_t", all.@"model/vnd.parasolid.transmit.text" }, - .{ .@"x32", all.@"application/x-authorware-bin" }, - .{ .@"x3d", all.@"model/x3d+xml" }, - .{ .@"x3db", all.@"model/x3d+binary" }, - .{ .@"x3db", all.@"model/x3d+fastinfoset" }, - .{ .@"x3dbz", all.@"model/x3d+binary" }, - .{ .@"x3dv", all.@"model/x3d-vrml" }, - .{ .@"x3dv", all.@"model/x3d+vrml" }, - .{ .@"x3dvz", all.@"model/x3d+vrml" }, - .{ .@"x3dz", all.@"model/x3d+xml" }, - .{ .@"xaml", all.@"application/xaml+xml" }, - .{ .@"xap", all.@"application/x-silverlight-app" }, - .{ .@"xar", all.@"application/vnd.xara" }, - .{ .@"xav", all.@"application/xcap-att+xml" }, - .{ .@"xbap", all.@"application/x-ms-xbap" }, - .{ .@"xbd", all.@"application/vnd.fujixerox.docuworks.binder" }, - .{ .@"xbm", all.@"image/x-xbitmap" }, - .{ .@"xca", all.@"application/xcap-caps+xml" }, - .{ .@"xcs", all.@"application/calendar+xml" }, - .{ .@"xdf", all.@"application/xcap-diff+xml" }, - .{ .@"xdm", all.@"application/vnd.syncml.dm+xml" }, - .{ .@"xdp", all.@"application/vnd.adobe.xdp+xml" }, - .{ .@"xdssc", all.@"application/dssc+xml" }, - .{ .@"xdw", all.@"application/vnd.fujixerox.docuworks" }, - .{ .@"xel", all.@"application/xcap-el+xml" }, - .{ .@"xenc", all.@"application/xenc+xml" }, - .{ .@"xer", all.@"application/patch-ops-error+xml" }, - .{ .@"xfdf", all.@"application/vnd.adobe.xfdf" }, - .{ .@"xfdl", all.@"application/vnd.xfdl" }, - .{ .@"xht", all.@"application/xhtml+xml" }, - .{ .@"xhtml", all.@"application/xhtml+xml" }, - .{ .@"xhvml", all.@"application/xv+xml" }, - .{ .@"xif", all.@"image/vnd.xiff" }, - .{ .@"xla", all.@"application/vnd.ms-excel" }, - .{ .@"xlam", all.@"application/vnd.ms-excel.addin.macroenabled.12" }, - .{ .@"xlc", all.@"application/vnd.ms-excel" }, - .{ .@"xlf", all.@"application/x-xliff+xml" }, - .{ .@"xlf", all.@"application/xliff+xml" }, - .{ .@"xlm", all.@"application/vnd.ms-excel" }, - .{ .@"xls", all.@"application/vnd.ms-excel" }, - .{ .@"xlsb", all.@"application/vnd.ms-excel.sheet.binary.macroenabled.12" }, - .{ .@"xlsm", all.@"application/vnd.ms-excel.sheet.macroenabled.12" }, - .{ .@"xlsx", all.@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, - .{ .@"xlt", all.@"application/vnd.ms-excel" }, - .{ .@"xltm", all.@"application/vnd.ms-excel.template.macroenabled.12" }, - .{ .@"xltx", all.@"application/vnd.openxmlformats-officedocument.spreadsheetml.template" }, - .{ .@"xlw", all.@"application/vnd.ms-excel" }, - .{ .@"xm", all.@"audio/xm" }, - .{ .@"xml", all.@"application/xml" }, - .{ .@"xml", all.@"text/xml" }, - .{ .@"xns", all.@"application/xcap-ns+xml" }, - .{ .@"xo", all.@"application/vnd.olpc-sugar" }, - .{ .@"xop", all.@"application/xop+xml" }, - .{ .@"xpi", all.@"application/x-xpinstall" }, - .{ .@"xpl", all.@"application/xproc+xml" }, - .{ .@"xpm", all.@"image/x-xpixmap" }, - .{ .@"xpr", all.@"application/vnd.is-xpr" }, - .{ .@"xps", all.@"application/vnd.ms-xpsdocument" }, - .{ .@"xpw", all.@"application/vnd.intercon.formnet" }, - .{ .@"xpx", all.@"application/vnd.intercon.formnet" }, - .{ .@"xsd", all.@"application/xml" }, - .{ .@"xsl", all.@"application/xml" }, - .{ .@"xsl", all.@"application/xslt+xml" }, - .{ .@"xslt", all.@"application/xslt+xml" }, - .{ .@"xsm", all.@"application/vnd.syncml+xml" }, - .{ .@"xspf", all.@"application/xspf+xml" }, - .{ .@"xul", all.@"application/vnd.mozilla.xul+xml" }, - .{ .@"xvm", all.@"application/xv+xml" }, - .{ .@"xvml", all.@"application/xv+xml" }, - .{ .@"xwd", all.@"image/x-xwindowdump" }, - .{ .@"xyz", all.@"chemical/x-xyz" }, - .{ .@"xz", all.@"application/x-xz" }, - .{ .@"yaml", all.@"text/yaml" }, - .{ .@"yang", all.@"application/yang" }, - .{ .@"yin", all.@"application/yin+xml" }, - .{ .@"yml", all.@"text/yaml" }, - .{ .@"ymp", all.@"text/x-suse-ymp" }, - .{ .@"z1", all.@"application/x-zmachine" }, - .{ .@"z2", all.@"application/x-zmachine" }, - .{ .@"z3", all.@"application/x-zmachine" }, - .{ .@"z4", all.@"application/x-zmachine" }, - .{ .@"z5", all.@"application/x-zmachine" }, - .{ .@"z6", all.@"application/x-zmachine" }, - .{ .@"z7", all.@"application/x-zmachine" }, - .{ .@"z8", all.@"application/x-zmachine" }, - .{ .@"zaz", all.@"application/vnd.zzazz.deck+xml" }, - .{ .@"zip", all.@"application/zip" }, - .{ .@"zir", all.@"application/vnd.zul" }, - .{ .@"zirz", all.@"application/vnd.zul" }, - .{ .@"zmm", all.@"application/vnd.handheld-entertainment+xml" }, + .{ "123", all.@"application/vnd.lotus-1-2-3" }, + .{ "1km", all.@"application/vnd.1000minds.decision-model+xml" }, + .{ "3dml", all.@"text/vnd.in3d.3dml" }, + .{ "3ds", all.@"image/x-3ds" }, + .{ "3g2", all.@"video/3gpp2" }, + .{ "3gp", all.@"video/3gpp" }, + .{ "3gpp", all.@"video/3gpp" }, + .{ "3mf", all.@"model/3mf" }, + .{ "7z", all.@"application/x-7z-compressed" }, + .{ "aab", all.@"application/x-authorware-bin" }, + .{ "aac", all.@"audio/x-aac" }, + .{ "aam", all.@"application/x-authorware-map" }, + .{ "aas", all.@"application/x-authorware-seg" }, + .{ "abw", all.@"application/x-abiword" }, + .{ "ac", all.@"application/vnd.nokia.n-gage.ac+xml" }, + .{ "acc", all.@"application/vnd.americandynamics.acc" }, + .{ "ace", all.@"application/x-ace-compressed" }, + .{ "acu", all.@"application/vnd.acucobol" }, + .{ "acutc", all.@"application/vnd.acucorp" }, + .{ "adp", all.@"audio/adpcm" }, + .{ "aep", all.@"application/vnd.audiograph" }, + .{ "afm", all.@"application/x-font-type1" }, + .{ "afp", all.@"application/vnd.ibm.modcap" }, + .{ "age", all.@"application/vnd.age" }, + .{ "ahead", all.@"application/vnd.ahead.space" }, + .{ "ai", all.@"application/postscript" }, + .{ "aif", all.@"audio/x-aiff" }, + .{ "aifc", all.@"audio/x-aiff" }, + .{ "aiff", all.@"audio/x-aiff" }, + .{ "air", all.@"application/vnd.adobe.air-application-installer-package+zip" }, + .{ "ait", all.@"application/vnd.dvb.ait" }, + .{ "ami", all.@"application/vnd.amiga.ami" }, + .{ "amr", all.@"audio/amr" }, + .{ "apk", all.@"application/vnd.android.package-archive" }, + .{ "apng", all.@"image/apng" }, + .{ "appcache", all.@"text/cache-manifest" }, + .{ "application", all.@"application/x-ms-application" }, + .{ "apr", all.@"application/vnd.lotus-approach" }, + .{ "arc", all.@"application/x-freearc" }, + .{ "arj", all.@"application/x-arj" }, + .{ "asc", all.@"application/pgp-signature" }, + .{ "asf", all.@"video/x-ms-asf" }, + .{ "asm", all.@"text/x-asm" }, + .{ "aso", all.@"application/vnd.accpac.simply.aso" }, + .{ "asx", all.@"video/x-ms-asf" }, + .{ "atc", all.@"application/vnd.acucorp" }, + .{ "atom", all.@"application/atom+xml" }, + .{ "atomcat", all.@"application/atomcat+xml" }, + .{ "atomdeleted", all.@"application/atomdeleted+xml" }, + .{ "atomsvc", all.@"application/atomsvc+xml" }, + .{ "atx", all.@"application/vnd.antix.game-component" }, + .{ "au", all.@"audio/basic" }, + .{ "avci", all.@"image/avci" }, + .{ "avcs", all.@"image/avcs" }, + .{ "avi", all.@"video/x-msvideo" }, + .{ "avif", all.@"image/avif" }, + .{ "aw", all.@"application/applixware" }, + .{ "azf", all.@"application/vnd.airzip.filesecure.azf" }, + .{ "azs", all.@"application/vnd.airzip.filesecure.azs" }, + .{ "azv", all.@"image/vnd.airzip.accelerator.azv" }, + .{ "azw", all.@"application/vnd.amazon.ebook" }, + .{ "b16", all.@"image/vnd.pco.b16" }, + .{ "bat", all.@"application/x-msdownload" }, + .{ "bcpio", all.@"application/x-bcpio" }, + .{ "bdf", all.@"application/x-font-bdf" }, + .{ "bdm", all.@"application/vnd.syncml.dm+wbxml" }, + .{ "bdoc", all.@"application/x-bdoc" }, + .{ "bed", all.@"application/vnd.realvnc.bed" }, + .{ "bh2", all.@"application/vnd.fujitsu.oasysprs" }, + .{ "bin", all.@"application/octet-stream" }, + .{ "blb", all.@"application/x-blorb" }, + .{ "blorb", all.@"application/x-blorb" }, + .{ "bmi", all.@"application/vnd.bmi" }, + .{ "bmml", all.@"application/vnd.balsamiq.bmml+xml" }, + .{ "bmp", all.@"image/x-ms-bmp" }, + .{ "book", all.@"application/vnd.framemaker" }, + .{ "box", all.@"application/vnd.previewsystems.box" }, + .{ "boz", all.@"application/x-bzip2" }, + .{ "bpk", all.@"application/octet-stream" }, + .{ "bsp", all.@"model/vnd.valve.source.compiled-map" }, + .{ "btif", all.@"image/prs.btif" }, + .{ "buffer", all.@"application/octet-stream" }, + .{ "bz", all.@"application/x-bzip" }, + .{ "bz2", all.@"application/x-bzip2" }, + .{ "c", all.@"text/x-c" }, + .{ "c11amc", all.@"application/vnd.cluetrust.cartomobile-config" }, + .{ "c11amz", all.@"application/vnd.cluetrust.cartomobile-config-pkg" }, + .{ "c4d", all.@"application/vnd.clonk.c4group" }, + .{ "c4f", all.@"application/vnd.clonk.c4group" }, + .{ "c4g", all.@"application/vnd.clonk.c4group" }, + .{ "c4p", all.@"application/vnd.clonk.c4group" }, + .{ "c4u", all.@"application/vnd.clonk.c4group" }, + .{ "cab", all.@"application/vnd.ms-cab-compressed" }, + .{ "caf", all.@"audio/x-caf" }, + .{ "cap", all.@"application/vnd.tcpdump.pcap" }, + .{ "car", all.@"application/vnd.curl.car" }, + .{ "cat", all.@"application/vnd.ms-pki.seccat" }, + .{ "cb7", all.@"application/x-cbr" }, + .{ "cba", all.@"application/x-cbr" }, + .{ "cbr", all.@"application/x-cbr" }, + .{ "cbt", all.@"application/x-cbr" }, + .{ "cbz", all.@"application/x-cbr" }, + .{ "cc", all.@"text/x-c" }, + .{ "cco", all.@"application/x-cocoa" }, + .{ "cct", all.@"application/x-director" }, + .{ "ccxml", all.@"application/ccxml+xml" }, + .{ "cdbcmsg", all.@"application/vnd.contact.cmsg" }, + .{ "cdf", all.@"application/x-netcdf" }, + .{ "cdfx", all.@"application/cdfx+xml" }, + .{ "cdkey", all.@"application/vnd.mediastation.cdkey" }, + .{ "cdmia", all.@"application/cdmi-capability" }, + .{ "cdmic", all.@"application/cdmi-container" }, + .{ "cdmid", all.@"application/cdmi-domain" }, + .{ "cdmio", all.@"application/cdmi-object" }, + .{ "cdmiq", all.@"application/cdmi-queue" }, + .{ "cdx", all.@"chemical/x-cdx" }, + .{ "cdxml", all.@"application/vnd.chemdraw+xml" }, + .{ "cdy", all.@"application/vnd.cinderella" }, + .{ "cer", all.@"application/pkix-cert" }, + .{ "cfs", all.@"application/x-cfs-compressed" }, + .{ "cgm", all.@"image/cgm" }, + .{ "chat", all.@"application/x-chat" }, + .{ "chm", all.@"application/vnd.ms-htmlhelp" }, + .{ "chrt", all.@"application/vnd.kde.kchart" }, + .{ "cif", all.@"chemical/x-cif" }, + .{ "cii", all.@"application/vnd.anser-web-certificate-issue-initiation" }, + .{ "cil", all.@"application/vnd.ms-artgalry" }, + .{ "cjs", all.@"application/javascript" }, + .{ "cla", all.@"application/vnd.claymore" }, + .{ "class", all.@"application/java-vm" }, + .{ "clkk", all.@"application/vnd.crick.clicker.keyboard" }, + .{ "clkp", all.@"application/vnd.crick.clicker.palette" }, + .{ "clkt", all.@"application/vnd.crick.clicker.template" }, + .{ "clkw", all.@"application/vnd.crick.clicker.wordbank" }, + .{ "clkx", all.@"application/vnd.crick.clicker" }, + .{ "clp", all.@"application/x-msclip" }, + .{ "cmc", all.@"application/vnd.cosmocaller" }, + .{ "cmdf", all.@"chemical/x-cmdf" }, + .{ "cml", all.@"chemical/x-cml" }, + .{ "cmp", all.@"application/vnd.yellowriver-custom-menu" }, + .{ "cmx", all.@"image/x-cmx" }, + .{ "cod", all.@"application/vnd.rim.cod" }, + .{ "coffee", all.@"text/coffeescript" }, + .{ "com", all.@"application/x-msdownload" }, + .{ "conf", all.@"text/plain" }, + .{ "cpio", all.@"application/x-cpio" }, + .{ "cpl", all.@"application/cpl+xml" }, + .{ "cpp", all.@"text/x-c" }, + .{ "cpt", all.@"application/mac-compactpro" }, + .{ "crd", all.@"application/x-mscardfile" }, + .{ "crl", all.@"application/pkix-crl" }, + .{ "crt", all.@"application/x-x509-ca-cert" }, + .{ "crx", all.@"application/x-chrome-extension" }, + .{ "cryptonote", all.@"application/vnd.rig.cryptonote" }, + .{ "csh", all.@"application/x-csh" }, + .{ "csl", all.@"application/vnd.citationstyles.style+xml" }, + .{ "csml", all.@"chemical/x-csml" }, + .{ "csp", all.@"application/vnd.commonspace" }, + .{ "css", all.@"text/css" }, + .{ "cst", all.@"application/x-director" }, + .{ "csv", all.@"text/csv" }, + .{ "cts", all.@"application/javascript" }, + .{ "cu", all.@"application/cu-seeme" }, + .{ "curl", all.@"text/vnd.curl" }, + .{ "cww", all.@"application/prs.cww" }, + .{ "cxt", all.@"application/x-director" }, + .{ "cxx", all.@"text/x-c" }, + .{ "dae", all.@"model/vnd.collada+xml" }, + .{ "daf", all.@"application/vnd.mobius.daf" }, + .{ "dart", all.@"application/vnd.dart" }, + .{ "dataless", all.@"application/vnd.fdsn.seed" }, + .{ "davmount", all.@"application/davmount+xml" }, + .{ "dbf", all.@"application/vnd.dbf" }, + .{ "dbk", all.@"application/docbook+xml" }, + .{ "dcr", all.@"application/x-director" }, + .{ "dcurl", all.@"text/vnd.curl.dcurl" }, + .{ "dd2", all.@"application/vnd.oma.dd2+xml" }, + .{ "ddd", all.@"application/vnd.fujixerox.ddd" }, + .{ "ddf", all.@"application/vnd.syncml.dmddf+xml" }, + .{ "dds", all.@"image/vnd.ms-dds" }, + .{ "deb", all.@"application/x-debian-package" }, + .{ "def", all.@"text/plain" }, + .{ "deploy", all.@"application/octet-stream" }, + .{ "der", all.@"application/x-x509-ca-cert" }, + .{ "dfac", all.@"application/vnd.dreamfactory" }, + .{ "dgc", all.@"application/x-dgc-compressed" }, + .{ "dic", all.@"text/x-c" }, + .{ "dir", all.@"application/x-director" }, + .{ "dis", all.@"application/vnd.mobius.dis" }, + .{ "disposition-n", all.@"message/disposition-notification" }, + .{ "dist", all.@"application/octet-stream" }, + .{ "distz", all.@"application/octet-stream" }, + .{ "djv", all.@"image/vnd.djvu" }, + .{ "djvu", all.@"image/vnd.djvu" }, + .{ "dll", all.@"application/x-msdownload" }, + .{ "dmg", all.@"application/x-apple-diskimage" }, + .{ "dmp", all.@"application/vnd.tcpdump.pcap" }, + .{ "dms", all.@"application/octet-stream" }, + .{ "dna", all.@"application/vnd.dna" }, + .{ "doc", all.@"application/msword" }, + .{ "docm", all.@"application/vnd.ms-word.document.macroenabled.12" }, + .{ "docx", all.@"application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, + .{ "dot", all.@"application/msword" }, + .{ "dotm", all.@"application/vnd.ms-word.template.macroenabled.12" }, + .{ "dotx", all.@"application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, + .{ "dp", all.@"application/vnd.osgi.dp" }, + .{ "dpg", all.@"application/vnd.dpgraph" }, + .{ "dra", all.@"audio/vnd.dra" }, + .{ "drle", all.@"image/dicom-rle" }, + .{ "dsc", all.@"text/prs.lines.tag" }, + .{ "dssc", all.@"application/dssc+der" }, + .{ "dtb", all.@"application/x-dtbook+xml" }, + .{ "dtd", all.@"application/xml-dtd" }, + .{ "dts", all.@"audio/vnd.dts" }, + .{ "dtshd", all.@"audio/vnd.dts.hd" }, + .{ "dump", all.@"application/octet-stream" }, + .{ "dvb", all.@"video/vnd.dvb.file" }, + .{ "dvi", all.@"application/x-dvi" }, + .{ "dwd", all.@"application/atsc-dwd+xml" }, + .{ "dwf", all.@"model/vnd.dwf" }, + .{ "dwg", all.@"image/vnd.dwg" }, + .{ "dxf", all.@"image/vnd.dxf" }, + .{ "dxp", all.@"application/vnd.spotfire.dxp" }, + .{ "dxr", all.@"application/x-director" }, + .{ "ear", all.@"application/java-archive" }, + .{ "ecelp4800", all.@"audio/vnd.nuera.ecelp4800" }, + .{ "ecelp7470", all.@"audio/vnd.nuera.ecelp7470" }, + .{ "ecelp9600", all.@"audio/vnd.nuera.ecelp9600" }, + .{ "ecma", all.@"application/ecmascript" }, + .{ "edm", all.@"application/vnd.novadigm.edm" }, + .{ "edx", all.@"application/vnd.novadigm.edx" }, + .{ "efif", all.@"application/vnd.picsel" }, + .{ "ei6", all.@"application/vnd.pg.osasli" }, + .{ "elc", all.@"application/octet-stream" }, + .{ "emf", all.@"image/emf" }, + .{ "eml", all.@"message/rfc822" }, + .{ "emma", all.@"application/emma+xml" }, + .{ "emotionml", all.@"application/emotionml+xml" }, + .{ "emz", all.@"application/x-msmetafile" }, + .{ "eol", all.@"audio/vnd.digital-winds" }, + .{ "eot", all.@"application/vnd.ms-fontobject" }, + .{ "eps", all.@"application/postscript" }, + .{ "epub", all.@"application/epub+zip" }, + .{ "es", all.@"application/ecmascript" }, + .{ "es3", all.@"application/vnd.eszigno3+xml" }, + .{ "esa", all.@"application/vnd.osgi.subsystem" }, + .{ "esf", all.@"application/vnd.epson.esf" }, + .{ "et3", all.@"application/vnd.eszigno3+xml" }, + .{ "etx", all.@"text/x-setext" }, + .{ "eva", all.@"application/x-eva" }, + .{ "evy", all.@"application/x-envoy" }, + .{ "exe", all.@"application/x-msdownload" }, + .{ "exi", all.@"application/exi" }, + .{ "exp", all.@"application/express" }, + .{ "exr", all.@"image/aces" }, + .{ "ext", all.@"application/vnd.novadigm.ext" }, + .{ "ez", all.@"application/andrew-inset" }, + .{ "ez2", all.@"application/vnd.ezpix-album" }, + .{ "ez3", all.@"application/vnd.ezpix-package" }, + .{ "f", all.@"text/x-fortran" }, + .{ "f4v", all.@"video/x-f4v" }, + .{ "f77", all.@"text/x-fortran" }, + .{ "f90", all.@"text/x-fortran" }, + .{ "fbs", all.@"image/vnd.fastbidsheet" }, + .{ "fcdt", all.@"application/vnd.adobe.formscentral.fcdt" }, + .{ "fcs", all.@"application/vnd.isac.fcs" }, + .{ "fdf", all.@"application/vnd.fdf" }, + .{ "fdt", all.@"application/fdt+xml" }, + .{ "fe_launch", all.@"application/vnd.denovo.fcselayout-link" }, + .{ "fg5", all.@"application/vnd.fujitsu.oasysgp" }, + .{ "fgd", all.@"application/x-director" }, + .{ "fh", all.@"image/x-freehand" }, + .{ "fh4", all.@"image/x-freehand" }, + .{ "fh5", all.@"image/x-freehand" }, + .{ "fh7", all.@"image/x-freehand" }, + .{ "fhc", all.@"image/x-freehand" }, + .{ "fig", all.@"application/x-xfig" }, + .{ "fits", all.@"image/fits" }, + .{ "flac", all.@"audio/x-flac" }, + .{ "fli", all.@"video/x-fli" }, + .{ "flo", all.@"application/vnd.micrografx.flo" }, + .{ "flv", all.@"video/x-flv" }, + .{ "flw", all.@"application/vnd.kde.kivio" }, + .{ "flx", all.@"text/vnd.fmi.flexstor" }, + .{ "fly", all.@"text/vnd.fly" }, + .{ "fm", all.@"application/vnd.framemaker" }, + .{ "fnc", all.@"application/vnd.frogans.fnc" }, + .{ "fo", all.@"application/vnd.software602.filler.form+xml" }, + .{ "for", all.@"text/x-fortran" }, + .{ "fpx", all.@"image/vnd.fpx" }, + .{ "frame", all.@"application/vnd.framemaker" }, + .{ "fsc", all.@"application/vnd.fsc.weblaunch" }, + .{ "fst", all.@"image/vnd.fst" }, + .{ "ftc", all.@"application/vnd.fluxtime.clip" }, + .{ "fti", all.@"application/vnd.anser-web-funds-transfer-initiation" }, + .{ "fvt", all.@"video/vnd.fvt" }, + .{ "fxp", all.@"application/vnd.adobe.fxp" }, + .{ "fxpl", all.@"application/vnd.adobe.fxp" }, + .{ "fzs", all.@"application/vnd.fuzzysheet" }, + .{ "g2w", all.@"application/vnd.geoplan" }, + .{ "g3", all.@"image/g3fax" }, + .{ "g3w", all.@"application/vnd.geospace" }, + .{ "gac", all.@"application/vnd.groove-account" }, + .{ "gam", all.@"application/x-tads" }, + .{ "gbr", all.@"application/rpki-ghostbusters" }, + .{ "gca", all.@"application/x-gca-compressed" }, + .{ "gdl", all.@"model/vnd.gdl" }, + .{ "gdoc", all.@"application/vnd.google-apps.document" }, + .{ "ged", all.@"text/vnd.familysearch.gedcom" }, + .{ "geo", all.@"application/vnd.dynageo" }, + .{ "geojson", all.@"application/geo+json" }, + .{ "gex", all.@"application/vnd.geometry-explorer" }, + .{ "ggb", all.@"application/vnd.geogebra.file" }, + .{ "ggt", all.@"application/vnd.geogebra.tool" }, + .{ "ghf", all.@"application/vnd.groove-help" }, + .{ "gif", all.@"image/gif" }, + .{ "gim", all.@"application/vnd.groove-identity-message" }, + .{ "glb", all.@"model/gltf-binary" }, + .{ "gltf", all.@"model/gltf+json" }, + .{ "gml", all.@"application/gml+xml" }, + .{ "gmx", all.@"application/vnd.gmx" }, + .{ "gnumeric", all.@"application/x-gnumeric" }, + .{ "gph", all.@"application/vnd.flographit" }, + .{ "gpx", all.@"application/gpx+xml" }, + .{ "gqf", all.@"application/vnd.grafeq" }, + .{ "gqs", all.@"application/vnd.grafeq" }, + .{ "gram", all.@"application/srgs" }, + .{ "gramps", all.@"application/x-gramps-xml" }, + .{ "gre", all.@"application/vnd.geometry-explorer" }, + .{ "grv", all.@"application/vnd.groove-injector" }, + .{ "grxml", all.@"application/srgs+xml" }, + .{ "gsf", all.@"application/x-font-ghostscript" }, + .{ "gsheet", all.@"application/vnd.google-apps.spreadsheet" }, + .{ "gslides", all.@"application/vnd.google-apps.presentation" }, + .{ "gtar", all.@"application/x-gtar" }, + .{ "gtm", all.@"application/vnd.groove-tool-message" }, + .{ "gtw", all.@"model/vnd.gtw" }, + .{ "gv", all.@"text/vnd.graphviz" }, + .{ "gxf", all.@"application/gxf" }, + .{ "gxt", all.@"application/vnd.geonext" }, + .{ "gz", all.@"application/gzip" }, + .{ "h", all.@"text/x-c" }, + .{ "h261", all.@"video/h261" }, + .{ "h263", all.@"video/h263" }, + .{ "h264", all.@"video/h264" }, + .{ "hal", all.@"application/vnd.hal+xml" }, + .{ "hbci", all.@"application/vnd.hbci" }, + .{ "hbs", all.@"text/x-handlebars-template" }, + .{ "hdd", all.@"application/x-virtualbox-hdd" }, + .{ "hdf", all.@"application/x-hdf" }, + .{ "heic", all.@"image/heic" }, + .{ "heics", all.@"image/heic-sequence" }, + .{ "heif", all.@"image/heif" }, + .{ "heifs", all.@"image/heif-sequence" }, + .{ "hej2", all.@"image/hej2k" }, + .{ "held", all.@"application/atsc-held+xml" }, + .{ "hh", all.@"text/x-c" }, + .{ "hjson", all.@"application/hjson" }, + .{ "hlp", all.@"application/winhlp" }, + .{ "hpgl", all.@"application/vnd.hp-hpgl" }, + .{ "hpid", all.@"application/vnd.hp-hpid" }, + .{ "hps", all.@"application/vnd.hp-hps" }, + .{ "hqx", all.@"application/mac-binhex40" }, + .{ "hsj2", all.@"image/hsj2" }, + .{ "htc", all.@"text/x-component" }, + .{ "htke", all.@"application/vnd.kenameaapp" }, + .{ "htm", all.@"text/html" }, + .{ "html", all.@"text/html" }, + .{ "hvd", all.@"application/vnd.yamaha.hv-dic" }, + .{ "hvp", all.@"application/vnd.yamaha.hv-voice" }, + .{ "hvs", all.@"application/vnd.yamaha.hv-script" }, + .{ "i2g", all.@"application/vnd.intergeo" }, + .{ "icc", all.@"application/vnd.iccprofile" }, + .{ "ice", all.@"x-conference/x-cooltalk" }, + .{ "icm", all.@"application/vnd.iccprofile" }, + .{ "ico", all.@"image/x-icon" }, + .{ "ics", all.@"text/calendar" }, + .{ "ief", all.@"image/ief" }, + .{ "ifb", all.@"text/calendar" }, + .{ "ifm", all.@"application/vnd.shana.informed.formdata" }, + .{ "iges", all.@"model/iges" }, + .{ "igl", all.@"application/vnd.igloader" }, + .{ "igm", all.@"application/vnd.insors.igm" }, + .{ "igs", all.@"model/iges" }, + .{ "igx", all.@"application/vnd.micrografx.igx" }, + .{ "iif", all.@"application/vnd.shana.informed.interchange" }, + .{ "img", all.@"application/octet-stream" }, + .{ "imp", all.@"application/vnd.accpac.simply.imp" }, + .{ "ims", all.@"application/vnd.ms-ims" }, + .{ "in", all.@"text/plain" }, + .{ "ini", all.@"text/plain" }, + .{ "ink", all.@"application/inkml+xml" }, + .{ "inkml", all.@"application/inkml+xml" }, + .{ "install", all.@"application/x-install-instructions" }, + .{ "iota", all.@"application/vnd.astraea-software.iota" }, + .{ "ipfix", all.@"application/ipfix" }, + .{ "ipk", all.@"application/vnd.shana.informed.package" }, + .{ "irm", all.@"application/vnd.ibm.rights-management" }, + .{ "irp", all.@"application/vnd.irepository.package+xml" }, + .{ "iso", all.@"application/x-iso9660-image" }, + .{ "itp", all.@"application/vnd.shana.informed.formtemplate" }, + .{ "its", all.@"application/its+xml" }, + .{ "ivp", all.@"application/vnd.immervision-ivp" }, + .{ "ivu", all.@"application/vnd.immervision-ivu" }, + .{ "jad", all.@"text/vnd.sun.j2me.app-descriptor" }, + .{ "jade", all.@"text/jade" }, + .{ "jam", all.@"application/vnd.jam" }, + .{ "jar", all.@"application/java-archive" }, + .{ "jardiff", all.@"application/x-java-archive-diff" }, + .{ "java", all.@"text/x-java-source" }, + .{ "jhc", all.@"image/jphc" }, + .{ "jisp", all.@"application/vnd.jisp" }, + .{ "jls", all.@"image/jls" }, + .{ "jlt", all.@"application/vnd.hp-jlyt" }, + .{ "jng", all.@"image/x-jng" }, + .{ "jnlp", all.@"application/x-java-jnlp-file" }, + .{ "joda", all.@"application/vnd.joost.joda-archive" }, + .{ "jp2", all.@"image/jp2" }, + .{ "jpe", all.@"image/jpeg" }, + .{ "jpeg", all.@"image/jpeg" }, + .{ "jpf", all.@"image/jpx" }, + .{ "jpg", all.@"image/jpeg" }, + .{ "jpg2", all.@"image/jp2" }, + .{ "jpgm", all.@"video/jpm" }, + .{ "jpgv", all.@"video/jpeg" }, + .{ "jph", all.@"image/jph" }, + .{ "jpm", all.@"video/jpm" }, + .{ "jpx", all.@"image/jpx" }, + .{ "js", all.@"application/javascript" }, + .{ "json", all.@"application/json" }, + .{ "json5", all.@"application/json5" }, + .{ "jsonld", all.@"application/ld+json" }, + .{ "jsonml", all.@"application/jsonml+json" }, + .{ "jsx", all.@"text/jsx" }, + .{ "jxr", all.@"image/jxr" }, + .{ "jxra", all.@"image/jxra" }, + .{ "jxrs", all.@"image/jxrs" }, + .{ "jxs", all.@"image/jxs" }, + .{ "jxsc", all.@"image/jxsc" }, + .{ "jxsi", all.@"image/jxsi" }, + .{ "jxss", all.@"image/jxss" }, + .{ "kar", all.@"audio/midi" }, + .{ "karbon", all.@"application/vnd.kde.karbon" }, + .{ "kdbx", all.@"application/x-keepass2" }, + .{ "key", all.@"application/x-iwork-keynote-sffkey" }, + .{ "kfo", all.@"application/vnd.kde.kformula" }, + .{ "kia", all.@"application/vnd.kidspiration" }, + .{ "kml", all.@"application/vnd.google-earth.kml+xml" }, + .{ "kmz", all.@"application/vnd.google-earth.kmz" }, + .{ "kne", all.@"application/vnd.kinar" }, + .{ "knp", all.@"application/vnd.kinar" }, + .{ "kon", all.@"application/vnd.kde.kontour" }, + .{ "kpr", all.@"application/vnd.kde.kpresenter" }, + .{ "kpt", all.@"application/vnd.kde.kpresenter" }, + .{ "kpxx", all.@"application/vnd.ds-keypoint" }, + .{ "ksp", all.@"application/vnd.kde.kspread" }, + .{ "ktr", all.@"application/vnd.kahootz" }, + .{ "ktx", all.@"image/ktx" }, + .{ "ktx2", all.@"image/ktx2" }, + .{ "ktz", all.@"application/vnd.kahootz" }, + .{ "kwd", all.@"application/vnd.kde.kword" }, + .{ "kwt", all.@"application/vnd.kde.kword" }, + .{ "lasxml", all.@"application/vnd.las.las+xml" }, + .{ "latex", all.@"application/x-latex" }, + .{ "lbd", all.@"application/vnd.llamagraphics.life-balance.desktop" }, + .{ "lbe", all.@"application/vnd.llamagraphics.life-balance.exchange+xml" }, + .{ "les", all.@"application/vnd.hhe.lesson-player" }, + .{ "less", all.@"text/less" }, + .{ "lgr", all.@"application/lgr+xml" }, + .{ "lha", all.@"application/x-lzh-compressed" }, + .{ "link66", all.@"application/vnd.route66.link66+xml" }, + .{ "list", all.@"text/plain" }, + .{ "list3820", all.@"application/vnd.ibm.modcap" }, + .{ "listafp", all.@"application/vnd.ibm.modcap" }, + .{ "litcoffee", all.@"text/coffeescript" }, + .{ "lnk", all.@"application/x-ms-shortcut" }, + .{ "log", all.@"text/plain" }, + .{ "lostxml", all.@"application/lost+xml" }, + .{ "lrf", all.@"application/octet-stream" }, + .{ "lrm", all.@"application/vnd.ms-lrm" }, + .{ "ltf", all.@"application/vnd.frogans.ltf" }, + .{ "lua", all.@"text/x-lua" }, + .{ "luac", all.@"application/x-lua-bytecode" }, + .{ "lvp", all.@"audio/vnd.lucent.voice" }, + .{ "lwp", all.@"application/vnd.lotus-wordpro" }, + .{ "lzh", all.@"application/x-lzh-compressed" }, + .{ "m13", all.@"application/x-msmediaview" }, + .{ "m14", all.@"application/x-msmediaview" }, + .{ "m1v", all.@"video/mpeg" }, + .{ "m21", all.@"application/mp21" }, + .{ "m2a", all.@"audio/mpeg" }, + .{ "m2v", all.@"video/mpeg" }, + .{ "m3a", all.@"audio/mpeg" }, + .{ "m3u", all.@"audio/x-mpegurl" }, + .{ "m3u8", all.@"application/vnd.apple.mpegurl" }, + .{ "m4a", all.@"audio/x-m4a" }, + .{ "m4p", all.@"application/mp4" }, + .{ "m4s", all.@"video/iso.segment" }, + .{ "m4u", all.@"video/vnd.mpegurl" }, + .{ "m4v", all.@"video/x-m4v" }, + .{ "ma", all.@"application/mathematica" }, + .{ "mads", all.@"application/mads+xml" }, + .{ "maei", all.@"application/mmt-aei+xml" }, + .{ "mag", all.@"application/vnd.ecowin.chart" }, + .{ "maker", all.@"application/vnd.framemaker" }, + .{ "man", all.@"text/troff" }, + .{ "manifest", all.@"text/cache-manifest" }, + .{ "map", all.@"application/json" }, + .{ "mar", all.@"application/octet-stream" }, + .{ "markdown", all.@"text/markdown" }, + .{ "mathml", all.@"application/mathml+xml" }, + .{ "mb", all.@"application/mathematica" }, + .{ "mbk", all.@"application/vnd.mobius.mbk" }, + .{ "mbox", all.@"application/mbox" }, + .{ "mc1", all.@"application/vnd.medcalcdata" }, + .{ "mcd", all.@"application/vnd.mcd" }, + .{ "mcurl", all.@"text/vnd.curl.mcurl" }, + .{ "md", all.@"text/markdown" }, + .{ "mdb", all.@"application/x-msaccess" }, + .{ "mdi", all.@"image/vnd.ms-modi" }, + .{ "mdx", all.@"text/mdx" }, + .{ "me", all.@"text/troff" }, + .{ "mesh", all.@"model/mesh" }, + .{ "meta4", all.@"application/metalink4+xml" }, + .{ "metalink", all.@"application/metalink+xml" }, + .{ "mets", all.@"application/mets+xml" }, + .{ "mfm", all.@"application/vnd.mfmp" }, + .{ "mft", all.@"application/rpki-manifest" }, + .{ "mgp", all.@"application/vnd.osgeo.mapguide.package" }, + .{ "mgz", all.@"application/vnd.proteus.magazine" }, + .{ "mid", all.@"audio/midi" }, + .{ "midi", all.@"audio/midi" }, + .{ "mie", all.@"application/x-mie" }, + .{ "mif", all.@"application/vnd.mif" }, + .{ "mime", all.@"message/rfc822" }, + .{ "mj2", all.@"video/mj2" }, + .{ "mjp2", all.@"video/mj2" }, + .{ "mjs", all.@"application/javascript" }, + .{ "mk3d", all.@"video/x-matroska" }, + .{ "mka", all.@"audio/x-matroska" }, + .{ "mkd", all.@"text/x-markdown" }, + .{ "mks", all.@"video/x-matroska" }, + .{ "mkv", all.@"video/x-matroska" }, + .{ "mlp", all.@"application/vnd.dolby.mlp" }, + .{ "mmd", all.@"application/vnd.chipnuts.karaoke-mmd" }, + .{ "mmf", all.@"application/vnd.smaf" }, + .{ "mml", all.@"text/mathml" }, + .{ "mmr", all.@"image/vnd.fujixerox.edmics-mmr" }, + .{ "mng", all.@"video/x-mng" }, + .{ "mny", all.@"application/x-msmoney" }, + .{ "mobi", all.@"application/x-mobipocket-ebook" }, + .{ "mods", all.@"application/mods+xml" }, + .{ "mov", all.@"video/quicktime" }, + .{ "movie", all.@"video/x-sgi-movie" }, + .{ "mp2", all.@"audio/mpeg" }, + .{ "mp21", all.@"application/mp21" }, + .{ "mp2a", all.@"audio/mpeg" }, + .{ "mp3", all.@"audio/mpeg" }, + .{ "mp4", all.@"video/mp4" }, + .{ "mp4a", all.@"audio/mp4" }, + .{ "mp4s", all.@"application/mp4" }, + .{ "mp4v", all.@"video/mp4" }, + .{ "mpc", all.@"application/vnd.mophun.certificate" }, + .{ "mpd", all.@"application/dash+xml" }, + .{ "mpe", all.@"video/mpeg" }, + .{ "mpeg", all.@"video/mpeg" }, + .{ "mpf", all.@"application/media-policy-dataset+xml" }, + .{ "mpg", all.@"video/mpeg" }, + .{ "mpg4", all.@"video/mp4" }, + .{ "mpga", all.@"audio/mpeg" }, + .{ "mpkg", all.@"application/vnd.apple.installer+xml" }, + .{ "mpm", all.@"application/vnd.blueice.multipass" }, + .{ "mpn", all.@"application/vnd.mophun.application" }, + .{ "mpp", all.@"application/vnd.ms-project" }, + .{ "mpt", all.@"application/vnd.ms-project" }, + .{ "mpy", all.@"application/vnd.ibm.minipay" }, + .{ "mqy", all.@"application/vnd.mobius.mqy" }, + .{ "mrc", all.@"application/marc" }, + .{ "mrcx", all.@"application/marcxml+xml" }, + .{ "ms", all.@"text/troff" }, + .{ "mscml", all.@"application/mediaservercontrol+xml" }, + .{ "mseed", all.@"application/vnd.fdsn.mseed" }, + .{ "mseq", all.@"application/vnd.mseq" }, + .{ "msf", all.@"application/vnd.epson.msf" }, + .{ "msg", all.@"application/vnd.ms-outlook" }, + .{ "msh", all.@"model/mesh" }, + .{ "msi", all.@"application/x-msdownload" }, + .{ "msl", all.@"application/vnd.mobius.msl" }, + .{ "msm", all.@"application/octet-stream" }, + .{ "msp", all.@"application/octet-stream" }, + .{ "msty", all.@"application/vnd.muvee.style" }, + .{ "mtl", all.@"model/mtl" }, + .{ "mts", all.@"model/vnd.mts" }, + .{ "mtsx", all.@"application/javascript" }, + .{ "mus", all.@"application/vnd.musician" }, + .{ "musd", all.@"application/mmt-usd+xml" }, + .{ "musicxml", all.@"application/vnd.recordare.musicxml+xml" }, + .{ "mvb", all.@"application/x-msmediaview" }, + .{ "mvt", all.@"application/vnd.mapbox-vector-tile" }, + .{ "mwf", all.@"application/vnd.mfer" }, + .{ "mxf", all.@"application/mxf" }, + .{ "mxl", all.@"application/vnd.recordare.musicxml" }, + .{ "mxmf", all.@"audio/mobile-xmf" }, + .{ "mxml", all.@"application/xv+xml" }, + .{ "mxs", all.@"application/vnd.triscape.mxs" }, + .{ "mxu", all.@"video/vnd.mpegurl" }, + .{ "n-g", all.@"application/vnd.nokia.n-gage.symbian.install" }, + .{ "n3", all.@"text/n3" }, + .{ "nb", all.@"application/mathematica" }, + .{ "nbp", all.@"application/vnd.wolfram.player" }, + .{ "nc", all.@"application/x-netcdf" }, + .{ "ncx", all.@"application/x-dtbncx+xml" }, + .{ "nfo", all.@"text/x-nfo" }, + .{ "ngdat", all.@"application/vnd.nokia.n-gage.data" }, + .{ "nitf", all.@"application/vnd.nitf" }, + .{ "nlu", all.@"application/vnd.neurolanguage.nlu" }, + .{ "nml", all.@"application/vnd.enliven" }, + .{ "nnd", all.@"application/vnd.noblenet-directory" }, + .{ "nns", all.@"application/vnd.noblenet-sealer" }, + .{ "nnw", all.@"application/vnd.noblenet-web" }, + .{ "npx", all.@"image/vnd.net-fpx" }, + .{ "nq", all.@"application/n-quads" }, + .{ "nsc", all.@"application/x-conference" }, + .{ "nsf", all.@"application/vnd.lotus-notes" }, + .{ "nt", all.@"application/n-triples" }, + .{ "ntf", all.@"application/vnd.nitf" }, + .{ "numbers", all.@"application/x-iwork-numbers-sffnumbers" }, + .{ "nzb", all.@"application/x-nzb" }, + .{ "oa2", all.@"application/vnd.fujitsu.oasys2" }, + .{ "oa3", all.@"application/vnd.fujitsu.oasys3" }, + .{ "oas", all.@"application/vnd.fujitsu.oasys" }, + .{ "obd", all.@"application/x-msbinder" }, + .{ "obgx", all.@"application/vnd.openblox.game+xml" }, + .{ "obj", all.@"model/obj" }, + .{ "oda", all.@"application/oda" }, + .{ "odb", all.@"application/vnd.oasis.opendocument.database" }, + .{ "odc", all.@"application/vnd.oasis.opendocument.chart" }, + .{ "odf", all.@"application/vnd.oasis.opendocument.formula" }, + .{ "odft", all.@"application/vnd.oasis.opendocument.formula-template" }, + .{ "odg", all.@"application/vnd.oasis.opendocument.graphics" }, + .{ "odi", all.@"application/vnd.oasis.opendocument.image" }, + .{ "odm", all.@"application/vnd.oasis.opendocument.text-master" }, + .{ "odp", all.@"application/vnd.oasis.opendocument.presentation" }, + .{ "ods", all.@"application/vnd.oasis.opendocument.spreadsheet" }, + .{ "odt", all.@"application/vnd.oasis.opendocument.text" }, + .{ "oga", all.@"audio/ogg" }, + .{ "ogex", all.@"model/vnd.opengex" }, + .{ "ogg", all.@"audio/ogg" }, + .{ "ogv", all.@"video/ogg" }, + .{ "ogx", all.@"application/ogg" }, + .{ "omdoc", all.@"application/omdoc+xml" }, + .{ "onepkg", all.@"application/onenote" }, + .{ "onetmp", all.@"application/onenote" }, + .{ "onetoc", all.@"application/onenote" }, + .{ "onetoc2", all.@"application/onenote" }, + .{ "opf", all.@"application/oebps-package+xml" }, + .{ "opml", all.@"text/x-opml" }, + .{ "oprc", all.@"application/vnd.palm" }, + .{ "opus", all.@"audio/ogg" }, + .{ "org", all.@"text/x-org" }, + .{ "osf", all.@"application/vnd.yamaha.openscoreformat" }, + .{ "osfpvg", all.@"application/vnd.yamaha.openscoreformat.osfpvg+xml" }, + .{ "osm", all.@"application/vnd.openstreetmap.data+xml" }, + .{ "otc", all.@"application/vnd.oasis.opendocument.chart-template" }, + .{ "otf", all.@"font/otf" }, + .{ "otg", all.@"application/vnd.oasis.opendocument.graphics-template" }, + .{ "oth", all.@"application/vnd.oasis.opendocument.text-web" }, + .{ "oti", all.@"application/vnd.oasis.opendocument.image-template" }, + .{ "otp", all.@"application/vnd.oasis.opendocument.presentation-template" }, + .{ "ots", all.@"application/vnd.oasis.opendocument.spreadsheet-template" }, + .{ "ott", all.@"application/vnd.oasis.opendocument.text-template" }, + .{ "ova", all.@"application/x-virtualbox-ova" }, + .{ "ovf", all.@"application/x-virtualbox-ovf" }, + .{ "owl", all.@"application/rdf+xml" }, + .{ "oxps", all.@"application/oxps" }, + .{ "oxt", all.@"application/vnd.openofficeorg.extension" }, + .{ "p", all.@"text/x-pascal" }, + .{ "p10", all.@"application/pkcs10" }, + .{ "p12", all.@"application/x-pkcs12" }, + .{ "p7b", all.@"application/x-pkcs7-certificates" }, + .{ "p7c", all.@"application/pkcs7-mime" }, + .{ "p7m", all.@"application/pkcs7-mime" }, + .{ "p7r", all.@"application/x-pkcs7-certreqresp" }, + .{ "p7s", all.@"application/pkcs7-signature" }, + .{ "p8", all.@"application/pkcs8" }, + .{ "pac", all.@"application/x-ns-proxy-autoconfig" }, + .{ "pages", all.@"application/x-iwork-pages-sffpages" }, + .{ "pas", all.@"text/x-pascal" }, + .{ "paw", all.@"application/vnd.pawaafile" }, + .{ "pbd", all.@"application/vnd.powerbuilder6" }, + .{ "pbm", all.@"image/x-portable-bitmap" }, + .{ "pcap", all.@"application/vnd.tcpdump.pcap" }, + .{ "pcf", all.@"application/x-font-pcf" }, + .{ "pcl", all.@"application/vnd.hp-pcl" }, + .{ "pclxl", all.@"application/vnd.hp-pclxl" }, + .{ "pct", all.@"image/x-pict" }, + .{ "pcurl", all.@"application/vnd.curl.pcurl" }, + .{ "pcx", all.@"image/x-pcx" }, + .{ "pdb", all.@"application/x-pilot" }, + .{ "pde", all.@"text/x-processing" }, + .{ "pdf", all.@"application/pdf" }, + .{ "pem", all.@"application/x-x509-ca-cert" }, + .{ "pfa", all.@"application/x-font-type1" }, + .{ "pfb", all.@"application/x-font-type1" }, + .{ "pfm", all.@"application/x-font-type1" }, + .{ "pfr", all.@"application/font-tdpfr" }, + .{ "pfx", all.@"application/x-pkcs12" }, + .{ "pgm", all.@"image/x-portable-graymap" }, + .{ "pgn", all.@"application/x-chess-pgn" }, + .{ "pgp", all.@"application/pgp-encrypted" }, + .{ "php", all.@"application/x-httpd-php" }, + .{ "pic", all.@"image/x-pict" }, + .{ "pkg", all.@"application/octet-stream" }, + .{ "pki", all.@"application/pkixcmp" }, + .{ "pkipath", all.@"application/pkix-pkipath" }, + .{ "pkpass", all.@"application/vnd.apple.pkpass" }, + .{ "pl", all.@"application/x-perl" }, + .{ "plb", all.@"application/vnd.3gpp.pic-bw-large" }, + .{ "plc", all.@"application/vnd.mobius.plc" }, + .{ "plf", all.@"application/vnd.pocketlearn" }, + .{ "pls", all.@"application/pls+xml" }, + .{ "pm", all.@"application/x-perl" }, + .{ "pml", all.@"application/vnd.ctc-posml" }, + .{ "png", all.@"image/png" }, + .{ "pnm", all.@"image/x-portable-anymap" }, + .{ "portpkg", all.@"application/vnd.macports.portpkg" }, + .{ "pot", all.@"application/vnd.ms-powerpoint" }, + .{ "potm", all.@"application/vnd.ms-powerpoint.template.macroenabled.12" }, + .{ "potx", all.@"application/vnd.openxmlformats-officedocument.presentationml.template" }, + .{ "ppam", all.@"application/vnd.ms-powerpoint.addin.macroenabled.12" }, + .{ "ppd", all.@"application/vnd.cups-ppd" }, + .{ "ppm", all.@"image/x-portable-pixmap" }, + .{ "pps", all.@"application/vnd.ms-powerpoint" }, + .{ "ppsm", all.@"application/vnd.ms-powerpoint.slideshow.macroenabled.12" }, + .{ + "ppsx", + all.@"application/vnd.openxmlformats-officedocument.presentationml.slideshow", + }, + .{ "ppt", all.@"application/vnd.ms-powerpoint" }, + .{ "pptm", all.@"application/vnd.ms-powerpoint.presentation.macroenabled.12" }, + .{ + "pptx", + all.@"application/vnd.openxmlformats-officedocument.presentationml.presentation", + }, + .{ "pqa", all.@"application/vnd.palm" }, + .{ "prc", all.@"model/prc" }, + .{ "pre", all.@"application/vnd.lotus-freelance" }, + .{ "prf", all.@"application/pics-rules" }, + .{ "provx", all.@"application/provenance+xml" }, + .{ "ps", all.@"application/postscript" }, + .{ "psb", all.@"application/vnd.3gpp.pic-bw-small" }, + .{ "psd", all.@"image/vnd.adobe.photoshop" }, + .{ "psf", all.@"application/x-font-linux-psf" }, + .{ "pskcxml", all.@"application/pskc+xml" }, + .{ "pti", all.@"image/prs.pti" }, + .{ "ptid", all.@"application/vnd.pvi.ptid1" }, + .{ "pub", all.@"application/x-mspublisher" }, + .{ "pvb", all.@"application/vnd.3gpp.pic-bw-var" }, + .{ "pwn", all.@"application/vnd.3m.post-it-notes" }, + .{ "pya", all.@"audio/vnd.ms-playready.media.pya" }, + .{ "pyv", all.@"video/vnd.ms-playready.media.pyv" }, + .{ "qam", all.@"application/vnd.epson.quickanime" }, + .{ "qbo", all.@"application/vnd.intu.qbo" }, + .{ "qfx", all.@"application/vnd.intu.qfx" }, + .{ "qps", all.@"application/vnd.publishare-delta-tree" }, + .{ "qt", all.@"video/quicktime" }, + .{ "qwd", all.@"application/vnd.quark.quarkxpress" }, + .{ "qwt", all.@"application/vnd.quark.quarkxpress" }, + .{ "qxb", all.@"application/vnd.quark.quarkxpress" }, + .{ "qxd", all.@"application/vnd.quark.quarkxpress" }, + .{ "qxl", all.@"application/vnd.quark.quarkxpress" }, + .{ "qxt", all.@"application/vnd.quark.quarkxpress" }, + .{ "ra", all.@"audio/x-realaudio" }, + .{ "ram", all.@"audio/x-pn-realaudio" }, + .{ "raml", all.@"application/raml+yaml" }, + .{ "rapd", all.@"application/route-apd+xml" }, + .{ "rar", all.@"application/x-rar-compressed" }, + .{ "ras", all.@"image/x-cmu-raster" }, + .{ "rcprofile", all.@"application/vnd.ipunplugged.rcprofile" }, + .{ "rdf", all.@"application/rdf+xml" }, + .{ "rdz", all.@"application/vnd.data-vision.rdz" }, + .{ "relo", all.@"application/p2p-overlay+xml" }, + .{ "rep", all.@"application/vnd.businessobjects" }, + .{ "res", all.@"application/x-dtbresource+xml" }, + .{ "rgb", all.@"image/x-rgb" }, + .{ "rif", all.@"application/reginfo+xml" }, + .{ "rip", all.@"audio/vnd.rip" }, + .{ "ris", all.@"application/x-research-info-systems" }, + .{ "rl", all.@"application/resource-lists+xml" }, + .{ "rlc", all.@"image/vnd.fujixerox.edmics-rlc" }, + .{ "rld", all.@"application/resource-lists-diff+xml" }, + .{ "rm", all.@"application/vnd.rn-realmedia" }, + .{ "rmi", all.@"audio/midi" }, + .{ "rmp", all.@"audio/x-pn-realaudio-plugin" }, + .{ "rms", all.@"application/vnd.jcp.javame.midlet-rms" }, + .{ "rmvb", all.@"application/vnd.rn-realmedia-vbr" }, + .{ "rnc", all.@"application/relax-ng-compact-syntax" }, + .{ "rng", all.@"application/xml" }, + .{ "roa", all.@"application/rpki-roa" }, + .{ "roff", all.@"text/troff" }, + .{ "rp9", all.@"application/vnd.cloanto.rp9" }, + .{ "rpm", all.@"application/x-redhat-package-manager" }, + .{ "rpss", all.@"application/vnd.nokia.radio-presets" }, + .{ "rpst", all.@"application/vnd.nokia.radio-preset" }, + .{ "rq", all.@"application/sparql-query" }, + .{ "rs", all.@"application/rls-services+xml" }, + .{ "rsat", all.@"application/atsc-rsat+xml" }, + .{ "rsd", all.@"application/rsd+xml" }, + .{ "rsheet", all.@"application/urc-ressheet+xml" }, + .{ "rss", all.@"application/rss+xml" }, + .{ "rtf", all.@"text/rtf" }, + .{ "rtx", all.@"text/richtext" }, + .{ "run", all.@"application/x-makeself" }, + .{ "rusd", all.@"application/route-usd+xml" }, + .{ "s", all.@"text/x-asm" }, + .{ "s3m", all.@"audio/s3m" }, + .{ "saf", all.@"application/vnd.yamaha.smaf-audio" }, + .{ "sass", all.@"text/x-sass" }, + .{ "sbml", all.@"application/sbml+xml" }, + .{ "sc", all.@"application/vnd.ibm.secure-container" }, + .{ "scd", all.@"application/x-msschedule" }, + .{ "scm", all.@"application/vnd.lotus-screencam" }, + .{ "scq", all.@"application/scvp-cv-request" }, + .{ "scs", all.@"application/scvp-cv-response" }, + .{ "scss", all.@"text/x-scss" }, + .{ "scurl", all.@"text/vnd.curl.scurl" }, + .{ "sda", all.@"application/vnd.stardivision.draw" }, + .{ "sdc", all.@"application/vnd.stardivision.calc" }, + .{ "sdd", all.@"application/vnd.stardivision.impress" }, + .{ "sdkd", all.@"application/vnd.solent.sdkm+xml" }, + .{ "sdkm", all.@"application/vnd.solent.sdkm+xml" }, + .{ "sdp", all.@"application/sdp" }, + .{ "sdw", all.@"application/vnd.stardivision.writer" }, + .{ "sea", all.@"application/x-sea" }, + .{ "see", all.@"application/vnd.seemail" }, + .{ "seed", all.@"application/vnd.fdsn.seed" }, + .{ "sema", all.@"application/vnd.sema" }, + .{ "semd", all.@"application/vnd.semd" }, + .{ "semf", all.@"application/vnd.semf" }, + .{ "senmlx", all.@"application/senml+xml" }, + .{ "sensmlx", all.@"application/sensml+xml" }, + .{ "ser", all.@"application/java-serialized-object" }, + .{ "setpay", all.@"application/set-payment-initiation" }, + .{ "setreg", all.@"application/set-registration-initiation" }, + .{ "sfd-h", all.@"application/vnd.hydrostatix.sof-data" }, + .{ "sfs", all.@"application/vnd.spotfire.sfs" }, + .{ "sfv", all.@"text/x-sfv" }, + .{ "sgi", all.@"image/sgi" }, + .{ "sgl", all.@"application/vnd.stardivision.writer-global" }, + .{ "sgm", all.@"text/sgml" }, + .{ "sgml", all.@"text/sgml" }, + .{ "sh", all.@"application/x-sh" }, + .{ "shar", all.@"application/x-shar" }, + .{ "shex", all.@"text/shex" }, + .{ "shf", all.@"application/shf+xml" }, + .{ "shtml", all.@"text/html" }, + .{ "sid", all.@"image/x-mrsid-image" }, + .{ "sieve", all.@"application/sieve" }, + .{ "sig", all.@"application/pgp-signature" }, + .{ "sil", all.@"audio/silk" }, + .{ "silo", all.@"model/mesh" }, + .{ "sis", all.@"application/vnd.symbian.install" }, + .{ "sisx", all.@"application/vnd.symbian.install" }, + .{ "sit", all.@"application/x-stuffit" }, + .{ "sitx", all.@"application/x-stuffitx" }, + .{ "siv", all.@"application/sieve" }, + .{ "skd", all.@"application/vnd.koan" }, + .{ "skm", all.@"application/vnd.koan" }, + .{ "skp", all.@"application/vnd.koan" }, + .{ "skt", all.@"application/vnd.koan" }, + .{ "sldm", all.@"application/vnd.ms-powerpoint.slide.macroenabled.12" }, + .{ "sldx", all.@"application/vnd.openxmlformats-officedocument.presentationml.slide" }, + .{ "slim", all.@"text/slim" }, + .{ "slm", all.@"text/slim" }, + .{ "sls", all.@"application/route-s-tsid+xml" }, + .{ "slt", all.@"application/vnd.epson.salt" }, + .{ "sm", all.@"application/vnd.stepmania.stepchart" }, + .{ "smf", all.@"application/vnd.stardivision.math" }, + .{ "smi", all.@"application/smil+xml" }, + .{ "smil", all.@"application/smil+xml" }, + .{ "smv", all.@"video/x-smv" }, + .{ "smzip", all.@"application/vnd.stepmania.package" }, + .{ "snd", all.@"audio/basic" }, + .{ "snf", all.@"application/x-font-snf" }, + .{ "so", all.@"application/octet-stream" }, + .{ "spc", all.@"application/x-pkcs7-certificates" }, + .{ "spdx", all.@"text/spdx" }, + .{ "spf", all.@"application/vnd.yamaha.smaf-phrase" }, + .{ "spl", all.@"application/x-futuresplash" }, + .{ "spot", all.@"text/vnd.in3d.spot" }, + .{ "spp", all.@"application/scvp-vp-response" }, + .{ "spq", all.@"application/scvp-vp-request" }, + .{ "spx", all.@"audio/ogg" }, + .{ "sql", all.@"application/x-sql" }, + .{ "src", all.@"application/x-wais-source" }, + .{ "srt", all.@"application/x-subrip" }, + .{ "sru", all.@"application/sru+xml" }, + .{ "srx", all.@"application/sparql-results+xml" }, + .{ "ssdl", all.@"application/ssdl+xml" }, + .{ "sse", all.@"application/vnd.kodak-descriptor" }, + .{ "ssf", all.@"application/vnd.epson.ssf" }, + .{ "ssml", all.@"application/ssml+xml" }, + .{ "st", all.@"application/vnd.sailingtracker.track" }, + .{ "stc", all.@"application/vnd.sun.xml.calc.template" }, + .{ "std", all.@"application/vnd.sun.xml.draw.template" }, + .{ "stf", all.@"application/vnd.wt.stf" }, + .{ "sti", all.@"application/vnd.sun.xml.impress.template" }, + .{ "stk", all.@"application/hyperstudio" }, + .{ "stl", all.@"model/stl" }, + .{ "stpx", all.@"model/step+xml" }, + .{ "stpxz", all.@"model/step-xml+zip" }, + .{ "stpz", all.@"model/step+zip" }, + .{ "str", all.@"application/vnd.pg.format" }, + .{ "stw", all.@"application/vnd.sun.xml.writer.template" }, + .{ "styl", all.@"text/stylus" }, + .{ "stylus", all.@"text/stylus" }, + .{ "sub", all.@"text/vnd.dvb.subtitle" }, + .{ "sus", all.@"application/vnd.sus-calendar" }, + .{ "susp", all.@"application/vnd.sus-calendar" }, + .{ "sv4cpio", all.@"application/x-sv4cpio" }, + .{ "sv4crc", all.@"application/x-sv4crc" }, + .{ "svc", all.@"application/vnd.dvb.service" }, + .{ "svd", all.@"application/vnd.svd" }, + .{ "svg", all.@"image/svg+xml" }, + .{ "svgz", all.@"image/svg+xml" }, + .{ "swa", all.@"application/x-director" }, + .{ "swf", all.@"application/x-shockwave-flash" }, + .{ "swi", all.@"application/vnd.aristanetworks.swi" }, + .{ "swidtag", all.@"application/swid+xml" }, + .{ "sxc", all.@"application/vnd.sun.xml.calc" }, + .{ "sxd", all.@"application/vnd.sun.xml.draw" }, + .{ "sxg", all.@"application/vnd.sun.xml.writer.global" }, + .{ "sxi", all.@"application/vnd.sun.xml.impress" }, + .{ "sxm", all.@"application/vnd.sun.xml.math" }, + .{ "sxw", all.@"application/vnd.sun.xml.writer" }, + .{ "t", all.@"text/troff" }, + .{ "t3", all.@"application/x-t3vm-image" }, + .{ "t38", all.@"image/t38" }, + .{ "taglet", all.@"application/vnd.mynfc" }, + .{ "tao", all.@"application/vnd.tao.intent-module-archive" }, + .{ "tap", all.@"image/vnd.tencent.tap" }, + .{ "tar", all.@"application/x-tar" }, + .{ "tcap", all.@"application/vnd.3gpp2.tcap" }, + .{ "tcl", all.@"application/x-tcl" }, + .{ "td", all.@"application/urc-targetdesc+xml" }, + .{ "teacher", all.@"application/vnd.smart.teacher" }, + .{ "tei", all.@"application/tei+xml" }, + .{ "teicorpus", all.@"application/tei+xml" }, + .{ "tex", all.@"application/x-tex" }, + .{ "texi", all.@"application/x-texinfo" }, + .{ "texinfo", all.@"application/x-texinfo" }, + .{ "text", all.@"text/plain" }, + .{ "tfi", all.@"application/thraud+xml" }, + .{ "tfm", all.@"application/x-tex-tfm" }, + .{ "tfx", all.@"image/tiff-fx" }, + .{ "tga", all.@"image/x-tga" }, + .{ "thmx", all.@"application/vnd.ms-officetheme" }, + .{ "tif", all.@"image/tiff" }, + .{ "tiff", all.@"image/tiff" }, + .{ "tk", all.@"application/x-tcl" }, + .{ "tmo", all.@"application/vnd.tmobile-livetv" }, + .{ "toml", all.@"application/toml" }, + .{ "torrent", all.@"application/x-bittorrent" }, + .{ "tpl", all.@"application/vnd.groove-tool-template" }, + .{ "tpt", all.@"application/vnd.trid.tpt" }, + .{ "tr", all.@"text/troff" }, + .{ "tra", all.@"application/vnd.trueapp" }, + .{ "trig", all.@"application/trig" }, + .{ "trm", all.@"application/x-msterminal" }, + .{ "ts", all.@"video/mp2t" }, + .{ "tsd", all.@"application/timestamped-data" }, + .{ "tsv", all.@"text/tab-separated-values" }, + .{ "tsx", all.@"application/javascript" }, + .{ "ttc", all.@"font/collection" }, + .{ "ttf", all.@"font/ttf" }, + .{ "ttl", all.@"text/turtle" }, + .{ "ttml", all.@"application/ttml+xml" }, + .{ "twd", all.@"application/vnd.simtech-mindmapper" }, + .{ "twds", all.@"application/vnd.simtech-mindmapper" }, + .{ "txd", all.@"application/vnd.genomatix.tuxedo" }, + .{ "txf", all.@"application/vnd.mobius.txf" }, + .{ "txt", all.@"text/plain" }, + .{ "u32", all.@"application/x-authorware-bin" }, + .{ "u3d", all.@"model/u3d" }, + .{ "u8dsn", all.@"message/global-delivery-status" }, + .{ "u8hdr", all.@"message/global-headers" }, + .{ "u8mdn", all.@"message/global-disposition-notification" }, + .{ "u8msg", all.@"message/global" }, + .{ "ubj", all.@"application/ubjson" }, + .{ "udeb", all.@"application/x-debian-package" }, + .{ "ufd", all.@"application/vnd.ufdl" }, + .{ "ufdl", all.@"application/vnd.ufdl" }, + .{ "ulx", all.@"application/x-glulx" }, + .{ "umj", all.@"application/vnd.umajin" }, + .{ "unityweb", all.@"application/vnd.unity" }, + .{ "uoml", all.@"application/vnd.uoml+xml" }, + .{ "uri", all.@"text/uri-list" }, + .{ "uris", all.@"text/uri-list" }, + .{ "urls", all.@"text/uri-list" }, + .{ "usdz", all.@"model/vnd.usdz+zip" }, + .{ "ustar", all.@"application/x-ustar" }, + .{ "utz", all.@"application/vnd.uiq.theme" }, + .{ "uu", all.@"text/x-uuencode" }, + .{ "uva", all.@"audio/vnd.dece.audio" }, + .{ "uvd", all.@"application/vnd.dece.data" }, + .{ "uvf", all.@"application/vnd.dece.data" }, + .{ "uvg", all.@"image/vnd.dece.graphic" }, + .{ "uvh", all.@"video/vnd.dece.hd" }, + .{ "uvi", all.@"image/vnd.dece.graphic" }, + .{ "uvm", all.@"video/vnd.dece.mobile" }, + .{ "uvp", all.@"video/vnd.dece.pd" }, + .{ "uvs", all.@"video/vnd.dece.sd" }, + .{ "uvt", all.@"application/vnd.dece.ttml+xml" }, + .{ "uvu", all.@"video/vnd.uvvu.mp4" }, + .{ "uvv", all.@"video/vnd.dece.video" }, + .{ "uvva", all.@"audio/vnd.dece.audio" }, + .{ "uvvd", all.@"application/vnd.dece.data" }, + .{ "uvvf", all.@"application/vnd.dece.data" }, + .{ "uvvg", all.@"image/vnd.dece.graphic" }, + .{ "uvvh", all.@"video/vnd.dece.hd" }, + .{ "uvvi", all.@"image/vnd.dece.graphic" }, + .{ "uvvm", all.@"video/vnd.dece.mobile" }, + .{ "uvvp", all.@"video/vnd.dece.pd" }, + .{ "uvvs", all.@"video/vnd.dece.sd" }, + .{ "uvvt", all.@"application/vnd.dece.ttml+xml" }, + .{ "uvvu", all.@"video/vnd.uvvu.mp4" }, + .{ "uvvv", all.@"video/vnd.dece.video" }, + .{ "uvvx", all.@"application/vnd.dece.unspecified" }, + .{ "uvvz", all.@"application/vnd.dece.zip" }, + .{ "uvx", all.@"application/vnd.dece.unspecified" }, + .{ "uvz", all.@"application/vnd.dece.zip" }, + .{ "vbox-e", all.@"application/x-virtualbox-vbox-extpack" }, + .{ "vbox", all.@"application/x-virtualbox-vbox" }, + .{ "vcard", all.@"text/vcard" }, + .{ "vcd", all.@"application/x-cdlink" }, + .{ "vcf", all.@"text/x-vcard" }, + .{ "vcg", all.@"application/vnd.groove-vcard" }, + .{ "vcs", all.@"text/x-vcalendar" }, + .{ "vcx", all.@"application/vnd.vcx" }, + .{ "vdi", all.@"application/x-virtualbox-vdi" }, + .{ "vds", all.@"model/vnd.sap.vds" }, + .{ "vhd", all.@"application/x-virtualbox-vhd" }, + .{ "vis", all.@"application/vnd.visionary" }, + .{ "viv", all.@"video/vnd.vivo" }, + .{ "vmdk", all.@"application/x-virtualbox-vmdk" }, + .{ "vob", all.@"video/x-ms-vob" }, + .{ "vor", all.@"application/vnd.stardivision.writer" }, + .{ "vox", all.@"application/x-authorware-bin" }, + .{ "vrml", all.@"model/vrml" }, + .{ "vsd", all.@"application/vnd.visio" }, + .{ "vsf", all.@"application/vnd.vsf" }, + .{ "vss", all.@"application/vnd.visio" }, + .{ "vst", all.@"application/vnd.visio" }, + .{ "vsw", all.@"application/vnd.visio" }, + .{ "vtf", all.@"image/vnd.valve.source.texture" }, + .{ "vtt", all.@"text/vtt" }, + .{ "vtu", all.@"model/vnd.vtu" }, + .{ "vxml", all.@"application/voicexml+xml" }, + .{ "w3d", all.@"application/x-director" }, + .{ "wad", all.@"application/x-doom" }, + .{ "wadl", all.@"application/vnd.sun.wadl+xml" }, + .{ "war", all.@"application/java-archive" }, + .{ "wasm", all.@"application/webassembly" }, + .{ "wav", all.@"audio/x-wav" }, + .{ "wax", all.@"audio/x-ms-wax" }, + .{ "wbmp", all.@"image/vnd.wap.wbmp" }, + .{ "wbs", all.@"application/vnd.criticaltools.wbs+xml" }, + .{ "wbxml", all.@"application/vnd.wap.wbxml" }, + .{ "wcm", all.@"application/vnd.ms-works" }, + .{ "wdb", all.@"application/vnd.ms-works" }, + .{ "wdp", all.@"image/vnd.ms-photo" }, + .{ "weba", all.@"audio/webm" }, + .{ "webapp", all.@"application/x-web-app-manifest+json" }, + .{ "webm", all.@"video/webm" }, + .{ "webmanifest", all.@"application/manifest+json" }, + .{ "webp", all.@"image/webp" }, + .{ "wg", all.@"application/vnd.pmi.widget" }, + .{ "wgt", all.@"application/widget" }, + .{ "wif", all.@"application/watcherinfo+xml" }, + .{ "wks", all.@"application/vnd.ms-works" }, + .{ "wm", all.@"video/x-ms-wm" }, + .{ "wma", all.@"audio/x-ms-wma" }, + .{ "wmd", all.@"application/x-ms-wmd" }, + .{ "wmf", all.@"image/wmf" }, + .{ "wml", all.@"text/vnd.wap.wml" }, + .{ "wmlc", all.@"application/vnd.wap.wmlc" }, + .{ "wmls", all.@"text/vnd.wap.wmlscript" }, + .{ "wmlsc", all.@"application/vnd.wap.wmlscriptc" }, + .{ "wmv", all.@"video/x-ms-wmv" }, + .{ "wmx", all.@"video/x-ms-wmx" }, + .{ "wmz", all.@"application/x-msmetafile" }, + .{ "woff", all.@"font/woff" }, + .{ "woff2", all.@"font/woff2" }, + .{ "wpd", all.@"application/vnd.wordperfect" }, + .{ "wpl", all.@"application/vnd.ms-wpl" }, + .{ "wps", all.@"application/vnd.ms-works" }, + .{ "wqd", all.@"application/vnd.wqd" }, + .{ "wri", all.@"application/x-mswrite" }, + .{ "wrl", all.@"model/vrml" }, + .{ "wsc", all.@"message/vnd.wfa.wsc" }, + .{ "wsdl", all.@"application/wsdl+xml" }, + .{ "wspolicy", all.@"application/wspolicy+xml" }, + .{ "wtb", all.@"application/vnd.webturbo" }, + .{ "wvx", all.@"video/x-ms-wvx" }, + .{ "x_b", all.@"model/vnd.parasolid.transmit.binary" }, + .{ "x_t", all.@"model/vnd.parasolid.transmit.text" }, + .{ "x32", all.@"application/x-authorware-bin" }, + .{ "x3d", all.@"model/x3d+xml" }, + .{ "x3db", all.@"model/x3d+fastinfoset" }, + .{ "x3dbz", all.@"model/x3d+binary" }, + .{ "x3dv", all.@"model/x3d+vrml" }, + .{ "x3dvz", all.@"model/x3d+vrml" }, + .{ "x3dz", all.@"model/x3d+xml" }, + .{ "xaml", all.@"application/xaml+xml" }, + .{ "xap", all.@"application/x-silverlight-app" }, + .{ "xar", all.@"application/vnd.xara" }, + .{ "xav", all.@"application/xcap-att+xml" }, + .{ "xbap", all.@"application/x-ms-xbap" }, + .{ "xbd", all.@"application/vnd.fujixerox.docuworks.binder" }, + .{ "xbm", all.@"image/x-xbitmap" }, + .{ "xca", all.@"application/xcap-caps+xml" }, + .{ "xcs", all.@"application/calendar+xml" }, + .{ "xdf", all.@"application/xcap-diff+xml" }, + .{ "xdm", all.@"application/vnd.syncml.dm+xml" }, + .{ "xdp", all.@"application/vnd.adobe.xdp+xml" }, + .{ "xdssc", all.@"application/dssc+xml" }, + .{ "xdw", all.@"application/vnd.fujixerox.docuworks" }, + .{ "xel", all.@"application/xcap-el+xml" }, + .{ "xenc", all.@"application/xenc+xml" }, + .{ "xer", all.@"application/patch-ops-error+xml" }, + .{ "xfdf", all.@"application/vnd.adobe.xfdf" }, + .{ "xfdl", all.@"application/vnd.xfdl" }, + .{ "xht", all.@"application/xhtml+xml" }, + .{ "xhtml", all.@"application/xhtml+xml" }, + .{ "xhvml", all.@"application/xv+xml" }, + .{ "xif", all.@"image/vnd.xiff" }, + .{ "xla", all.@"application/vnd.ms-excel" }, + .{ "xlam", all.@"application/vnd.ms-excel.addin.macroenabled.12" }, + .{ "xlc", all.@"application/vnd.ms-excel" }, + .{ "xlf", all.@"application/xliff+xml" }, + .{ "xlm", all.@"application/vnd.ms-excel" }, + .{ "xls", all.@"application/vnd.ms-excel" }, + .{ "xlsb", all.@"application/vnd.ms-excel.sheet.binary.macroenabled.12" }, + .{ "xlsm", all.@"application/vnd.ms-excel.sheet.macroenabled.12" }, + .{ "xlsx", all.@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, + .{ "xlt", all.@"application/vnd.ms-excel" }, + .{ "xltm", all.@"application/vnd.ms-excel.template.macroenabled.12" }, + .{ + "xltx", + all.@"application/vnd.openxmlformats-officedocument.spreadsheetml.template", + }, + .{ "xlw", all.@"application/vnd.ms-excel" }, + .{ "xm", all.@"audio/xm" }, + .{ "xml", all.@"application/xml" }, + .{ "xns", all.@"application/xcap-ns+xml" }, + .{ "xo", all.@"application/vnd.olpc-sugar" }, + .{ "xop", all.@"application/xop+xml" }, + .{ "xpi", all.@"application/x-xpinstall" }, + .{ "xpl", all.@"application/xproc+xml" }, + .{ "xpm", all.@"image/x-xpixmap" }, + .{ "xpr", all.@"application/vnd.is-xpr" }, + .{ "xps", all.@"application/vnd.ms-xpsdocument" }, + .{ "xpw", all.@"application/vnd.intercon.formnet" }, + .{ "xpx", all.@"application/vnd.intercon.formnet" }, + .{ "xsd", all.@"application/xml" }, + .{ "xsl", all.@"application/xslt+xml" }, + .{ "xslt", all.@"application/xslt+xml" }, + .{ "xsm", all.@"application/vnd.syncml+xml" }, + .{ "xspf", all.@"application/xspf+xml" }, + .{ "xul", all.@"application/vnd.mozilla.xul+xml" }, + .{ "xvm", all.@"application/xv+xml" }, + .{ "xvml", all.@"application/xv+xml" }, + .{ "xwd", all.@"image/x-xwindowdump" }, + .{ "xyz", all.@"chemical/x-xyz" }, + .{ "xz", all.@"application/x-xz" }, + .{ "yaml", all.@"text/yaml" }, + .{ "yang", all.@"application/yang" }, + .{ "yin", all.@"application/yin+xml" }, + .{ "yml", all.@"text/yaml" }, + .{ "ymp", all.@"text/x-suse-ymp" }, + .{ "z1", all.@"application/x-zmachine" }, + .{ "z2", all.@"application/x-zmachine" }, + .{ "z3", all.@"application/x-zmachine" }, + .{ "z4", all.@"application/x-zmachine" }, + .{ "z5", all.@"application/x-zmachine" }, + .{ "z6", all.@"application/x-zmachine" }, + .{ "z7", all.@"application/x-zmachine" }, + .{ "z8", all.@"application/x-zmachine" }, + .{ "zaz", all.@"application/vnd.zzazz.deck+xml" }, + .{ "zip", all.@"application/zip" }, + .{ "zir", all.@"application/vnd.zul" }, + .{ "zirz", all.@"application/vnd.zul" }, + .{ "zmm", all.@"application/vnd.handheld-entertainment+xml" }, }); + +const IMAGES_HEADERS = .{ + .{ [_]u8{ 0x42, 0x4d }, all.@"image/bmp" }, + .{ [_]u8{ 0xff, 0xd8, 0xff }, all.@"image/jpeg" }, + .{ [_]u8{ 0x49, 0x49, 0x2a, 0x00 }, all.@"image/tiff" }, + .{ [_]u8{ 0x4d, 0x4d, 0x00, 0x2a }, all.@"image/tiff" }, + .{ [_]u8{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, all.@"image/gif" }, + .{ [_]u8{ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a }, all.@"image/png" }, +}; +pub fn sniff(bytes: []const u8) ?MimeType { + if (bytes.len < 2) return null; + + inline for (IMAGES_HEADERS) |header| { + if (bytes.len >= header[0].len) { + if (strings.eqlComptime(bytes[0..header[0].len], header[0])) { + return header[1]; + } + } + } + + return null; +} diff --git a/src/http/websocket.zig b/src/http/websocket.zig index 9fd5e212c..293c67757 100644 --- a/src/http/websocket.zig +++ b/src/http/websocket.zig @@ -65,11 +65,13 @@ pub const WebsocketHeader = packed struct { } pub fn packLength(length: usize) u7 { - return switch (length) { + var eight: u7 = 0; + eight = switch (length) { 0...126 => @truncate(u7, length), 127...0xFFFF => 126, else => 127, }; + return eight; } }; diff --git a/src/javascript/jsc/api/bun.zig b/src/javascript/jsc/api/bun.zig index f1a6e6c36..acb8daf2b 100644 --- a/src/javascript/jsc/api/bun.zig +++ b/src/javascript/jsc/api/bun.zig @@ -1035,8 +1035,8 @@ pub const Class = NewClass( .rfn = Bun.readAllStdinSync, .ts = d.ts{}, }, - .startServer = .{ - .rfn = Bun.startServer, + .serve = .{ + .rfn = Bun.serve, .ts = d.ts{}, }, .file = .{ @@ -1094,25 +1094,38 @@ pub const Class = NewClass( }, ); -pub fn startServer( +pub fn serve( _: void, ctx: js.JSContextRef, _: js.JSObjectRef, _: js.JSObjectRef, arguments: []const js.JSValueRef, - _: js.ExceptionRef, + exception: js.ExceptionRef, ) js.JSValueRef { - var vm = JSC.VirtualMachine.vm; - const handler = if (arguments.len > 0) JSC.JSValue.fromRef(arguments[0]) else JSC.JSValue.zero; - if (handler.isEmpty() or handler.isUndefinedOrNull() or !handler.isCell() or !handler.isCallable(ctx.ptr().vm())) { - Output.prettyWarnln("\"serverless\" export should be a function", .{}); - Output.flush(); - return JSC.JSValue.jsUndefined().asObjectRef(); + var args = JSC.Node.ArgumentsSlice.from(arguments); + var config = JSC.API.ServerConfig.fromJS(ctx.ptr(), &args, exception); + if (exception.* != null) { + return null; + } + + if (config.ssl_config != null) { + if (config.development) { + var server = JSC.API.DebugSSLServer.init(config, ctx.ptr()); + server.listen(); + } else { + var server = JSC.API.SSLServer.init(config, ctx.ptr()); + server.listen(); + } + } else { + if (config.development) { + var server = JSC.API.DebugServer.init(config, ctx.ptr()); + server.listen(); + } else { + var server = JSC.API.Server.init(config, ctx.ptr()); + server.listen(); + } } - JSC.C.JSValueProtect(ctx.ptr().ref(), handler.asObjectRef()); - var server = JSC.API.Server.init(vm.bundler.options.origin.getPortAuto(), handler, ctx.ptr()); - server.listen(); return JSC.JSValue.jsUndefined().asObjectRef(); } diff --git a/src/javascript/jsc/api/html_rewriter.zig b/src/javascript/jsc/api/html_rewriter.zig index a9f5f5d48..e3a3c6d75 100644 --- a/src/javascript/jsc/api/html_rewriter.zig +++ b/src/javascript/jsc/api/html_rewriter.zig @@ -316,23 +316,26 @@ pub const HTMLRewriter = struct { ); } - pub fn onFinishedLoadingWrap(sink: *anyopaque, bytes: anyerror![]u8) void { + pub fn onFinishedLoadingWrap(sink: *anyopaque, bytes: JSC.WebCore.Blob.Store.ReadFile.ResultType) void { onFinishedLoading(bun.cast(*BufferOutputSink, sink), bytes); } - pub fn onFinishedLoading(sink: *BufferOutputSink, bytes: anyerror![]u8) void { - const data = bytes catch |err| { - if (sink.response.body.value == .Locked and @ptrToInt(sink.response.body.value.Locked.task) == @ptrToInt(sink)) { - sink.response.body.value = .{ .Empty = .{} }; - } - - sink.response.body.value.toError(err, sink.global); - sink.rewriter.end() catch {}; - sink.deinit(); - return; - }; - - _ = sink.runOutputSink(data, true); + pub fn onFinishedLoading(sink: *BufferOutputSink, bytes: JSC.WebCore.Blob.Store.ReadFile.ResultType) void { + switch (bytes) { + .err => |err| { + if (sink.response.body.value == .Locked and @ptrToInt(sink.response.body.value.Locked.task) == @ptrToInt(sink)) { + sink.response.body.value = .{ .Empty = .{} }; + } + + sink.response.body.value.toErrorInstance(err.toErrorInstance(sink.global), sink.global); + sink.rewriter.end() catch {}; + sink.deinit(); + return; + }, + .result => |data| { + _ = sink.runOutputSink(data, true); + }, + } } pub fn runOutputSink(sink: *BufferOutputSink, bytes: []const u8, is_async: bool) ?JSValue { diff --git a/src/javascript/jsc/api/server.zig b/src/javascript/jsc/api/server.zig index 2beac4d23..38fad7c0c 100644 --- a/src/javascript/jsc/api/server.zig +++ b/src/javascript/jsc/api/server.zig @@ -93,11 +93,240 @@ const linux = std.os.linux; pub const ServerConfig = struct { port: u16 = 0, - hostnames: std.ArrayListUnmanaged([*:0]const u8) = .{}, + hostname: [*:0]const u8 = "0.0.0.0", + ssl_config: ?SSLConfig = null, max_request_body_size: usize = 1024 * 1024 * 128, + development: bool = false, + + onError: JSC.JSValue = JSC.JSValue.zero, + onRequest: JSC.JSValue = JSC.JSValue.zero, + + pub const SSLConfig = struct { + server_name: [*:0]const u8 = "", + + key_file_name: [*:0]const u8 = "", + cert_file_name: [*:0]const u8 = "", + + ca_file_name: [*:0]const u8 = "", + dh_params_file_name: [*:0]const u8 = "", + + passphrase: [*:0]const u8 = "", + low_memory_mode: bool = false, + + pub fn deinit(this: *SSLConfig) void { + const fields = .{ + "server_name", + "key_file_name", + "cert_file_name", + "ca_file_name", + "dh_params_file_name", + "passphrase", + }; + + inline for (fields) |field| { + const slice = std.mem.span(@field(this, field)); + if (slice.len > 0) { + bun.default_allocator.free(slice); + } + } + } + + const zero = SSLConfig{}; + + pub fn inJS(global: *JSC.JSGlobalObject, obj: JSC.JSValue, exception: JSC.C.ExceptionRef) ?SSLConfig { + var result = zero; + var any = false; + + // Required + if (obj.getTruthy(global, "keyFile")) |key_file_name| { + var sliced = key_file_name.toSlice(global, bun.default_allocator); + if (sliced.len > 0) { + result.key_file_name = bun.default_allocator.dupeZ(u8, sliced.slice()) catch unreachable; + if (std.os.system.access(result.key_file_name, std.os.F_OK) != 0) { + JSC.throwInvalidArguments("Invalid keyFile path", .{}, global.ref(), exception); + result.deinit(); + + return null; + } + any = true; + } + } + if (obj.getTruthy(global, "certFile")) |cert_file_name| { + var sliced = cert_file_name.toSlice(global, bun.default_allocator); + if (sliced.len > 0) { + result.cert_file_name = bun.default_allocator.dupeZ(u8, sliced.slice()) catch unreachable; + if (std.os.system.access(result.cert_file_name, std.os.F_OK) != 0) { + JSC.throwInvalidArguments("Invalid certFile path", .{}, global.ref(), exception); + result.deinit(); + return null; + } + any = true; + } + } + + // Optional + if (any) { + if (obj.getTruthy(global, "serverName")) |key_file_name| { + var sliced = key_file_name.toSlice(global, bun.default_allocator); + if (sliced.len > 0) { + result.server_name = bun.default_allocator.dupeZ(u8, sliced.slice()) catch unreachable; + } + } + + if (obj.getTruthy(global, "caFile")) |ca_file_name| { + var sliced = ca_file_name.toSlice(global, bun.default_allocator); + if (sliced.len > 0) { + result.ca_file_name = bun.default_allocator.dupeZ(u8, sliced.slice()) catch unreachable; + if (std.os.system.access(result.ca_file_name, std.os.F_OK) != 0) { + JSC.throwInvalidArguments("Invalid caFile path", .{}, global.ref(), exception); + result.deinit(); + return null; + } + } + } + if (obj.getTruthy(global, "dhParamsFile")) |dh_params_file_name| { + var sliced = dh_params_file_name.toSlice(global, bun.default_allocator); + if (sliced.len > 0) { + result.dh_params_file_name = bun.default_allocator.dupeZ(u8, sliced.slice()) catch unreachable; + if (std.os.system.access(result.dh_params_file_name, std.os.F_OK) != 0) { + JSC.throwInvalidArguments("Invalid dhParamsFile path", .{}, global.ref(), exception); + result.deinit(); + return null; + } + } + } + + if (obj.getTruthy(global, "passphrase")) |passphrase| { + var sliced = passphrase.toSlice(global, bun.default_allocator); + if (sliced.len > 0) { + result.passphrase = bun.default_allocator.dupeZ(u8, sliced.slice()) catch unreachable; + } + } + + if (obj.get(global, "lowMemoryMode")) |low_memory_mode| { + result.low_memory_mode = low_memory_mode.toBoolean(); + any = true; + } + } + + if (!any) + return null; + return result; + } + + pub fn fromJS(global: *JSC.JSGlobalObject, arguments: *JSC.Node.ArgumentsSlice, exception: JSC.C.ExceptionRef) ?SSLConfig { + if (arguments.next()) |arg| { + return SSLConfig.inJS(global, arg, exception); + } + + return null; + } + }; + + pub fn fromJS(global: *JSC.JSGlobalObject, arguments: *JSC.Node.ArgumentsSlice, exception: JSC.C.ExceptionRef) ServerConfig { + var env = VirtualMachine.vm.bundler.env; + + var args = ServerConfig{ + .port = 3000, + .hostname = "0.0.0.0", + .development = true, + }; + + if (strings.eqlComptime(env.get("NODE_ENV") orelse "", "production")) { + args.development = false; + } + + if (VirtualMachine.vm.bundler.options.production) { + args.development = false; + } + + const PORT_ENV = .{ "PORT", "BUN_PORT" }; + + inline for (PORT_ENV) |PORT| { + if (env.get(PORT)) |port| { + if (std.fmt.parseInt(u16, port, 10)) |_port| { + args.port = _port; + } else |_| {} + } + } + + if (VirtualMachine.vm.bundler.options.transform_options.port) |port| { + args.port = port; + } + + if (arguments.next()) |arg| { + if (arg.isUndefinedOrNull() or !arg.isObject()) { + JSC.throwInvalidArguments("Bun.serve expects an object", .{}, global.ref(), exception); + return args; + } + + if (arg.getTruthy(global, "port")) |port_| { + args.port = @intCast(u16, @minimum(@maximum(0, port_.toInt32()), std.math.maxInt(u16))); + } + + if (arg.getTruthy(global, "hostname") orelse arg.getTruthy(global, "host")) |host| { + const host_str = host.toSlice( + global, + bun.default_allocator, + ); + if (host_str.len > 0) { + args.hostname = bun.default_allocator.dupeZ(u8, host_str.slice()) catch unreachable; + } + } + + if (arg.get(global, "development")) |dev| { + args.development = dev.toBoolean(); + } + + if (SSLConfig.fromJS(global, arguments, exception)) |ssl_config| { + args.ssl_config = ssl_config; + } + + if (exception.* != null) { + return args; + } + + if (arg.getTruthy(global, "maxRequestBodySize")) |max_request_body_size| { + args.max_request_body_size = @intCast(u64, @maximum(0, max_request_body_size.toInt64())); + } + + if (arg.getTruthy(global, "error")) |onError| { + if (!onError.isCallable(global.vm())) { + JSC.throwInvalidArguments("Expected error to be a function", .{}, global.ref(), exception); + if (args.ssl_config) |*conf| { + conf.deinit(); + } + return args; + } + JSC.C.JSValueProtect(global.ref(), onError.asObjectRef()); + args.onError = onError; + } + + if (arg.getTruthy(global, "fetch")) |onRequest| { + if (!onRequest.isCallable(global.vm())) { + JSC.throwInvalidArguments("Expected fetch() to be a function", .{}, global.ref(), exception); + return args; + } + JSC.C.JSValueProtect(global.ref(), onRequest.asObjectRef()); + args.onRequest = onRequest; + } else { + JSC.throwInvalidArguments("Expected fetch() to be a function", .{}, global.ref(), exception); + if (args.ssl_config) |*conf| { + conf.deinit(); + } + return args; + } + } + + if (args.port == 0) { + JSC.throwInvalidArguments("Invalid port: must be > 0", .{}, global.ref(), exception); + } + + return args; + } }; -pub fn NewServer(comptime ssl_enabled: bool) type { +pub fn NewServer(comptime ssl_enabled: bool, comptime debug_mode: bool) type { return struct { const ThisServer = @This(); const RequestContextStackAllocator = std.heap.StackFallbackAllocator(@sizeOf(RequestContext) * 2048 + 4096); @@ -105,21 +334,19 @@ pub fn NewServer(comptime ssl_enabled: bool) type { pub const App = uws.NewApp(ssl_enabled); listener: ?*App.ListenSocket = null, - callback: JSC.JSValue = JSC.JSValue.zero, - port: u16 = 3000, + app: *App = undefined, globalThis: *JSGlobalObject, - default_server: URL = URL{ .host = "localhost", .port = "3000" }, + response_objects_pool: JSC.WebCore.Response.Pool = JSC.WebCore.Response.Pool{}, config: ServerConfig = ServerConfig{}, request_pool_allocator: std.mem.Allocator = undefined, - pub fn init(port: u16, callback: JSC.JSValue, globalThis: *JSGlobalObject) *ThisServer { + pub fn init(config: ServerConfig, globalThis: *JSGlobalObject) *ThisServer { var server = bun.default_allocator.create(ThisServer) catch @panic("Out of memory!"); server.* = .{ - .port = port, - .callback = callback, .globalThis = globalThis, + .config = config, }; RequestContext.pool = bun.default_allocator.create(RequestContextStackAllocator) catch @panic("Out of memory!"); server.request_pool_allocator = RequestContext.pool.get(); @@ -128,14 +355,14 @@ pub fn NewServer(comptime ssl_enabled: bool) type { pub fn onListen(this: *ThisServer, socket: ?*App.ListenSocket, _: uws.uws_app_listen_config_t) void { if (socket == null) { - Output.prettyErrorln("Failed to start socket", .{}); - Output.flush(); + JSC.VirtualMachine.vm.defaultErrorHandler(ZigString.init("Bun.serve failed to start").toErrorInstance(this.globalThis), null); return; } this.listener = socket; VirtualMachine.vm.uws_event_loop = uws.Loop.get(); VirtualMachine.vm.response_objects_pool = &this.response_objects_pool; + this.app.run(); } @@ -153,6 +380,7 @@ pub fn NewServer(comptime ssl_enabled: bool) type { response_headers: ?*JSC.WebCore.Headers.RefCountedHeaders = null, has_abort_handler: bool = false, has_sendfile_ctx: bool = false, + has_called_error_handler: bool = false, sendfile: SendfileContext = undefined, request_js_object: JSC.C.JSObjectRef = null, request_body_buf: std.ArrayListUnmanaged(u8) = .{}, @@ -197,21 +425,9 @@ pub fn NewServer(comptime ssl_enabled: bool) type { _: *JSC.JSGlobalObject, arguments: []const JSC.JSValue, ) void { - var exception_list: std.ArrayList(Api.JsException) = std.ArrayList(Api.JsException).init(bun.default_allocator); - JSC.VirtualMachine.vm.defaultErrorHandler(arguments[0], &exception_list); - if (!ctx.resp.hasResponded()) { - ctx.renderDefaultError( - JSC.VirtualMachine.vm.log, - error.PromiseRejection, - exception_list.toOwnedSlice(), - "", - .{}, - ); - JSC.VirtualMachine.vm.log.reset(); - return; - } else { - exception_list.deinit(); - } + ctx.runErrorHandler( + if (arguments.len > 0) arguments[0] else JSC.JSValue.jsUndefined(), + ); if (ctx.aborted) { ctx.finalize(); @@ -264,7 +480,7 @@ pub fn NewServer(comptime ssl_enabled: bool) type { ) catch unreachable; if (this.resp.tryEnd(bb.items, bb.items.len)) { bb.clearAndFree(); - this.finalize(); + this.finalizeWithoutDeinit(); return; } @@ -349,6 +565,13 @@ pub fn NewServer(comptime ssl_enabled: bool) type { if (headers.getHeaderIndex("content-length")) |index| { headers.entries.orderedRemove(index); } + + if (this.blob.content_type.len > 0 and headers.getHeaderIndex("content-type") == null) { + this.resp.writeHeader("content-type", this.blob.content_type); + } else if (MimeType.sniff(this.blob.sharedView())) |content| { + this.resp.writeHeader("content-type", content.value); + } + defer headers_.deref(); var entries = headers.entries.slice(); const names = entries.items(.name); @@ -487,7 +710,7 @@ pub fn NewServer(comptime ssl_enabled: bool) type { this.sendfile = .{ .fd = fd, - .remain = size_, // 2 is for \r\n, + .remain = size_, .socket_fd = this.resp.getNativeHandle(), }; @@ -499,6 +722,8 @@ pub fn NewServer(comptime ssl_enabled: bool) type { return; } + + // TODO: fix this to be MSGHDR _ = std.os.write(this.sendfile.socket_fd, "\r\n") catch 0; _ = this.onSendfile(); @@ -553,6 +778,51 @@ pub fn NewServer(comptime ssl_enabled: bool) type { this.renderBytes(); } + pub fn renderProductionError(this: *RequestContext) void { + this.resp.writeStatus("500 Internal Server Error"); + this.resp.writeHeader("content-type", "text/plain"); + this.resp.end("Something went wrong!", true); + + this.finalize(); + } + + pub fn runErrorHandler(this: *RequestContext, value: JSC.JSValue) void { + if (this.resp.hasResponded()) return; + + var exception_list: std.ArrayList(Api.JsException) = std.ArrayList(Api.JsException).init(bun.default_allocator); + + if (!this.server.config.onError.isEmpty() and !this.has_called_error_handler) { + this.has_called_error_handler = true; + var args = [_]JSC.C.JSValueRef{value.asObjectRef()}; + const result = JSC.C.JSObjectCallAsFunctionReturnValue(this.server.globalThis.ref(), this.server.config.onError.asObjectRef(), null, 1, &args); + if (!result.isUndefinedOrNull()) { + if (result.isError() or result.isAggregateError(this.server.globalThis)) { + JSC.VirtualMachine.vm.defaultErrorHandler(result, &exception_list); + } else if (result.as(Response)) |response| { + this.render(response); + return; + } + } + } + + if (comptime debug_mode) { + JSC.VirtualMachine.vm.defaultErrorHandler(value, &exception_list); + + this.renderDefaultError( + JSC.VirtualMachine.vm.log, + error.ExceptionOcurred, + exception_list.toOwnedSlice(), + "Unhandled exception in request handler", + .{}, + ); + } else { + JSC.VirtualMachine.vm.defaultErrorHandler(value, &exception_list); + this.renderProductionError(); + } + JSC.VirtualMachine.vm.log.reset(); + return; + } + pub fn renderMetadata(this: *RequestContext) void { var response: *JSC.WebCore.Response = this.response_ptr.?; var status = response.statusCode(); @@ -566,6 +836,10 @@ pub fn NewServer(comptime ssl_enabled: bool) type { if (response.body.init.headers) |headers_| { this.writeHeaders(headers_); + } else if (this.blob.content_type.len > 0) { + this.resp.writeHeader("content-type", this.blob.content_type); + } else if (MimeType.sniff(this.blob.sharedView())) |content| { + this.resp.writeHeader("content-type", content.value); } } @@ -687,6 +961,7 @@ pub fn NewServer(comptime ssl_enabled: bool) type { const buffer = writer.ctx.written; resp.end(buffer, false); } + pub fn onSrcRequest(_: *ThisServer, req: *uws.Request, resp: *App.Response) void { if (comptime JSC.is_bindgen) return undefined; req.setYield(false); @@ -739,7 +1014,7 @@ pub fn NewServer(comptime ssl_enabled: bool) type { var args = [_]JSC.C.JSValueRef{JSC.WebCore.Request.Class.make(this.globalThis.ref(), request_object)}; ctx.request_js_object = args[0]; JSC.C.JSValueProtect(this.globalThis.ref(), args[0]); - ctx.response_jsvalue = JSC.C.JSObjectCallAsFunctionReturnValue(this.globalThis.ref(), this.callback.asObjectRef(), null, 1, &args); + ctx.response_jsvalue = JSC.C.JSObjectCallAsFunctionReturnValue(this.globalThis.ref(), this.config.onRequest.asObjectRef(), null, 1, &args); defer JSC.VirtualMachine.vm.tick(); if (ctx.aborted) { ctx.finalize(); @@ -754,21 +1029,7 @@ pub fn NewServer(comptime ssl_enabled: bool) type { } if (ctx.response_jsvalue.isError() or ctx.response_jsvalue.isAggregateError(this.globalThis) or ctx.response_jsvalue.isException(this.globalThis.vm())) { - var exception_list: std.ArrayList(Api.JsException) = std.ArrayList(Api.JsException).init(bun.default_allocator); - JSC.VirtualMachine.vm.defaultErrorHandler(ctx.response_jsvalue, &exception_list); - if (!ctx.resp.hasResponded()) { - ctx.renderDefaultError( - JSC.VirtualMachine.vm.log, - error.ExceptionOcurred, - exception_list.toOwnedSlice(), - "Unhandled exception in request handler", - .{}, - ); - JSC.VirtualMachine.vm.log.reset(); - return; - } else { - exception_list.deinit(); - } + ctx.runErrorHandler(ctx.response_jsvalue); } JSC.C.JSValueProtect(this.globalThis.ref(), ctx.response_jsvalue.asObjectRef()); @@ -790,6 +1051,12 @@ pub fn NewServer(comptime ssl_enabled: bool) type { RequestContext.onResolve, RequestContext.onReject, ); + return; + } + + if (!ctx.resp.hasResponded()) { + ctx.resp.writeStatus("200 OK"); + ctx.resp.end("Welcome to Bun! To get started, ", false); } // switch (ctx.response_jsvalue.jsTypeLoose()) { @@ -800,20 +1067,42 @@ pub fn NewServer(comptime ssl_enabled: bool) type { } pub fn listen(this: *ThisServer) void { - this.app = App.create(.{}); + if (ssl_enabled) { + const ssl_config = this.config.ssl_config orelse @panic("Assertion failure: ssl_config"); + this.app = App.create(.{ + .key_file_name = ssl_config.key_file_name, + .cert_file_name = ssl_config.cert_file_name, + .passphrase = ssl_config.passphrase, + .dh_params_file_name = ssl_config.dh_params_file_name, + .ca_file_name = ssl_config.ca_file_name, + .ssl_prefer_low_memory_usage = @as(c_int, @boolToInt(ssl_config.low_memory_mode)), + }); + + if (std.mem.span(ssl_config.server_name).len > 0) { + this.app.addServerName(ssl_config.server_name); + } + } else { + this.app = App.create(.{}); + } + this.app.any("/*", *ThisServer, this, onRequest); - this.app.get("/bun:info", *ThisServer, this, onBunInfoRequest); - this.app.get("/src:/*", *ThisServer, this, onSrcRequest); + if (comptime debug_mode) { + this.app.get("/bun:info", *ThisServer, this, onBunInfoRequest); + this.app.get("/src:/*", *ThisServer, this, onSrcRequest); + } this.app.listenWithConfig(*ThisServer, this, onListen, .{ - .port = this.default_server.getPort().?, - .host = bun.default_allocator.dupeZ(u8, this.default_server.displayHostname()) catch unreachable, + .port = this.config.port, + .host = this.config.hostname, .options = 0, }); } }; } -pub const Server = NewServer(false); -pub const SSLServer = NewServer(true); +pub const Server = NewServer(false, true); +pub const SSLServer = NewServer(true, true); + +pub const DebugServer = NewServer(false, true); +pub const DebugSSLServer = NewServer(true, true); diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig index 05298ea27..64ee478c6 100644 --- a/src/javascript/jsc/bindings/bindings.zig +++ b/src/javascript/jsc/bindings/bindings.zig @@ -357,6 +357,13 @@ pub const SystemError = extern struct { path: ZigString = ZigString.init(""), syscall: ZigString = ZigString.init(""), + pub fn Maybe(comptime Result: type) type { + return union(enum) { + err: SystemError, + result: Result, + }; + } + pub const shim = Shimmer("", "SystemError", @This()); pub const name = "SystemError"; diff --git a/src/javascript/jsc/webcore/response.zig b/src/javascript/jsc/webcore/response.zig index 748828daf..4b64137ad 100644 --- a/src/javascript/jsc/webcore/response.zig +++ b/src/javascript/jsc/webcore/response.zig @@ -13,7 +13,7 @@ const js = JSC.C; const Method = @import("../../../http/method.zig").Method; const ObjectPool = @import("../../../pool.zig").ObjectPool; - +const SystemError = JSC.SystemError; const Output = @import("../../../global.zig").Output; const MutableString = @import("../../../global.zig").MutableString; const strings = @import("../../../global.zig").strings; @@ -1980,13 +1980,13 @@ pub const Blob = struct { if (sliced.len > 0) { var extname = std.fs.path.extension(sliced); extname = std.mem.trim(u8, extname, "."); - if (HTTPClient.MimeType.byExtension(extname)) |mime| { - break :brk mime.value; + if (HTTPClient.MimeType.byExtensionNoDefault(extname)) |mime| { + break :brk mime; } } - - break :brk null; } + + break :brk null; }, ) }, .allocator = allocator, @@ -2133,6 +2133,7 @@ pub const Blob = struct { suspend { this.close_frame = @frame().*; } + if (@hasField(This, "errno")) { if (this.errno) |errno| { return @errSetCast(AsyncIO.CloseError, errno); @@ -2267,7 +2268,6 @@ pub const Blob = struct { open_frame: OpenFrameType = undefined, read_frame: @Frame(ReadFile.doRead) = undefined, close_frame: @Frame(ReadFile.doClose) = undefined, - errno: ?anyerror = null, open_completion: HTTPClient.NetworkThread.Completion = undefined, opened_fd: JSC.Node.FileDescriptor = 0, read_completion: HTTPClient.NetworkThread.Completion = undefined, @@ -2278,11 +2278,14 @@ pub const Blob = struct { runAsyncFrame: @Frame(ReadFile.runAsync) = undefined, close_completion: HTTPClient.NetworkThread.Completion = undefined, task: HTTPClient.NetworkThread.Task = undefined, - + system_error: ?JSC.SystemError = null, + errno: ?anyerror = null, onCompleteCtx: *anyopaque = undefined, onCompleteCallback: OnReadFileCallback = undefined, - pub const OnReadFileCallback = fn (ctx: *anyopaque, bytes: anyerror![]u8) void; + pub const ResultType = SystemError.Maybe([]u8); + + pub const OnReadFileCallback = fn (ctx: *anyopaque, bytes: ResultType) void; pub usingnamespace FileOpenerMixin(ReadFile); pub usingnamespace FileCloserMixin(ReadFile); @@ -2315,10 +2318,10 @@ pub const Blob = struct { max_len: SizeType, comptime Context: type, context: Context, - comptime callback: fn (ctx: Context, bytes: anyerror![]u8) void, + comptime callback: fn (ctx: Context, bytes: ResultType) void, ) !*ReadFile { const Handler = struct { - pub fn run(ptr: *anyopaque, bytes: anyerror![]u8) void { + pub fn run(ptr: *anyopaque, bytes: ResultType) void { callback(bun.cast(Context, ptr), bytes); } }; @@ -2346,6 +2349,15 @@ pub const Blob = struct { } if (this.errno) |errno| { + this.system_error = JSC.SystemError{ + .code = ZigString.init(std.mem.span(@errorName(errno))), + .path = if (this.file_store.pathlike == .path) + ZigString.init(this.file_store.pathlike.path.slice()) + else + ZigString.Empty, + .syscall = ZigString.init("read"), + }; + return @errSetCast(AsyncIO.ReadError, errno); } @@ -2358,22 +2370,31 @@ pub const Blob = struct { var cb = this.onCompleteCallback; var cb_ctx = this.onCompleteCtx; - var store = this.store orelse { - var _err = this.errno orelse error.MissingData; - this.byte_store.deinit(); + if (this.store == null and this.system_error != null) { + var system_error = this.system_error.?; bun.default_allocator.destroy(this); - cb(cb_ctx, _err); + cb(cb_ctx, ResultType{ .err = system_error }); return; - }; + } else if (this.store == null) { + bun.default_allocator.destroy(this); + cb(cb_ctx, ResultType{ .err = SystemError{ + .code = ZigString.init("INTERNAL_ERROR"), + .path = ZigString.Empty, + .message = ZigString.init("assertion failure - store should not be null"), + .syscall = ZigString.init("read"), + } }); + return; + } + var store = this.store.?; defer store.deref(); if (this.file_store.pathlike == .path) { VirtualMachine.vm.removeFileBlob(this.file_store.pathlike); } - if (this.errno) |err| { + if (this.system_error) |err| { bun.default_allocator.destroy(this); - cb(cb_ctx, err); + cb(cb_ctx, ResultType{ .err = err }); return; } @@ -2391,7 +2412,7 @@ pub const Blob = struct { } bun.default_allocator.destroy(this); - cb(cb_ctx, bytes); + cb(cb_ctx, .{ .result = bytes }); } pub fn run(this: *ReadFile, task: *ReadFileTask) void { this.runAsyncFrame = async this.runAsync(task); @@ -2400,6 +2421,7 @@ pub const Blob = struct { pub fn onRead(this: *ReadFile, _: *HTTPClient.NetworkThread.Completion, result: AsyncIO.ReadError!usize) void { this.read_len = @truncate(SizeType, result catch |err| { this.errno = err; + this.system_error = .{ .code = ZigString.init(std.mem.span(@errorName(err))), .syscall = ZigString.init("read") }; this.read_len = 0; resume this.read_frame; return; @@ -2420,11 +2442,21 @@ pub const Blob = struct { .result => |result| result, .err => |err| { this.errno = AsyncIO.asError(err.errno); + this.system_error = err.toSystemError(); return; }, }; if (!std.os.S.ISREG(stat.mode)) { this.errno = error.ENOTSUP; + this.system_error = JSC.SystemError{ + .code = ZigString.init(std.mem.span(@errorName(error.TODO))), + .path = if (this.file_store.pathlike == .path) + ZigString.init(this.file_store.pathlike.path.slice()) + else + ZigString.Empty, + .message = ZigString.init("Non-regular files are not supported yet"), + .syscall = ZigString.init("read"), + }; return; } @@ -2482,6 +2514,7 @@ pub const Blob = struct { open_frame: OpenFrameType = undefined, write_frame: @Frame(WriteFile.doWrite) = undefined, close_frame: @Frame(WriteFile.doClose) = undefined, + system_error: ?JSC.SystemError = null, errno: ?anyerror = null, open_completion: HTTPClient.NetworkThread.Completion = undefined, @@ -2494,7 +2527,7 @@ pub const Blob = struct { onCompleteCallback: OnWriteFileCallback = undefined, wrote: usize = 0, - pub const ResultType = anyerror!SizeType; + pub const ResultType = SystemError.Maybe(SizeType); pub const OnWriteFileCallback = fn (ctx: *anyopaque, count: ResultType) void; pub usingnamespace FileOpenerMixin(WriteFile); @@ -2566,6 +2599,10 @@ pub const Blob = struct { } if (this.errno) |errno| { + this.system_error = this.system_error orelse JSC.SystemError{ + .code = ZigString.init(std.mem.span(@errorName(errno))), + .syscall = ZigString.init("write"), + }; return @errSetCast(AsyncIO.WriteError, errno); } @@ -2581,14 +2618,16 @@ pub const Blob = struct { this.bytes_blob.store.?.deref(); this.file_blob.store.?.deref(); - if (this.errno) |err| { + if (this.system_error) |err| { bun.default_allocator.destroy(this); - cb(cb_ctx, err); + cb(cb_ctx, .{ + .err = err, + }); return; } bun.default_allocator.destroy(this); - cb(cb_ctx, @truncate(SizeType, this.wrote)); + cb(cb_ctx, .{ .result = @truncate(SizeType, this.wrote) }); } pub fn run(this: *WriteFile, task: *WriteFileTask) void { this.runAsyncFrame = async this.runAsync(task); @@ -2650,6 +2689,17 @@ pub const Blob = struct { both, }; + const unsupported_directory_error = SystemError{ + .errno = @intCast(c_int, @enumToInt(bun.C.SystemErrno.EISDIR)), + .message = ZigString.init("That doesn't work on folders"), + .syscall = ZigString.init("fstat"), + }; + const unsupported_non_regular_file_error = SystemError{ + .errno = @intCast(c_int, @enumToInt(bun.C.SystemErrno.ENOTSUP)), + .message = ZigString.init("Non-regular files aren't supported yet"), + .syscall = ZigString.init("fstat"), + }; + // blocking, but off the main thread pub const CopyFile = struct { destination_file_store: FileStore, @@ -2662,7 +2712,7 @@ pub const Blob = struct { destination_fd: JSC.Node.FileDescriptor = 0, source_fd: JSC.Node.FileDescriptor = 0, - errno: ?anyerror = null, + system_error: ?SystemError = null, read_len: SizeType = 0, read_off: SizeType = 0, @@ -2703,7 +2753,7 @@ pub const Blob = struct { pub fn deinit(this: *CopyFile) void { if (this.source_file_store.pathlike == .path) { - if (this.source_file_store.pathlike.path == .string) { + if (this.source_file_store.pathlike.path == .string and this.system_error == null) { bun.default_allocator.free(bun.constStrToU8(this.source_file_store.pathlike.path.slice())); } } @@ -2714,14 +2764,13 @@ pub const Blob = struct { pub fn reject(this: *CopyFile, promise: *JSC.JSInternalPromise) void { var globalThis = this.globalThis; - var system_error = JSC.SystemError{}; - if (this.destination_file_store.pathlike == .path) { - system_error.path = ZigString.init(this.destination_file_store.pathlike.path.slice()); + var system_error: SystemError = this.system_error orelse SystemError{}; + if (this.source_file_store.pathlike == .path and system_error.path.len == 0) { + system_error.path = ZigString.init(this.source_file_store.pathlike.path.slice()); system_error.path.mark(); } system_error.message = ZigString.init("Failed to copy file"); - var _err = this.errno orelse error.MissingData; - system_error.code = ZigString.init(std.mem.span(@errorName(_err))); + var instance = system_error.toErrorInstance(this.globalThis); if (this.store) |store| { store.deref(); @@ -2732,7 +2781,7 @@ pub const Blob = struct { pub fn then(this: *CopyFile, promise: *JSC.JSInternalPromise) void { this.source_store.?.deref(); - if (this.errno != null) { + if (this.system_error != null) { this.reject(promise); return; } @@ -2789,8 +2838,8 @@ pub const Blob = struct { )) { .result => |result| result, .err => |errno| { - this.errno = AsyncIO.asError(errno.errno); - return; + this.system_error = errno.toSystemError(); + return AsyncIO.asError(errno.errno); }, }; } @@ -2808,8 +2857,8 @@ pub const Blob = struct { this.source_fd = 0; } - this.errno = AsyncIO.asError(errno.errno); - return; + this.system_error = errno.toSystemError(); + return AsyncIO.asError(errno.errno); }, }; } @@ -2838,8 +2887,11 @@ pub const Blob = struct { switch (linux.getErrno(written)) { .SUCCESS => {}, else => |errno| { - this.errno = AsyncIO.asError(errno); - return this.errno.?; + this.system_error = (JSC.Node.Syscall.Error{ + .errno = @intCast(JSC.Node.Syscall.Error.Int, @enumToInt(errno)), + .syscall = ZigString.init("copy_file_range"), + }).toSystemError(); + return AsyncIO.asError(errno); }, } @@ -2853,8 +2905,8 @@ pub const Blob = struct { pub fn doFCopyFile(this: *CopyFile) anyerror!void { switch (JSC.Node.Syscall.fcopyfile(this.source_fd, this.destination_fd, os.system.COPYFILE_DATA)) { .err => |errno| { - this.errno = AsyncIO.asError(errno.errno); - return this.errno.?; + this.system_error = errno.toSystemError(); + return AsyncIO.asError(errno.errno); }, .result => {}, } @@ -2863,6 +2915,7 @@ pub const Blob = struct { pub fn doClonefile(this: *CopyFile) anyerror!void { switch (JSC.Node.Syscall.clonefile(this.destination_file_store.pathlike.path.sliceZAssume(), this.source_file_store.pathlike.path.sliceZAssume())) { .err => |errno| { + this.system_error = errno.toSystemError(); return AsyncIO.asError(errno.errno); }, .result => {}, @@ -2898,7 +2951,7 @@ pub const Blob = struct { stat_ = result; if (os.S.ISDIR(result.mode)) { - this.errno = error.@"Bun.write() doesn't support directories yet."; + this.system_error = unsupported_directory_error; return; } @@ -2907,7 +2960,7 @@ pub const Blob = struct { }, .err => |err| { // If we can't stat it, we also can't copy it. - this.errno = AsyncIO.asError(err.errno); + this.system_error = err.toSystemError(); return; }, } @@ -2934,29 +2987,20 @@ pub const Blob = struct { } } - this.doOpenFile(.both) catch |err| { - this.errno = err; - return; - }; + this.doOpenFile(.both) catch return; // Do we need to open only one file? } else if (this.destination_fd == 0) { this.source_fd = this.source_file_store.pathlike.fd; - this.doOpenFile(.destination) catch |err| { - this.errno = err; - return; - }; + this.doOpenFile(.destination) catch return; // Do we need to open only one file? } else if (this.source_fd == 0) { this.destination_fd = this.destination_file_store.pathlike.fd; - this.doOpenFile(.source) catch |err| { - this.errno = err; - return; - }; + this.doOpenFile(.source) catch return; } - if (this.errno != null) { + if (this.system_error != null) { return; } @@ -2967,13 +3011,13 @@ pub const Blob = struct { .result => |result| result, .err => |err| { this.doClose(); - this.errno = AsyncIO.asError(err.errno); + this.system_error = err.toSystemError(); return; }, }; if (os.S.ISDIR(stat.mode)) { - this.errno = error.@"Bun.write() doesn't support directories yet."; + this.system_error = unsupported_directory_error; this.doClose(); return; } @@ -2992,15 +3036,15 @@ pub const Blob = struct { if (os.S.ISREG(stat.mode)) { if (comptime Environment.isLinux) { - this.doCopyFileRange() catch |err| { + this.doCopyFileRange() catch { this.doClose(); - this.errno = err; + return; }; } else if (comptime Environment.isMac) { - this.doFCopyFile() catch |err| { + this.doFCopyFile() catch { this.doClose(); - this.errno = err; + return; }; if (stat.size != 0 and @intCast(SizeType, stat.size) > this.max_length) { @@ -3010,7 +3054,7 @@ pub const Blob = struct { @compileError("TODO: implement copyfile"); } } else { - this.errno = error.@"Bun.write() doesn't support non-regular files yet."; + this.system_error = unsupported_non_regular_file_error; } this.doClose(); @@ -3486,27 +3530,24 @@ pub const Blob = struct { context: Blob, promise: *JSPromise, globalThis: *JSGlobalObject, - pub fn run(handler: *@This(), bytes_: anyerror![]u8) void { + pub fn run(handler: *@This(), bytes_: Blob.Store.ReadFile.ResultType) void { var promise = handler.promise; var blob = handler.context; blob.allocator = null; var globalThis = handler.globalThis; bun.default_allocator.destroy(handler); - var bytes = bytes_ catch |err| { - var error_string = ZigString.init( - std.fmt.allocPrint(bun.default_allocator, "Failed to read file \"{s}\"", .{std.mem.span(@errorName(err))}) catch unreachable, - ); - error_string.mark(); - blob.detach(); - - promise.reject(globalThis, error_string.toErrorInstance(globalThis)); - return; - }; - - if (blob.size > 0) - blob.size = @minimum(@truncate(u32, bytes.len), blob.size); + switch (bytes_) { + .result => |bytes| { + if (blob.size > 0) + blob.size = @minimum(@truncate(u32, bytes.len), blob.size); - promise.resolve(globalThis, Function(&blob, globalThis, comptime lifetime)); + promise.resolve(globalThis, Function(&blob, globalThis, comptime lifetime)); + }, + .err => |err| { + blob.detach(); + promise.reject(globalThis, err.toErrorInstance(globalThis)); + }, + } } }; } @@ -3518,22 +3559,20 @@ pub const Blob = struct { var promise = handler.promise; var globalThis = handler.globalThis; bun.default_allocator.destroy(handler); - var wrote = count catch |err| { - var error_string = ZigString.init( - std.fmt.allocPrint(bun.default_allocator, "Failed to write file \"{s}\"", .{std.mem.span(@errorName(err))}) catch unreachable, - ); - error_string.mark(); - promise.reject(globalThis, error_string.toErrorInstance(globalThis)); - return; - }; - - promise.resolve(globalThis, JSC.JSValue.jsNumberFromUint64(wrote)); + switch (count) { + .err => |err| { + promise.reject(globalThis, err.toErrorInstance(globalThis)); + }, + .result => |wrote| { + promise.resolve(globalThis, JSC.JSValue.jsNumberFromUint64(wrote)); + }, + } } }; pub fn NewInternalReadFileHandler(comptime Context: type, comptime Function: anytype) type { return struct { - pub fn run(handler: *anyopaque, bytes_: anyerror![]u8) void { + pub fn run(handler: *anyopaque, bytes_: Store.ReadFile.ResultType) void { Function(bun.cast(Context, handler), bytes_); } }; diff --git a/src/jsc.zig b/src/jsc.zig index 07e6ae5e6..553bcd65d 100644 --- a/src/jsc.zig +++ b/src/jsc.zig @@ -24,8 +24,11 @@ pub const API = struct { pub const Transpiler = @import("./javascript/jsc/api/transpiler.zig"); pub const Server = @import("./javascript/jsc/api/server.zig").Server; pub const SSLServer = @import("./javascript/jsc/api/server.zig").SSLServer; + pub const DebugServer = @import("./javascript/jsc/api/server.zig").DebugServer; + pub const DebugSSLServer = @import("./javascript/jsc/api/server.zig").DebugSSLServer; pub const Bun = @import("./javascript/jsc/api/bun.zig"); pub const Router = @import("./javascript/jsc/api/router.zig"); + pub const ServerConfig = @import("./javascript/jsc/api/server.zig").ServerConfig; }; pub const Node = struct { pub usingnamespace @import("./javascript/jsc/node/types.zig"); diff --git a/src/runtime.version b/src/runtime.version index 0bbf538da..9837b512c 100644 --- a/src/runtime.version +++ b/src/runtime.version @@ -1 +1 @@ -139d399765744be7
\ No newline at end of file +b8cf50ba67de2817
\ No newline at end of file diff --git a/src/runtime/hmr.ts b/src/runtime/hmr.ts index 75d4e0bea..6f030480e 100644 --- a/src/runtime/hmr.ts +++ b/src/runtime/hmr.ts @@ -359,19 +359,17 @@ if (typeof window !== "undefined") { build: API.WebsocketMessageBuildSuccess, timestamp: number ) { + debugger; const start = performance.now(); var update = this.findCSSLinkTag(build.id); // The last 4 bytes of the build message are the hash of the module // Currently, this hash is only used for ensuring we reload the source-map - var end = buffer.index + build.blob_length; - if (end > buffer.data.length && end > 4) { - end = buffer.data.length - 4; + + let bytes = new Uint8Array(buffer.data.buffer, buffer.index); + if (bytes.length > 4) { + bytes = bytes.subarray(0, bytes.length - 4); } - let bytes = - buffer.data.length > buffer.index - ? buffer.data.subarray(buffer.index, end) - : new Uint8Array(0); if (update === null) { __hmrlog.debug("Skipping unused CSS."); return; @@ -431,15 +429,19 @@ if (typeof window !== "undefined") { update.node.tagName === "LINK" || update.node.tagName === "STYLE" ) { + console.log("check"); // This might cause CSS specifity issues.... // I'm not 100% sure this is a safe operation const sheet = new CSSStyleSheet(); - sheet.replaceSync(this.decoder.decode(bytes)); - update.node.remove(); + const decoded = this.decoder.decode(bytes); + + sheet.replaceSync(decoded); + document.adoptedStyleSheets = [ ...document.adoptedStyleSheets, sheet, ]; + update.node.remove(); } break; } |