mime_guess-2.0.5/.cargo_vcs_info.json0000644000000001360000000000100131750ustar { "git": { "sha1": "805964fb54871f0154ee155bf21729b77ffd4a1c" }, "path_in_vcs": "" }mime_guess-2.0.5/.github/workflows/rust.yml000064400000000000000000000003470072674642500171360ustar 00000000000000name: Rust on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build run: cargo build --verbose - name: Run tests run: cargo test --verbose mime_guess-2.0.5/.gitignore000064400000000000000000000001050072674642500140010ustar 00000000000000*.swp target Cargo.lock src/mime_types_generated.rs .idea/ *.imlmime_guess-2.0.5/Cargo.lock0000644000000407720000000000100111620ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", "winapi", ] [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bumpalo" version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "cast" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "bitflags", "textwrap", "unicode-width", ] [[package]] name = "criterion" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" dependencies = [ "atty", "cast", "clap", "criterion-plot", "csv", "itertools", "lazy_static", "num-traits", "oorandom", "plotters", "rayon", "regex", "serde", "serde_cbor", "serde_derive", "serde_json", "tinytemplate", "walkdir", ] [[package]] name = "criterion-plot" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" dependencies = [ "cast", "itertools", ] [[package]] name = "crossbeam-deque" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "csv" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", "itoa", "ryu", "serde", ] [[package]] name = "csv-core" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] [[package]] name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "half" version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "hermit-abi" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.5" dependencies = [ "criterion", "mime", "unicase", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "plotters" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" dependencies = [ "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" [[package]] name = "plotters-svg" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" dependencies = [ "plotters-backend", ] [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "rayon" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "regex" version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "serde" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_cbor" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ "half", "serde", ] [[package]] name = "serde_derive" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ "unicode-width", ] [[package]] name = "tinytemplate" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ "serde", "serde_json", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-width" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasm-bindgen" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ "windows-sys", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] name = "windows_i686_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" mime_guess-2.0.5/Cargo.toml0000644000000022610000000000100111740ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] name = "mime_guess" version = "2.0.5" authors = ["Austin Bonander "] description = "A simple crate for detection of a file's MIME type by its extension." documentation = "https://docs.rs/mime_guess/" readme = "README.md" keywords = [ "mime", "filesystem", "extension", ] license = "MIT" repository = "https://github.com/abonander/mime_guess" [[example]] name = "rev_map" required-features = ["rev-mappings"] [[bench]] name = "benchmark" harness = false [dependencies.mime] version = "0.3" [dependencies.unicase] version = "2.4.0" [dev-dependencies.criterion] version = "0.3" [build-dependencies.unicase] version = "2.4.0" [features] default = ["rev-mappings"] rev-mappings = [] mime_guess-2.0.5/Cargo.toml.orig000064400000000000000000000023300072674642500147020ustar 00000000000000[package] name = "mime_guess" version = "2.0.5" authors = ["Austin Bonander "] license = "MIT" description = "A simple crate for detection of a file's MIME type by its extension." keywords = ["mime", "filesystem", "extension"] repository = "https://github.com/abonander/mime_guess" documentation = "https://docs.rs/mime_guess/" readme = "README.md" [features] default = ["rev-mappings"] # FIXME: when `phf` release 0.8.0 is ready # phf-map = ["phf", "phf_codegen"] # generate reverse-mappings for lookup of extensions by MIME type # default-on but can be turned off for smaller generated code rev-mappings = [] [dependencies] mime = "0.3" unicase = "2.4.0" #[dependencies.phf] ## version = "0.7.24" ## git = "https://github.com/sfackler/rust-phf" #path = "../rust-phf/phf" #features = ["unicase"] #optional = true [build-dependencies] unicase = "2.4.0" #[build-dependencies.phf_codegen] #version = "0.7.24" #git = "https://github.com/sfackler/rust-phf" #path = "../rust-phf/phf_codegen" #optional = true [dev-dependencies] criterion = "0.3" [[example]] name = "rev_map" required-features = ["rev-mappings"] [[bench]] name = "benchmark" harness = false mime_guess-2.0.5/LICENSE000064400000000000000000000021210072674642500130160ustar 00000000000000The MIT License (MIT) Copyright (c) 2015 Austin Bonander Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mime_guess-2.0.5/README.md000064400000000000000000000102450072674642500132760ustar 00000000000000# mime_guess ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/abonander/mime_guess/rust.yml?branch=master) [![Crates.io](https://img.shields.io/crates/v/mime_guess.svg)](https://crates.io/crates/mime_guess) MIME/MediaType guessing by file extension. Uses a static map of known file extension -> MIME type mappings. **Returning Contributors: New Requirements for Submissions Below** ##### Required Rust Version: 1.33 #### [Documentation](https://docs.rs/mime_guess/) ### Versioning Due to a mistaken premature release, `mime_guess` currently publicly depends on a pre-1.0 `mime`, which means `mime` upgrades are breaking changes and necessitate a major version bump. Refer to the following table to find a version of `mime_guess` which matches your version of `mime`: | `mime` version | `mime_guess` version | |----------------|----------------------| | `0.1.x, 0.2.x` | `1.x.y` | | `0.3.x` | `2.x.y` | #### Note: MIME Types Returned Are Not Stable/Guaranteed The media types returned for a given extension are not considered to be part of the crate's stable API and are often updated in patch (`x.y.z + 1`) releases to be as correct as possible. MIME changes are backported to previous major releases on a best-effort basis. Note that only the extensions of paths/filenames are inspected in order to guess the MIME type. The file that may or may not reside at that path may or may not be a valid file of the returned MIME type. Be wary of unsafe or un-validated assumptions about file structure or length. An extension may also have multiple applicable MIME types. When more than one is returned, the first is considered to be the most "correct"--see below for elaboration. Contributing ----------- #### Adding or correcting MIME types for extensions Is the MIME type for a file extension wrong or missing? Great! Well, not great for us, but great for you if you'd like to open a pull request! The file extension -> MIME type mappings are listed in `src/mime_types.rs`. **The list is sorted lexicographically by file extension, and all extensions are lowercase (where applicable).** The former is necessary to support fallback to binary search when the `phf-map` feature is turned off, and for the maintainers' sanity. The latter is only for consistency's sake; the search is case-insensitive. Simply add or update the appropriate string pair(s) to make the correction(s) needed. Run `cargo test` to make sure the library continues to work correctly. #### Important! Citing the corrected MIME type When opening a pull request, please include a link to an official document or RFC noting the correct MIME type for the file type in question **in the commit message** so that the commit history can be used as an audit trail. Though we're only guessing here, we like to be as correct as we can. It makes it much easier to vet your contribution if we don't have to search for corroborating material. #### Multiple MIME types per extension As of `2.0.0`, multiple MIME types per extension are supported. The first MIME type in the list for a given extension should be the most "correct" so users who only care about getting a single MIME type can use the `first*()` methods. The definition of "correct" is open to debate, however. In the author's opinion this should be whatever is defined by the latest IETF RFC for the given file format, or otherwise explicitly supercedes all others. If an official IANA registration replaces an older "experimental" style media type, please place the new type before the old type in the list, but keep the old type for reference: ``` - ("md", &["text/x-markdown"]), + ("md", &["text/markdown", "text/x-markdown"]), ``` #### Changes to the API or operation of the crate We're open to changes to the crate's API or its inner workings, breaking or not, if it improves the overall operation, efficiency, or ergonomics of the crate. However, it would be a good idea to open an issue on the repository so we can discuss your proposed changes and decide how best to approach them. License ------- MIT (See the `LICENSE` file in this repository for more information.) mime_guess-2.0.5/benches/benchmark.rs000064400000000000000000000014520072674642500157260ustar 00000000000000#[macro_use] extern crate criterion; extern crate mime_guess; use self::criterion::Criterion; use mime_guess::from_ext; include!("../src/mime_types.rs"); /// WARNING: this may take a while! fn bench_mime_str(c: &mut Criterion) { c.bench_function("from_ext", |b| { for (mime_ext, _) in MIME_TYPES { b.iter(|| from_ext(mime_ext).first_raw()); } }); } fn bench_mime_str_uppercase(c: &mut Criterion) { c.bench_function("from_ext uppercased", |b| { let uppercased = MIME_TYPES.into_iter().map(|(s, _)| s.to_uppercase()); for mime_ext in uppercased { b.iter(|| from_ext(&mime_ext).first_raw()); } }); } criterion_group!(benches, bench_mime_str, bench_mime_str_uppercase); criterion_main!(benches); mime_guess-2.0.5/build.rs000064400000000000000000000122040072674642500134610ustar 00000000000000#[cfg(feature = "phf")] extern crate phf_codegen; extern crate unicase; use unicase::UniCase; use std::env; use std::fs::File; use std::io::prelude::*; use std::io::BufWriter; use std::path::Path; use std::collections::BTreeMap; use mime_types::MIME_TYPES; #[path = "src/mime_types.rs"] mod mime_types; #[cfg(feature = "phf")] const PHF_PATH: &str = "::impl_::phf"; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("mime_types_generated.rs"); let mut outfile = BufWriter::new(File::create(&dest_path).unwrap()); println!( "cargo:rustc-env=MIME_TYPES_GENERATED_PATH={}", dest_path.display() ); #[cfg(feature = "phf")] build_forward_map(&mut outfile); #[cfg(feature = "rev-mappings")] build_rev_map(&mut outfile); } // Build forward mappings (ext -> mime type) #[cfg(feature = "phf")] fn build_forward_map(out: &mut W) { use phf_codegen::Map as PhfMap; let mut forward_map = PhfMap::new(); forward_map.phf_path(PHF_PATH); let mut map_entries: Vec<(&str, Vec<&str>)> = Vec::new(); for &(key, types) in MIME_TYPES { if let Some(&mut (key_, ref mut values)) = map_entries.last_mut() { // deduplicate extensions if key == key_ { values.extend_from_slice(types); continue; } } map_entries.push((key, types.into())); } for (key, values) in map_entries { forward_map.entry( UniCase::new(key), &format!("&{:?}", values), ); } writeln!( out, "static MIME_TYPES: phf::Map, &'static [&'static str]> = \n{};", forward_map.build() ) .unwrap(); } // Build reverse mappings (mime type -> ext) #[cfg(all(feature = "phf", feature = "rev-mappings"))] fn build_rev_map(out: &mut W) { use phf_codegen::Map as PhfMap; let dyn_map = get_rev_mappings(); let mut rev_map = PhfMap::new(); rev_map.phf_path(PHF_PATH); let mut exts = Vec::new(); for (top, subs) in dyn_map { let top_start = exts.len(); let mut sub_map = PhfMap::new(); sub_map.phf_path(PHF_PATH); for (sub, sub_exts) in subs { let sub_start = exts.len(); exts.extend(sub_exts); let sub_end = exts.len(); sub_map.entry(sub, &format!("({}, {})", sub_start, sub_end)); } let top_end = exts.len(); rev_map.entry( top, &format!( "TopLevelExts {{ start: {}, end: {}, subs: {} }}", top_start, top_end, sub_map.build() ), ); } writeln!( out, "static REV_MAPPINGS: phf::Map, TopLevelExts> = \n{};", rev_map.build() ).unwrap(); writeln!(out, "const EXTS: &'static [&'static str] = &{:?};", exts).unwrap(); } #[cfg(all(not(feature = "phf"), feature = "rev-mappings"))] fn build_rev_map(out: &mut W) { use std::fmt::Write as _; macro_rules! unicase_const { ($s:expr) => ({ format_args!("{}({:?})", (if $s.is_ascii() { "UniCase::ascii" } else { "UniCase::unicode" }), $s) }) } let dyn_map = get_rev_mappings(); write!(out, "static REV_MAPPINGS: &'static [(UniCase<&'static str>, TopLevelExts)] = &[").unwrap(); let mut exts = Vec::new(); for (top, subs) in dyn_map { let top_start = exts.len(); let mut sub_map = String::new(); for (sub, sub_exts) in subs { let sub_start = exts.len(); exts.extend(sub_exts); let sub_end = exts.len(); write!( sub_map, "({}, ({}, {})),", unicase_const!(sub), sub_start, sub_end ).unwrap(); } let top_end = exts.len(); write!( out, "({}, TopLevelExts {{ start: {}, end: {}, subs: &[{}] }}),", unicase_const!(top), top_start, top_end, sub_map ).unwrap(); } writeln!(out, "];").unwrap(); writeln!(out, "const EXTS: &'static [&'static str] = &{:?};", exts).unwrap(); } #[cfg(feature = "rev-mappings")] fn get_rev_mappings( ) -> BTreeMap, BTreeMap, Vec<&'static str>>> { // First, collect all the mime type -> ext mappings) let mut dyn_map = BTreeMap::new(); for &(key, types) in MIME_TYPES { for val in types { let (top, sub) = split_mime(val); dyn_map .entry(UniCase::new(top)) .or_insert_with(BTreeMap::new) .entry(UniCase::new(sub)) .or_insert_with(Vec::new) .push(key); } } dyn_map } fn split_mime(mime: &str) -> (&str, &str) { let split_idx = mime.find('/').unwrap(); (&mime[..split_idx], &mime[split_idx + 1..]) } mime_guess-2.0.5/examples/rev_map.rs000064400000000000000000000004270072674642500156350ustar 00000000000000extern crate mime_guess; fn main() { print_exts("video/*"); print_exts("video/x-matroska"); } fn print_exts(mime_type: &str) { println!( "Exts for {:?}: {:?}", mime_type, mime_guess::get_mime_extensions_str(mime_type) ); } mime_guess-2.0.5/src/impl_bin_search.rs000064400000000000000000000021030072674642500162640ustar 00000000000000use unicase::UniCase; include!("mime_types.rs"); include!(env!("MIME_TYPES_GENERATED_PATH")); #[cfg(feature = "rev-mappings")] #[derive(Copy, Clone)] struct TopLevelExts { start: usize, end: usize, subs: &'static [(UniCase<&'static str>, (usize, usize))], } pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> { let ext = UniCase::new(ext); map_lookup(MIME_TYPES, &ext) } #[cfg(feature = "rev-mappings")] pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> { if toplevel == "*" { return Some(EXTS); } let top = map_lookup(REV_MAPPINGS, toplevel)?; if sublevel == "*" { return Some(&EXTS[top.start..top.end]); } let sub = map_lookup(&top.subs, sublevel)?; Some(&EXTS[sub.0..sub.1]) } fn map_lookup(map: &'static [(K, V)], key: &str) -> Option where K: Copy + Into>, V: Copy { map.binary_search_by_key(&UniCase::new(key), |(k, _)| (*k).into()) .ok() .map(|i| map[i].1) } mime_guess-2.0.5/src/impl_phf.rs000064400000000000000000000020510072674642500147460ustar 00000000000000extern crate phf; use unicase::UniCase; include!(env!("MIME_TYPES_GENERATED_PATH")); #[cfg(feature = "rev-mappings")] struct TopLevelExts { start: usize, end: usize, subs: phf::Map, (usize, usize)>, } pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> { map_lookup(&MIME_TYPES, ext).cloned() } pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> { if toplevel == "*" { return Some(EXTS); } let top = map_lookup(&REV_MAPPINGS, toplevel)?; if sublevel == "*" { return Some(&EXTS[top.start..top.end]); } let sub = map_lookup(&top.subs, sublevel)?; Some(&EXTS[sub.0..sub.1]) } fn map_lookup<'key, 'map: 'key, V>( map: &'map phf::Map, V>, key: &'key str, ) -> Option<&'map V> { // FIXME: this doesn't compile unless we transmute `key` to `UniCase<&'static str>` // https://github.com/sfackler/rust-phf/issues/169 map.get(&UniCase::new(key)) } mime_guess-2.0.5/src/lib.rs000064400000000000000000000437150072674642500137320ustar 00000000000000//! Guessing of MIME types by file extension. //! //! Uses a static list of file-extension : MIME type mappings. //! //! ``` //! # extern crate mime; //! // the file doesn't have to exist, it just looks at the path //! let guess = mime_guess::from_path("some_file.gif"); //! assert_eq!(guess.first(), Some(mime::IMAGE_GIF)); //! //! ``` //! //! #### Note: MIME Types Returned Are Not Stable/Guaranteed //! The media types returned for a given extension are not considered to be part of the crate's //! stable API and are often updated in patch
(`x.y.[z + 1]`) releases to be as correct as //! possible. //! //! Additionally, only the extensions of paths/filenames are inspected in order to guess the MIME //! type. The file that may or may not reside at that path may or may not be a valid file of the //! returned MIME type. Be wary of unsafe or un-validated assumptions about file structure or //! length. pub extern crate mime; extern crate unicase; pub use mime::Mime; use std::ffi::OsStr; use std::iter::FusedIterator; use std::path::Path; use std::{iter, slice}; #[cfg(feature = "phf")] #[path = "impl_phf.rs"] mod impl_; #[cfg(not(feature = "phf"))] #[path = "impl_bin_search.rs"] mod impl_; /// A "guess" of the MIME/Media Type(s) of an extension or path as one or more /// [`Mime`](struct.Mime.html) instances. /// /// ### Note: Ordering /// A given file format may have one or more applicable Media Types; in this case /// the first Media Type returned is whatever is declared in the latest IETF RFC for the /// presumed file format or the one that explicitly supercedes all others. /// Ordering of additional Media Types is arbitrary. /// /// ### Note: Values Not Stable /// The exact Media Types returned in any given guess are not considered to be stable and are often /// updated in patch releases in order to reflect the most up-to-date information possible. #[derive(Copy, Clone, Debug, PartialEq, Eq)] // FIXME: change repr when `mime` gains macro/const fn constructor pub struct MimeGuess(&'static [&'static str]); impl MimeGuess { /// Guess the MIME type of a file (real or otherwise) with the given extension. /// /// The search is case-insensitive. /// /// If `ext` is empty or has no (currently) known MIME type mapping, then an empty guess is /// returned. pub fn from_ext(ext: &str) -> MimeGuess { if ext.is_empty() { return MimeGuess(&[]); } impl_::get_mime_types(ext).map_or(MimeGuess(&[]), |v| MimeGuess(v)) } /// Guess the MIME type of `path` by its extension (as defined by /// [`Path::extension()`]). **No disk access is performed.** /// /// If `path` has no extension, the extension cannot be converted to `str`, or has /// no known MIME type mapping, then an empty guess is returned. /// /// The search is case-insensitive. /// /// ## Note /// **Guess** is the operative word here, as there are no guarantees that the contents of the /// file that `path` points to match the MIME type associated with the path's extension. /// /// Take care when processing files with assumptions based on the return value of this function. /// /// [`Path::extension()`]: https://doc.rust-lang.org/std/path/struct.Path.html#method.extension pub fn from_path>(path: P) -> MimeGuess { path.as_ref() .extension() .and_then(OsStr::to_str) .map_or(MimeGuess(&[]), Self::from_ext) } /// `true` if the guess did not return any known mappings for the given path or extension. pub fn is_empty(&self) -> bool { self.0.is_empty() } /// Get the number of MIME types in the current guess. pub fn count(&self) -> usize { self.0.len() } /// Get the first guessed `Mime`, if applicable. /// /// See [Note: Ordering](#note-ordering) above. pub fn first(&self) -> Option { self.first_raw().map(expect_mime) } /// Get the first guessed Media Type as a string, if applicable. /// /// See [Note: Ordering](#note-ordering) above. pub fn first_raw(&self) -> Option<&'static str> { self.0.get(0).cloned() } /// Get the first guessed `Mime`, or if the guess is empty, return /// [`application/octet-stream`] instead. /// /// See [Note: Ordering](#note-ordering) above. /// /// ### Note: HTTP Applications /// For HTTP request and response bodies if a value for the `Content-Type` header /// cannot be determined it might be preferable to not send one at all instead of defaulting to /// `application/octet-stream` as the recipient will expect to infer the format directly from /// the content instead. ([RFC 7231, Section 3.1.1.5][rfc7231]) /// /// On the contrary, for `multipart/form-data` bodies, the `Content-Type` of a form-data part is /// assumed to be `text/plain` unless specified so a default of `application/octet-stream` /// for non-text parts is safer. ([RFC 7578, Section 4.4][rfc7578]) /// /// [`application/octet-stream`]: https://docs.rs/mime/0.3/mime/constant.APPLICATION_OCTET_STREAM.html /// [rfc7231]: https://tools.ietf.org/html/rfc7231#section-3.1.1.5 /// [rfc7578]: https://tools.ietf.org/html/rfc7578#section-4.4 pub fn first_or_octet_stream(&self) -> Mime { self.first_or(mime::APPLICATION_OCTET_STREAM) } /// Get the first guessed `Mime`, or if the guess is empty, return /// [`text/plain`](::mime::TEXT_PLAIN) instead. /// /// See [Note: Ordering](#note-ordering) above. pub fn first_or_text_plain(&self) -> Mime { self.first_or(mime::TEXT_PLAIN) } /// Get the first guessed `Mime`, or if the guess is empty, return the given `Mime` instead. /// /// See [Note: Ordering](#note-ordering) above. pub fn first_or(&self, default: Mime) -> Mime { self.first().unwrap_or(default) } /// Get the first guessed `Mime`, or if the guess is empty, execute the closure and return its /// result. /// /// See [Note: Ordering](#note-ordering) above. pub fn first_or_else(&self, default_fn: F) -> Mime where F: FnOnce() -> Mime, { self.first().unwrap_or_else(default_fn) } /// Get an iterator over the `Mime` values contained in this guess. /// /// See [Note: Ordering](#note-ordering) above. pub fn iter(&self) -> Iter { Iter(self.iter_raw().map(expect_mime)) } /// Get an iterator over the raw media-type strings in this guess. /// /// See [Note: Ordering](#note-ordering) above. pub fn iter_raw(&self) -> IterRaw { IterRaw(self.0.iter().cloned()) } } impl IntoIterator for MimeGuess { type Item = Mime; type IntoIter = Iter; fn into_iter(self) -> Self::IntoIter { self.iter() } } impl<'a> IntoIterator for &'a MimeGuess { type Item = Mime; type IntoIter = Iter; fn into_iter(self) -> Self::IntoIter { self.iter() } } /// An iterator over the `Mime` types of a `MimeGuess`. /// /// See [Note: Ordering on `MimeGuess`](struct.MimeGuess.html#note-ordering). #[derive(Clone, Debug)] pub struct Iter(iter::Map Mime>); impl Iterator for Iter { type Item = Mime; fn next(&mut self) -> Option { self.0.next() } fn size_hint(&self) -> (usize, Option) { self.0.size_hint() } } impl DoubleEndedIterator for Iter { fn next_back(&mut self) -> Option { self.0.next_back() } } impl FusedIterator for Iter {} impl ExactSizeIterator for Iter { fn len(&self) -> usize { self.0.len() } } /// An iterator over the raw media type strings of a `MimeGuess`. /// /// See [Note: Ordering on `MimeGuess`](struct.MimeGuess.html#note-ordering). #[derive(Clone, Debug)] pub struct IterRaw(iter::Cloned>); impl Iterator for IterRaw { type Item = &'static str; fn next(&mut self) -> Option { self.0.next() } fn size_hint(&self) -> (usize, Option) { self.0.size_hint() } } impl DoubleEndedIterator for IterRaw { fn next_back(&mut self) -> Option { self.0.next_back() } } impl FusedIterator for IterRaw {} impl ExactSizeIterator for IterRaw { fn len(&self) -> usize { self.0.len() } } fn expect_mime(s: &str) -> Mime { // `.parse()` should be checked at compile time to never fail s.parse() .unwrap_or_else(|e| panic!("failed to parse media-type {:?}: {}", s, e)) } /// Wrapper of [`MimeGuess::from_ext()`](struct.MimeGuess.html#method.from_ext). pub fn from_ext(ext: &str) -> MimeGuess { MimeGuess::from_ext(ext) } /// Wrapper of [`MimeGuess::from_path()`](struct.MimeGuess.html#method.from_path). pub fn from_path>(path: P) -> MimeGuess { MimeGuess::from_path(path) } /// Guess the MIME type of `path` by its extension (as defined by `Path::extension()`). /// /// If `path` has no extension, or its extension has no known MIME type mapping, /// then the MIME type is assumed to be `application/octet-stream`. /// /// ## Note /// **Guess** is the operative word here, as there are no guarantees that the contents of the file /// that `path` points to match the MIME type associated with the path's extension. /// /// Take care when processing files with assumptions based on the return value of this function. /// /// In HTTP applications, it might be [preferable][rfc7231] to not send a `Content-Type` /// header at all instead of defaulting to `application/octet-stream`. /// /// [rfc7231]: https://tools.ietf.org/html/rfc7231#section-3.1.1.5 #[deprecated( since = "2.0.0", note = "Use `from_path(path).first_or_octet_stream()` instead" )] pub fn guess_mime_type>(path: P) -> Mime { from_path(path).first_or_octet_stream() } /// Guess the MIME type of `path` by its extension (as defined by `Path::extension()`). /// /// If `path` has no extension, or its extension has no known MIME type mapping, /// then `None` is returned. /// #[deprecated(since = "2.0.0", note = "Use `from_path(path).first()` instead")] pub fn guess_mime_type_opt>(path: P) -> Option { from_path(path).first() } /// Guess the MIME type string of `path` by its extension (as defined by `Path::extension()`). /// /// If `path` has no extension, or its extension has no known MIME type mapping, /// then `None` is returned. /// /// ## Note /// **Guess** is the operative word here, as there are no guarantees that the contents of the file /// that `path` points to match the MIME type associated with the path's extension. /// /// Take care when processing files with assumptions based on the return value of this function. #[deprecated(since = "2.0.0", note = "Use `from_path(path).first_raw()` instead")] pub fn mime_str_for_path_ext>(path: P) -> Option<&'static str> { from_path(path).first_raw() } /// Get the MIME type associated with a file extension. /// /// If there is no association for the extension, or `ext` is empty, /// `application/octet-stream` is returned. /// /// ## Note /// In HTTP applications, it might be [preferable][rfc7231] to not send a `Content-Type` /// header at all instead of defaulting to `application/octet-stream`. /// /// [rfc7231]: https://tools.ietf.org/html/rfc7231#section-3.1.1.5 #[deprecated( since = "2.0.0", note = "use `from_ext(search_ext).first_or_octet_stream()` instead" )] pub fn get_mime_type(search_ext: &str) -> Mime { from_ext(search_ext).first_or_octet_stream() } /// Get the MIME type associated with a file extension. /// /// If there is no association for the extension, or `ext` is empty, /// `None` is returned. #[deprecated(since = "2.0.0", note = "use `from_ext(search_ext).first()` instead")] pub fn get_mime_type_opt(search_ext: &str) -> Option { from_ext(search_ext).first() } /// Get the MIME type string associated with a file extension. Case-insensitive. /// /// If `search_ext` is not already lowercase, /// it will be converted to lowercase to facilitate the search. /// /// Returns `None` if `search_ext` is empty or an associated extension was not found. #[deprecated( since = "2.0.0", note = "use `from_ext(search_ext).first_raw()` instead" )] pub fn get_mime_type_str(search_ext: &str) -> Option<&'static str> { from_ext(search_ext).first_raw() } /// Get a list of known extensions for a given `Mime`. /// /// Ignores parameters (only searches with `
/`). Case-insensitive (for extension types). /// /// Returns `None` if the MIME type is unknown. /// /// ### Wildcards /// If the top-level of the MIME type is a wildcard (`*`), returns all extensions. /// /// If the sub-level of the MIME type is a wildcard, returns all extensions for the top-level. #[cfg(feature = "rev-mappings")] pub fn get_mime_extensions(mime: &Mime) -> Option<&'static [&'static str]> { get_extensions(mime.type_().as_ref(), mime.subtype().as_ref()) } /// Get a list of known extensions for a MIME type string. /// /// Ignores parameters (only searches `
/`). Case-insensitive. /// /// Returns `None` if the MIME type is unknown. /// /// ### Wildcards /// If the top-level of the MIME type is a wildcard (`*`), returns all extensions. /// /// If the sub-level of the MIME type is a wildcard, returns all extensions for the top-level. /// /// ### Panics /// If `mime_str` is not a valid MIME type specifier (naive). #[cfg(feature = "rev-mappings")] pub fn get_mime_extensions_str(mut mime_str: &str) -> Option<&'static [&'static str]> { mime_str = mime_str.trim(); if let Some(sep_idx) = mime_str.find(';') { mime_str = &mime_str[..sep_idx]; } let (top, sub) = { let split_idx = mime_str.find('/')?; (&mime_str[..split_idx], &mime_str[split_idx + 1..]) }; get_extensions(top, sub) } /// Get the extensions for a given top-level and sub-level of a MIME type /// (`{toplevel}/{sublevel}`). /// /// Returns `None` if `toplevel` or `sublevel` are unknown. /// /// ### Wildcards /// If the top-level of the MIME type is a wildcard (`*`), returns all extensions. /// /// If the sub-level of the MIME type is a wildcard, returns all extensions for the top-level. #[cfg(feature = "rev-mappings")] pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> { impl_::get_extensions(toplevel, sublevel) } /// Get the MIME type for `application/octet-stream` (generic binary stream) #[deprecated(since = "2.0.0", note = "use `mime::APPLICATION_OCTET_STREAM` instead")] pub fn octet_stream() -> Mime { "application/octet-stream".parse().unwrap() } #[cfg(test)] mod tests { include!("mime_types.rs"); use super::{expect_mime, from_ext, from_path, get_mime_extensions_str}; #[allow(deprecated, unused_imports)] use std::ascii::AsciiExt; use std::fmt::Debug; use std::path::Path; #[test] fn check_type_bounds() { fn assert_type_bounds() {} assert_type_bounds::(); assert_type_bounds::(); assert_type_bounds::(); } #[test] fn test_mime_type_guessing() { assert_eq!( from_ext("gif").first_or_octet_stream().to_string(), "image/gif".to_string() ); assert_eq!( from_ext("TXT").first_or_octet_stream().to_string(), "text/plain".to_string() ); assert_eq!( from_ext("blahblah").first_or_octet_stream().to_string(), "application/octet-stream".to_string() ); assert_eq!( from_path(Path::new("/path/to/file.gif")) .first_or_octet_stream() .to_string(), "image/gif".to_string() ); assert_eq!( from_path("/path/to/file.gif") .first_or_octet_stream() .to_string(), "image/gif".to_string() ); } #[test] fn test_mime_type_guessing_opt() { assert_eq!( from_ext("gif").first().unwrap().to_string(), "image/gif".to_string() ); assert_eq!( from_ext("TXT").first().unwrap().to_string(), "text/plain".to_string() ); assert_eq!(from_ext("blahblah").first(), None); assert_eq!( from_path("/path/to/file.gif").first().unwrap().to_string(), "image/gif".to_string() ); assert_eq!(from_path("/path/to/file").first(), None); } #[test] fn test_are_mime_types_parseable() { for (_, mimes) in MIME_TYPES { mimes.iter().for_each(|s| { expect_mime(s); }); } } // RFC: Is this test necessary anymore? --@cybergeek94, 2/1/2016 #[test] fn test_are_extensions_ascii() { for (ext, _) in MIME_TYPES { assert!(ext.is_ascii(), "Extension not ASCII: {:?}", ext); } } #[test] fn test_are_extensions_sorted() { // simultaneously checks the requirement that duplicate extension entries are adjacent for (&(ext, _), &(n_ext, _)) in MIME_TYPES.iter().zip(MIME_TYPES.iter().skip(1)) { assert!( ext <= n_ext, "Extensions in src/mime_types should be sorted lexicographically in ascending order. Failed assert: {:?} <= {:?}", ext, n_ext ); } } #[test] fn test_get_mime_extensions_str_no_panic_if_bad_mime() { assert_eq!(get_mime_extensions_str(""), None); } } mime_guess-2.0.5/src/mime_types.rs000064400000000000000000001733450072674642500153420ustar 00000000000000/// A mapping of known file extensions and their MIME types. /// /// Required to be sorted lexicographically by extension for ease of maintenance. /// /// Multiple MIME types per extension are supported; the order is arbitrary but the first should be /// the most prevalent by most recent RFC declaration or explicit succession of other media types. /// /// NOTE: when adding or modifying entries, please include a citation in the commit message. /// If a media type for an extension changed by official IETF RFC, please keep the old entry but add /// the new one before it in the slice literal, e.g.: /// /// ```ignore /// - ("md", &["text/x-markdown"]), /// + ("md", &["text/markdown", "text/x-markdown"]), /// ``` /// /// Sourced from: /// https://github.com/samuelneff/MimeTypeMap/blob/master/src/MimeTypes/MimeTypeMap.cs /// https://github.com/jshttp/mime-db extracted with https://gist.github.com/soyuka/b7e29d359b2c14c21bdead923c01cc81 pub static MIME_TYPES: &[(&str, &[&str])] = &[ ("123", &["application/vnd.lotus-1-2-3"]), ("323", &["text/h323"]), ("3dml", &["text/vnd.in3d.3dml"]), ("3ds", &["image/x-3ds"]), ("3g2", &["video/3gpp2"]), ("3gp", &["video/3gpp"]), ("3gp2", &["video/3gpp2"]), ("3gpp", &["video/3gpp"]), ("7z", &["application/x-7z-compressed"]), ("aa", &["audio/audible"]), ("aab", &["application/x-authorware-bin"]), ("aac", &["audio/aac"]), ("aaf", &["application/octet-stream"]), ("aam", &["application/x-authorware-map"]), ("aas", &["application/x-authorware-seg"]), ("aax", &["audio/vnd.audible.aax"]), ("abw", &["application/x-abiword"]), ("ac", &["application/pkix-attr-cert"]), ("ac3", &["audio/ac3"]), ("aca", &["application/octet-stream"]), ("acc", &["application/vnd.americandynamics.acc"]), ("accda", &["application/msaccess.addin"]), ("accdb", &["application/msaccess"]), ("accdc", &["application/msaccess.cab"]), ("accde", &["application/msaccess"]), ("accdr", &["application/msaccess.runtime"]), ("accdt", &["application/msaccess"]), ("accdw", &["application/msaccess.webapplication"]), ("accft", &["application/msaccess.ftemplate"]), ("ace", &["application/x-ace-compressed"]), ("acu", &["application/vnd.acucobol"]), ("acutc", &["application/vnd.acucorp"]), ("acx", &["application/internet-property-stream"]), ("addin", &["text/xml"]), ("ade", &["application/msaccess"]), ("adobebridge", &["application/x-bridge-url"]), ("adp", &["application/msaccess"]), ("adt", &["audio/vnd.dlna.adts"]), ("adts", &["audio/aac"]), ("aep", &["application/vnd.audiograph"]), ("afm", &["application/octet-stream"]), ("afp", &["application/vnd.ibm.modcap"]), ("ahead", &["application/vnd.ahead.space"]), ("ai", &["application/postscript"]), ("aif", &["audio/aiff"]), ("aifc", &["audio/aiff"]), ("aiff", &["audio/aiff"]), ( "air", &["application/vnd.adobe.air-application-installer-package+zip"], ), ("ait", &["application/vnd.dvb.ait"]), ("amc", &["application/mpeg"]), ("ami", &["application/vnd.amiga.ami"]), ("anx", &["application/annodex"]), ("apk", &["application/vnd.android.package-archive"]), ("apng", &["image/apng"]), ("appcache", &["text/cache-manifest"]), ("application", &["application/x-ms-application"]), ("apr", &["application/vnd.lotus-approach"]), ("arc", &["application/x-freearc"]), ("arj", &["application/x-arj"]), ("art", &["image/x-jg"]), ("arw", &["image/x-sony-arw"]), ("asa", &["application/xml"]), ("asax", &["application/xml"]), ("asc", &["application/pgp-signature"]), ("ascx", &["application/xml"]), ("asd", &["application/octet-stream"]), ("asf", &["video/x-ms-asf"]), ("ashx", &["application/xml"]), ("asi", &["application/octet-stream"]), ("asm", &["text/plain"]), ("asmx", &["application/xml"]), ("aso", &["application/vnd.accpac.simply.aso"]), ("aspx", &["application/xml"]), ("asr", &["video/x-ms-asf"]), ("asx", &["video/x-ms-asf"]), ("atc", &["application/vnd.acucorp"]), ("atom", &["application/atom+xml"]), ("atomcat", &["application/atomcat+xml"]), ("atomsvc", &["application/atomsvc+xml"]), ("atx", &["application/vnd.antix.game-component"]), ("au", &["audio/basic"]), ("avi", &["video/x-msvideo"]), ("avif", &["image/avif"]), ("avifs", &["image/avif-sequence"]), ("aw", &["application/applixware"]), ("axa", &["audio/annodex"]), ("axs", &["application/olescript"]), ("axv", &["video/annodex"]), ("azf", &["application/vnd.airzip.filesecure.azf"]), ("azs", &["application/vnd.airzip.filesecure.azs"]), ("azw", &["application/vnd.amazon.ebook"]), ("bas", &["text/plain"]), ("bat", &["application/x-msdownload"]), ("bcpio", &["application/x-bcpio"]), ("bdf", &["application/x-font-bdf"]), ("bdm", &["application/vnd.syncml.dm+wbxml"]), ("bdoc", &["application/bdoc"]), ("bed", &["application/vnd.realvnc.bed"]), ("bh2", &["application/vnd.fujitsu.oasysprs"]), ("bin", &["application/octet-stream"]), ("blb", &["application/x-blorb"]), ("blorb", &["application/x-blorb"]), ("bmi", &["application/vnd.bmi"]), ("bmp", &["image/bmp"]), ("book", &["application/vnd.framemaker"]), ("box", &["application/vnd.previewsystems.box"]), ("boz", &["application/x-bzip2"]), ("bpk", &["application/octet-stream"]), ("btif", &["image/prs.btif"]), ("buffer", &["application/octet-stream"]), ("bz", &["application/x-bzip"]), ("bz2", &["application/x-bzip2"]), ("c", &["text/plain"]), ("c11amc", &["application/vnd.cluetrust.cartomobile-config"]), ( "c11amz", &["application/vnd.cluetrust.cartomobile-config-pkg"], ), ("c4d", &["application/vnd.clonk.c4group"]), ("c4f", &["application/vnd.clonk.c4group"]), ("c4g", &["application/vnd.clonk.c4group"]), ("c4p", &["application/vnd.clonk.c4group"]), ("c4u", &["application/vnd.clonk.c4group"]), ("cab", &["application/octet-stream"]), ("caf", &["audio/x-caf"]), ("calx", &["application/vnd.ms-office.calx"]), ("cap", &["application/vnd.tcpdump.pcap"]), ("car", &["application/vnd.curl.car"]), ("cat", &["application/vnd.ms-pki.seccat"]), ("cb7", &["application/x-cbr"]), ("cba", &["application/x-cbr"]), ("cbr", &["application/x-cbr"]), ("cbt", &["application/x-cbr"]), ("cbz", &["application/x-cbr"]), ("cc", &["text/plain"]), ("cco", &["application/x-cocoa"]), ("cct", &["application/x-director"]), ("ccxml", &["application/ccxml+xml"]), ("cd", &["text/plain"]), ("cdbcmsg", &["application/vnd.contact.cmsg"]), ("cdda", &["audio/aiff"]), ("cdf", &["application/x-cdf"]), ("cdkey", &["application/vnd.mediastation.cdkey"]), ("cdmia", &["application/cdmi-capability"]), ("cdmic", &["application/cdmi-container"]), ("cdmid", &["application/cdmi-domain"]), ("cdmio", &["application/cdmi-object"]), ("cdmiq", &["application/cdmi-queue"]), ("cdx", &["chemical/x-cdx"]), ("cdxml", &["application/vnd.chemdraw+xml"]), ("cdy", &["application/vnd.cinderella"]), ("cer", &["application/x-x509-ca-cert"]), ("cfg", &["text/plain"]), ("cfs", &["application/x-cfs-compressed"]), ("cgm", &["image/cgm"]), ("chat", &["application/x-chat"]), ("chm", &["application/vnd.ms-htmlhelp"]), ("chrt", &["application/vnd.kde.kchart"]), ("cif", &["chemical/x-cif"]), ( "cii", &["application/vnd.anser-web-certificate-issue-initiation"], ), ("cil", &["application/vnd.ms-artgalry"]), ("cla", &["application/vnd.claymore"]), ("class", &["application/x-java-applet"]), ("clkk", &["application/vnd.crick.clicker.keyboard"]), ("clkp", &["application/vnd.crick.clicker.palette"]), ("clkt", &["application/vnd.crick.clicker.template"]), ("clkw", &["application/vnd.crick.clicker.wordbank"]), ("clkx", &["application/vnd.crick.clicker"]), ("clp", &["application/x-msclip"]), ("cmc", &["application/vnd.cosmocaller"]), ("cmd", &["text/plain"]), ("cmdf", &["chemical/x-cmdf"]), ("cml", &["chemical/x-cml"]), ("cmp", &["application/vnd.yellowriver-custom-menu"]), ("cmx", &["image/x-cmx"]), ("cnf", &["text/plain"]), ("cod", &["image/cis-cod"]), ("coffee", &["text/coffeescript"]), ("com", &["application/x-msdownload"]), ("conf", &["text/plain"]), ("config", &["application/xml"]), ("contact", &["text/x-ms-contact"]), ("coverage", &["application/xml"]), ("cpio", &["application/x-cpio"]), ("cpp", &["text/plain"]), ("cpt", &["application/mac-compactpro"]), ("cr2", &["image/x-canon-cr2"]), ("cr3", &["image/x-canon-cr3"]), ("crd", &["application/x-mscardfile"]), ("crl", &["application/pkix-crl"]), ("crt", &["application/x-x509-ca-cert"]), ("crw", &["image/x-canon-crw"]), ("crx", &["application/x-chrome-extension"]), ("cryptonote", &["application/vnd.rig.cryptonote"]), ("cs", &["text/plain"]), ("csdproj", &["text/plain"]), ("csh", &["application/x-csh"]), ("csl", &["application/vnd.citationstyles.style+xml"]), ("csml", &["chemical/x-csml"]), ("csp", &["application/vnd.commonspace"]), ("csproj", &["text/plain"]), ("css", &["text/css"]), ("cst", &["application/x-director"]), ("csv", &["text/csv"]), ("cu", &["application/cu-seeme"]), ("cur", &["application/octet-stream"]), ("curl", &["text/vnd.curl"]), ("cww", &["application/prs.cww"]), ("cxt", &["application/x-director"]), ("cxx", &["text/plain"]), ("dae", &["model/vnd.collada+xml"]), ("daf", &["application/vnd.mobius.daf"]), ("dart", &["application/vnd.dart"]), ("dat", &["application/octet-stream"]), ("dataless", &["application/vnd.fdsn.seed"]), ("datasource", &["application/xml"]), ("davmount", &["application/davmount+xml"]), ("dbk", &["application/docbook+xml"]), ("dbproj", &["text/plain"]), ("dcr", &[ "application/x-director", "image/x-kodak-dcr", ]), ("dcurl", &["text/vnd.curl.dcurl"]), ("dd2", &["application/vnd.oma.dd2+xml"]), ("ddd", &["application/vnd.fujixerox.ddd"]), ("deb", &["application/octet-stream"]), ("def", &["text/plain"]), ("deploy", &["application/octet-stream"]), ("der", &["application/x-x509-ca-cert"]), ("dfac", &["application/vnd.dreamfactory"]), ("dgc", &["application/x-dgc-compressed"]), ("dgml", &["application/xml"]), ("dib", &["image/bmp"]), ("dic", &["text/x-c"]), ("dif", &["video/x-dv"]), ("dir", &["application/x-director"]), ("dis", &["application/vnd.mobius.dis"]), ("disco", &["text/xml"]), ( "disposition-notification", &["message/disposition-notification"], ), ("dist", &["application/octet-stream"]), ("distz", &["application/octet-stream"]), ("divx", &["video/divx"]), ("djv", &["image/vnd.djvu"]), ("djvu", &["image/vnd.djvu"]), ("dll", &["application/x-msdownload"]), ("dll.config", &["text/xml"]), ("dlm", &["text/dlm"]), ("dmg", &["application/octet-stream"]), ("dmp", &["application/vnd.tcpdump.pcap"]), ("dms", &["application/octet-stream"]), ("dna", &["application/vnd.dna"]), ("dng", &["image/x-adobe-dng"]), ("doc", &["application/msword"]), ( "docm", &["application/vnd.ms-word.document.macroEnabled.12"], ), ( "docx", &["application/vnd.openxmlformats-officedocument.wordprocessingml.document"], ), ("dot", &["application/msword"]), ( "dotm", &["application/vnd.ms-word.template.macroEnabled.12"], ), ( "dotx", &["application/vnd.openxmlformats-officedocument.wordprocessingml.template"], ), ("dp", &["application/vnd.osgi.dp"]), ("dpg", &["application/vnd.dpgraph"]), ("dra", &["audio/vnd.dra"]), ("dsc", &["text/prs.lines.tag"]), ("dsp", &["application/octet-stream"]), ("dssc", &["application/dssc+der"]), ("dsw", &["text/plain"]), ("dtb", &["application/x-dtbook+xml"]), ("dtd", &["text/xml"]), ("dts", &["audio/vnd.dts"]), ("dtsconfig", &["text/xml"]), ("dtshd", &["audio/vnd.dts.hd"]), ("dump", &["application/octet-stream"]), ("dv", &["video/x-dv"]), ("dvb", &["video/vnd.dvb.file"]), ("dvi", &["application/x-dvi"]), ("dwf", &["drawing/x-dwf"]), ("dwg", &["application/acad"]), ("dwp", &["application/octet-stream"]), ("dxf", &["application/x-dxf"]), ("dxp", &["application/vnd.spotfire.dxp"]), ("dxr", &["application/x-director"]), ("ear", &["application/java-archive"]), ("ecelp4800", &["audio/vnd.nuera.ecelp4800"]), ("ecelp7470", &["audio/vnd.nuera.ecelp7470"]), ("ecelp9600", &["audio/vnd.nuera.ecelp9600"]), ("ecma", &["text/javascript"]), ("edm", &["application/vnd.novadigm.edm"]), ("edx", &["application/vnd.novadigm.edx"]), ("efif", &["application/vnd.picsel"]), ("ei6", &["application/vnd.pg.osasli"]), ("elc", &["application/octet-stream"]), ("emf", &["application/x-msmetafile"]), ("eml", &["message/rfc822"]), ("emma", &["application/emma+xml"]), ("emz", &["application/octet-stream"]), ("eol", &["audio/vnd.digital-winds"]), ("eot", &["application/vnd.ms-fontobject"]), ("eps", &["application/postscript"]), ("epub", &["application/epub+zip"]), ("erf", &[ "application/x-endace-erf", "image/x-epson-erf", ]), ("es", &["text/javascript"]), ("es3", &["application/vnd.eszigno3+xml"]), ("esa", &["application/vnd.osgi.subsystem"]), ("esf", &["application/vnd.epson.esf"]), ("et3", &["application/vnd.eszigno3+xml"]), ("etl", &["application/etl"]), ("etx", &["text/x-setext"]), ("eva", &["application/x-eva"]), ("evy", &["application/envoy"]), ("exe", &["application/octet-stream"]), ("exe.config", &["text/xml"]), ("exi", &["application/exi"]), ("ext", &["application/vnd.novadigm.ext"]), ("ez", &["application/andrew-inset"]), ("ez2", &["application/vnd.ezpix-album"]), ("ez3", &["application/vnd.ezpix-package"]), ("f", &["text/x-fortran"]), ("f4v", &["video/x-f4v"]), ("f77", &["text/x-fortran"]), ("f90", &["text/x-fortran"]), ("fbs", &["image/vnd.fastbidsheet"]), ("fcdt", &["application/vnd.adobe.formscentral.fcdt"]), ("fcs", &["application/vnd.isac.fcs"]), ("fdf", &["application/vnd.fdf"]), ("fe_launch", &["application/vnd.denovo.fcselayout-link"]), ("feature", &["text/x-gherkin"]), ("fg5", &["application/vnd.fujitsu.oasysgp"]), ("fgd", &["application/x-director"]), ("fh", &["image/x-freehand"]), ("fh4", &["image/x-freehand"]), ("fh5", &["image/x-freehand"]), ("fh7", &["image/x-freehand"]), ("fhc", &["image/x-freehand"]), ("fif", &["application/fractals"]), ("fig", &["application/x-xfig"]), ("filters", &["application/xml"]), ("fla", &["application/octet-stream"]), ("flac", &["audio/flac"]), ("fli", &["video/x-fli"]), ("flo", &["application/vnd.micrografx.flo"]), ("flr", &["x-world/x-vrml"]), ("flv", &["video/x-flv"]), ("flw", &["application/vnd.kde.kivio"]), ("flx", &["text/vnd.fmi.flexstor"]), ("fly", &["text/vnd.fly"]), ("fm", &["application/vnd.framemaker"]), ("fnc", &["application/vnd.frogans.fnc"]), ("for", &["text/x-fortran"]), ("fpx", &["image/vnd.fpx"]), ("frame", &["application/vnd.framemaker"]), ("fsc", &["application/vnd.fsc.weblaunch"]), ("fsscript", &["application/fsharp-script"]), ("fst", &["image/vnd.fst"]), ("fsx", &["application/fsharp-script"]), ("ftc", &["application/vnd.fluxtime.clip"]), ( "fti", &["application/vnd.anser-web-funds-transfer-initiation"], ), ("fvt", &["video/vnd.fvt"]), ("fxp", &["application/vnd.adobe.fxp"]), ("fxpl", &["application/vnd.adobe.fxp"]), ("fzs", &["application/vnd.fuzzysheet"]), ("g2w", &["application/vnd.geoplan"]), ("g3", &["image/g3fax"]), ("g3w", &["application/vnd.geospace"]), ("gac", &["application/vnd.groove-account"]), ("gam", &["application/x-tads"]), ("gbr", &["application/rpki-ghostbusters"]), ("gca", &["application/x-gca-compressed"]), ("gdl", &["model/vnd.gdl"]), ("gdoc", &["application/vnd.google-apps.document"]), ("gemini", &["text/gemini"]), ("generictest", &["application/xml"]), ("geo", &["application/vnd.dynageo"]), ("geojson", &["application/geo+json"]), ("gex", &["application/vnd.geometry-explorer"]), ("ggb", &["application/vnd.geogebra.file"]), ("ggt", &["application/vnd.geogebra.tool"]), ("ghf", &["application/vnd.groove-help"]), ("gif", &["image/gif"]), ("gim", &["application/vnd.groove-identity-message"]), ("glb", &["model/gltf-binary"]), ("gltf", &["model/gltf+json"]), ("gmi", &["text/gemini"]), ("gml", &["application/gml+xml"]), ("gmx", &["application/vnd.gmx"]), ("gnumeric", &["application/x-gnumeric"]), ("gph", &["application/vnd.flographit"]), ("gpx", &["application/gpx+xml"]), ("gqf", &["application/vnd.grafeq"]), ("gqs", &["application/vnd.grafeq"]), ("gram", &["application/srgs"]), ("gramps", &["application/x-gramps-xml"]), ("gre", &["application/vnd.geometry-explorer"]), ("group", &["text/x-ms-group"]), ("grv", &["application/vnd.groove-injector"]), ("grxml", &["application/srgs+xml"]), ("gsf", &["application/x-font-ghostscript"]), ("gsheet", &["application/vnd.google-apps.spreadsheet"]), ("gslides", &["application/vnd.google-apps.presentation"]), ("gsm", &["audio/x-gsm"]), ("gtar", &["application/x-gtar"]), ("gtm", &["application/vnd.groove-tool-message"]), ("gtw", &["model/vnd.gtw"]), ("gv", &["text/vnd.graphviz"]), ("gxf", &["application/gxf"]), ("gxt", &["application/vnd.geonext"]), ("gz", &["application/gzip", "application/x-gzip"]), ("h", &["text/plain"]), ("h261", &["video/h261"]), ("h263", &["video/h263"]), ("h264", &["video/h264"]), ("hal", &["application/vnd.hal+xml"]), ("hbci", &["application/vnd.hbci"]), ("hbs", &["text/x-handlebars-template"]), ("hdd", &["application/x-virtualbox-hdd"]), ("hdf", &["application/x-hdf"]), ("hdml", &["text/x-hdml"]), ("hdr", &["image/vnd.radiance"]), ("heic", &["image/heic"]), ("heics", &["image/heic-sequence"]), ("heif", &["image/heif"]), ("heifs", &["image/heif-sequence"]), ("hh", &["text/plain"]), ("hhc", &["application/x-oleobject"]), ("hhk", &["application/octet-stream"]), ("hhp", &["application/octet-stream"]), ("hjson", &["application/hjson"]), ("hlp", &["application/winhlp"]), ("hpgl", &["application/vnd.hp-hpgl"]), ("hpid", &["application/vnd.hp-hpid"]), ("hpp", &["text/plain"]), ("hps", &["application/vnd.hp-hps"]), ("hqx", &["application/mac-binhex40"]), ("hta", &["application/hta"]), ("htc", &["text/x-component"]), ("htke", &["application/vnd.kenameaapp"]), ("htm", &["text/html"]), ("html", &["text/html"]), ("htt", &["text/webviewhtml"]), ("hvd", &["application/vnd.yamaha.hv-dic"]), ("hvp", &["application/vnd.yamaha.hv-voice"]), ("hvs", &["application/vnd.yamaha.hv-script"]), ("hxa", &["application/xml"]), ("hxc", &["application/xml"]), ("hxd", &["application/octet-stream"]), ("hxe", &["application/xml"]), ("hxf", &["application/xml"]), ("hxh", &["application/octet-stream"]), ("hxi", &["application/octet-stream"]), ("hxk", &["application/xml"]), ("hxq", &["application/octet-stream"]), ("hxr", &["application/octet-stream"]), ("hxs", &["application/octet-stream"]), ("hxt", &["text/html"]), ("hxv", &["application/xml"]), ("hxw", &["application/octet-stream"]), ("hxx", &["text/plain"]), ("i", &["text/plain"]), ("i2g", &["application/vnd.intergeo"]), ("icc", &["application/vnd.iccprofile"]), ("ice", &["x-conference/x-cooltalk"]), ("icm", &["application/vnd.iccprofile"]), ("ico", &["image/x-icon"]), ("ics", &["text/calendar"]), ("idl", &["text/plain"]), ("ief", &["image/ief"]), ("ifb", &["text/calendar"]), ("ifm", &["application/vnd.shana.informed.formdata"]), ("iges", &["model/iges"]), ("igl", &["application/vnd.igloader"]), ("igm", &["application/vnd.insors.igm"]), ("igs", &["model/iges"]), ("igx", &["application/vnd.micrografx.igx"]), ("iif", &["application/vnd.shana.informed.interchange"]), ("iii", &["application/x-iphone"]), ("img", &["application/octet-stream"]), ("imp", &["application/vnd.accpac.simply.imp"]), ("ims", &["application/vnd.ms-ims"]), ("in", &["text/plain"]), ("inc", &["text/plain"]), ("inf", &["application/octet-stream"]), ("ini", &["text/plain"]), ("ink", &["application/inkml+xml"]), ("inkml", &["application/inkml+xml"]), ("inl", &["text/plain"]), ("ins", &["application/x-internet-signup"]), ("install", &["application/x-install-instructions"]), ("iota", &["application/vnd.astraea-software.iota"]), ("ipa", &["application/x-itunes-ipa"]), ("ipfix", &["application/ipfix"]), ("ipg", &["application/x-itunes-ipg"]), ("ipk", &["application/vnd.shana.informed.package"]), ("ipproj", &["text/plain"]), ("ipsw", &["application/x-itunes-ipsw"]), ("iqy", &["text/x-ms-iqy"]), ("irm", &["application/vnd.ibm.rights-management"]), ("irp", &["application/vnd.irepository.package+xml"]), ("iso", &["application/octet-stream"]), ("isp", &["application/x-internet-signup"]), ("ite", &["application/x-itunes-ite"]), ("itlp", &["application/x-itunes-itlp"]), ("itms", &["application/x-itunes-itms"]), ("itp", &["application/vnd.shana.informed.formtemplate"]), ("itpc", &["application/x-itunes-itpc"]), ("ivf", &["video/x-ivf"]), ("ivp", &["application/vnd.immervision-ivp"]), ("ivu", &["application/vnd.immervision-ivu"]), ("jad", &["text/vnd.sun.j2me.app-descriptor"]), ("jade", &["text/jade"]), ("jam", &["application/vnd.jam"]), ("jar", &["application/java-archive"]), ("jardiff", &["application/x-java-archive-diff"]), ("java", &["application/octet-stream"]), ("jck", &["application/liquidmotion"]), ("jcz", &["application/liquidmotion"]), ("jfif", &["image/jpeg"]), ("jisp", &["application/vnd.jisp"]), ("jlt", &["application/vnd.hp-jlyt"]), ("jng", &["image/x-jng"]), ("jnlp", &["application/x-java-jnlp-file"]), ("joda", &["application/vnd.joost.joda-archive"]), ("jp2", &["image/jp2"]), ("jpb", &["application/octet-stream"]), ("jpe", &["image/jpeg"]), ("jpeg", &["image/jpeg"]), ("jpf", &["image/jpx"]), ("jpg", &["image/jpeg"]), ("jpg2", &["image/jp2"]), ("jpgm", &["video/jpm"]), ("jpgv", &["video/jpeg"]), ("jpm", &["image/jpm"]), ("jpx", &["image/jpx"]), ("js", &["text/javascript"]), ("jsm", &["text/javascript"]), ("json", &["application/json"]), ("json5", &["application/json5"]), ("jsonld", &["application/ld+json"]), ("jsonml", &["application/jsonml+json"]), ("jsx", &["text/javascript"]), ("jsxbin", &["text/plain"]), ("jxl", &["image/jxl"]), ("k25", &["image/x-kodak-k25"]), ("kar", &["audio/midi"]), ("karbon", &["application/vnd.kde.karbon"]), ("kdc", &["image/x-kodak-kdc"]), ("kfo", &["application/vnd.kde.kformula"]), ("kia", &["application/vnd.kidspiration"]), ("kml", &["application/vnd.google-earth.kml+xml"]), ("kmz", &["application/vnd.google-earth.kmz"]), ("kne", &["application/vnd.kinar"]), ("knp", &["application/vnd.kinar"]), ("kon", &["application/vnd.kde.kontour"]), ("kpr", &["application/vnd.kde.kpresenter"]), ("kpt", &["application/vnd.kde.kpresenter"]), ("kpxx", &["application/vnd.ds-keypoint"]), ("ksp", &["application/vnd.kde.kspread"]), ("ktr", &["application/vnd.kahootz"]), ("ktx", &["image/ktx"]), ("ktz", &["application/vnd.kahootz"]), ("kwd", &["application/vnd.kde.kword"]), ("kwt", &["application/vnd.kde.kword"]), ("lasxml", &["application/vnd.las.las+xml"]), ("latex", &["application/x-latex"]), ( "lbd", &["application/vnd.llamagraphics.life-balance.desktop"], ), ( "lbe", &["application/vnd.llamagraphics.life-balance.exchange+xml"], ), ("les", &["application/vnd.hhe.lesson-player"]), ("less", &["text/less"]), ("lha", &["application/x-lzh-compressed"]), ("library-ms", &["application/windows-library+xml"]), ("link66", &["application/vnd.route66.link66+xml"]), ("list", &["text/plain"]), ("list3820", &["application/vnd.ibm.modcap"]), ("listafp", &["application/vnd.ibm.modcap"]), ("lit", &["application/x-ms-reader"]), ("litcoffee", &["text/coffeescript"]), ("lnk", &["application/x-ms-shortcut"]), ("loadtest", &["application/xml"]), ("log", &["text/plain"]), ("lostxml", &["application/lost+xml"]), ("lpk", &["application/octet-stream"]), ("lrf", &["application/octet-stream"]), ("lrm", &["application/vnd.ms-lrm"]), ("lsf", &["video/x-la-asf"]), ("lst", &["text/plain"]), ("lsx", &["video/x-la-asf"]), ("ltf", &["application/vnd.frogans.ltf"]), ("lua", &["text/x-lua"]), ("luac", &["application/x-lua-bytecode"]), ("lvp", &["audio/vnd.lucent.voice"]), ("lwp", &["application/vnd.lotus-wordpro"]), ("lzh", &["application/octet-stream"]), ("m13", &["application/x-msmediaview"]), ("m14", &["application/x-msmediaview"]), ("m1v", &["video/mpeg"]), ("m21", &["application/mp21"]), ("m2a", &["audio/mpeg"]), ("m2t", &["video/vnd.dlna.mpeg-tts"]), ("m2ts", &["video/vnd.dlna.mpeg-tts"]), ("m2v", &["video/mpeg"]), ("m3a", &["audio/mpeg"]), ("m3u", &["audio/x-mpegurl"]), ("m3u8", &["audio/x-mpegurl"]), ("m4a", &["audio/m4a"]), ("m4b", &["audio/m4b"]), ("m4p", &["audio/m4p"]), ("m4r", &["audio/x-m4r"]), ("m4u", &["video/vnd.mpegurl"]), ("m4v", &["video/x-m4v"]), ("ma", &["application/mathematica"]), ("mac", &["image/x-macpaint"]), ("mads", &["application/mads+xml"]), ("mag", &["application/vnd.ecowin.chart"]), ("mak", &["text/plain"]), ("maker", &["application/vnd.framemaker"]), ("man", &["application/x-troff-man"]), ("manifest", &["application/x-ms-manifest"]), ("map", &["text/plain"]), ("mar", &["application/octet-stream"]), ("markdown", &["text/markdown"]), ("master", &["application/xml"]), ("mathml", &["application/mathml+xml"]), ("mb", &["application/mathematica"]), ("mbk", &["application/vnd.mobius.mbk"]), ("mbox", &["application/mbox"]), ("mc1", &["application/vnd.medcalcdata"]), ("mcd", &["application/vnd.mcd"]), ("mcurl", &["text/vnd.curl.mcurl"]), ("md", &["text/markdown", "text/x-markdown"]), ("mda", &["application/msaccess"]), ("mdb", &["application/x-msaccess"]), ("mde", &["application/msaccess"]), ("mdi", &["image/vnd.ms-modi"]), ("mdp", &["application/octet-stream"]), ("me", &["application/x-troff-me"]), ("mesh", &["model/mesh"]), ("meta4", &["application/metalink4+xml"]), ("metalink", &["application/metalink+xml"]), ("mets", &["application/mets+xml"]), ("mfm", &["application/vnd.mfmp"]), ("mfp", &["application/x-shockwave-flash"]), ("mft", &["application/rpki-manifest"]), ("mgp", &["application/vnd.osgeo.mapguide.package"]), ("mgz", &["application/vnd.proteus.magazine"]), ("mht", &["message/rfc822"]), ("mhtml", &["message/rfc822"]), ("mid", &["audio/mid"]), ("midi", &["audio/mid"]), ("mie", &["application/x-mie"]), ("mif", &["application/vnd.mif"]), ("mime", &["message/rfc822"]), ("mix", &["application/octet-stream"]), ("mj2", &["video/mj2"]), ("mjp2", &["video/mj2"]), ("mjs", &["application/javascript"]), ("mk", &["text/plain"]), ("mk3d", &["video/x-matroska"]), ("mka", &["audio/x-matroska"]), ("mkd", &["text/x-markdown"]), ("mks", &["video/x-matroska"]), ("mkv", &["video/x-matroska"]), ("mlp", &["application/vnd.dolby.mlp"]), ("mmd", &["application/vnd.chipnuts.karaoke-mmd"]), ("mmf", &["application/x-smaf"]), ("mml", &["text/mathml"]), ("mmr", &["image/vnd.fujixerox.edmics-mmr"]), ("mng", &["video/x-mng"]), ("mno", &["text/xml"]), ("mny", &["application/x-msmoney"]), ("mobi", &["application/x-mobipocket-ebook"]), ("mod", &["video/mpeg"]), ("mods", &["application/mods+xml"]), ("mov", &["video/quicktime"]), ("movie", &["video/x-sgi-movie"]), ("mp2", &["audio/mpeg", "video/mpeg"]), ("mp21", &["application/mp21"]), ("mp2a", &["audio/mpeg"]), ("mp2v", &["video/mpeg"]), ("mp3", &["audio/mpeg"]), ("mp4", &["video/mp4"]), ("mp4a", &["audio/mp4"]), ("mp4s", &["application/mp4"]), ("mp4v", &["video/mp4"]), ("mpa", &["video/mpeg"]), ("mpc", &["application/vnd.mophun.certificate"]), ("mpd", &["application/dash+xml"]), ("mpe", &["video/mpeg"]), ("mpeg", &["video/mpeg"]), ("mpf", &["application/vnd.ms-mediapackage"]), ("mpg", &["video/mpeg"]), ("mpg4", &["video/mp4"]), ("mpga", &["audio/mpeg"]), ("mpkg", &["application/vnd.apple.installer+xml"]), ("mpm", &["application/vnd.blueice.multipass"]), ("mpn", &["application/vnd.mophun.application"]), ("mpp", &["application/vnd.ms-project"]), ("mpt", &["application/vnd.ms-project"]), ("mpv2", &["video/mpeg"]), ("mpy", &["application/vnd.ibm.minipay"]), ("mqv", &["video/quicktime"]), ("mqy", &["application/vnd.mobius.mqy"]), ("mrc", &["application/marc"]), ("mrcx", &["application/marcxml+xml"]), ("mrw", &["image/x-minolta-mrw"]), ("ms", &["application/x-troff-ms"]), ("mscml", &["application/mediaservercontrol+xml"]), ("mseed", &["application/vnd.fdsn.mseed"]), ("mseq", &["application/vnd.mseq"]), ("msf", &["application/vnd.epson.msf"]), ("msg", &["application/vnd.ms-outlook"]), ("msh", &["model/mesh"]), ("msi", &["application/octet-stream"]), ("msl", &["application/vnd.mobius.msl"]), ("msm", &["application/octet-stream"]), ("mso", &["application/octet-stream"]), ("msp", &["application/octet-stream"]), ("msty", &["application/vnd.muvee.style"]), ("mts", &["video/vnd.dlna.mpeg-tts"]), ("mtx", &["application/xml"]), ("mus", &["application/vnd.musician"]), ("musicxml", &["application/vnd.recordare.musicxml+xml"]), ("mvb", &["application/x-msmediaview"]), ("mvc", &["application/x-miva-compiled"]), ("mwf", &["application/vnd.mfer"]), ("mxf", &["application/mxf"]), ("mxl", &["application/vnd.recordare.musicxml"]), ("mxml", &["application/xv+xml"]), ("mxp", &["application/x-mmxp"]), ("mxs", &["application/vnd.triscape.mxs"]), ("mxu", &["video/vnd.mpegurl"]), ("n-gage", &["application/vnd.nokia.n-gage.symbian.install"]), ("n3", &["text/n3"]), ("nb", &["application/mathematica"]), ("nbp", &["application/vnd.wolfram.player"]), ("nc", &["application/x-netcdf"]), ("ncx", &["application/x-dtbncx+xml"]), ("nef", &["image/x-nikon-nef"]), ("nfo", &["text/x-nfo"]), ("ngdat", &["application/vnd.nokia.n-gage.data"]), ("nitf", &["application/vnd.nitf"]), ("nlu", &["application/vnd.neurolanguage.nlu"]), ("nml", &["application/vnd.enliven"]), ("nnd", &["application/vnd.noblenet-directory"]), ("nns", &["application/vnd.noblenet-sealer"]), ("nnw", &["application/vnd.noblenet-web"]), ("npx", &["image/vnd.net-fpx"]), ("nq", &["application/n-quads"]), ("nrw", &["image/x-nikon-nrw"]), ("nsc", &["video/x-ms-asf"]), ("nsf", &["application/vnd.lotus-notes"]), ("nt", &["application/n-triples"]), ("ntf", &["application/vnd.nitf"]), ("nws", &["message/rfc822"]), ("nzb", &["application/x-nzb"]), ("oa2", &["application/vnd.fujitsu.oasys2"]), ("oa3", &["application/vnd.fujitsu.oasys3"]), ("oas", &["application/vnd.fujitsu.oasys"]), ("obd", &["application/x-msbinder"]), ("obj", &["application/x-tgif"]), ("ocx", &["application/octet-stream"]), ("oda", &["application/oda"]), ("odb", &["application/vnd.oasis.opendocument.database"]), ("odc", &["application/vnd.oasis.opendocument.chart"]), ("odf", &["application/vnd.oasis.opendocument.formula"]), ( "odft", &["application/vnd.oasis.opendocument.formula-template"], ), ("odg", &["application/vnd.oasis.opendocument.graphics"]), ("odh", &["text/plain"]), ("odi", &["application/vnd.oasis.opendocument.image"]), ("odl", &["text/plain"]), ("odm", &["application/vnd.oasis.opendocument.text-master"]), ("odp", &["application/vnd.oasis.opendocument.presentation"]), ("ods", &["application/vnd.oasis.opendocument.spreadsheet"]), ("odt", &["application/vnd.oasis.opendocument.text"]), ("oga", &["audio/ogg"]), ("ogg", &["audio/ogg"]), ("ogv", &["video/ogg"]), ("ogx", &["application/ogg"]), ("omdoc", &["application/omdoc+xml"]), ("one", &["application/onenote"]), ("onea", &["application/onenote"]), ("onepkg", &["application/onenote"]), ("onetmp", &["application/onenote"]), ("onetoc", &["application/onenote"]), ("onetoc2", &["application/onenote"]), ("opf", &["application/oebps-package+xml"]), ("opml", &["text/x-opml"]), ("oprc", &["application/vnd.palm"]), ("opus", &["audio/ogg"]), ("orderedtest", &["application/xml"]), ("orf", &["image/x-olympus-orf"]), ("org", &["application/vnd.lotus-organizer"]), ("osdx", &["application/opensearchdescription+xml"]), ("osf", &["application/vnd.yamaha.openscoreformat"]), ( "osfpvg", &["application/vnd.yamaha.openscoreformat.osfpvg+xml"], ), ( "otc", &["application/vnd.oasis.opendocument.chart-template"], ), ("otf", &["application/font-sfnt"]), ( "otg", &["application/vnd.oasis.opendocument.graphics-template"], ), ("oth", &["application/vnd.oasis.opendocument.text-web"]), ( "oti", &["application/vnd.oasis.opendocument.image-template"], ), ( "otp", &["application/vnd.oasis.opendocument.presentation-template"], ), ( "ots", &["application/vnd.oasis.opendocument.spreadsheet-template"], ), ("ott", &["application/vnd.oasis.opendocument.text-template"]), ("ova", &["application/x-virtualbox-ova"]), ("ovf", &["application/x-virtualbox-ovf"]), ("oxps", &["application/oxps"]), ("oxt", &["application/vnd.openofficeorg.extension"]), ("p", &["text/x-pascal"]), ("p10", &["application/pkcs10"]), ("p12", &["application/x-pkcs12"]), ("p7b", &["application/x-pkcs7-certificates"]), ("p7c", &["application/pkcs7-mime"]), ("p7m", &["application/pkcs7-mime"]), ("p7r", &["application/x-pkcs7-certreqresp"]), ("p7s", &["application/pkcs7-signature"]), ("p8", &["application/pkcs8"]), ("pac", &["application/x-ns-proxy-autoconfig"]), ("parquet", &["application/vnd.apache.parquet", "application/x-parquet"]), ("pas", &["text/x-pascal"]), ("paw", &["application/vnd.pawaafile"]), ("pbd", &["application/vnd.powerbuilder6"]), ("pbm", &["image/x-portable-bitmap"]), ("pcap", &["application/vnd.tcpdump.pcap"]), ("pcast", &["application/x-podcast"]), ("pcf", &["application/x-font-pcf"]), ("pcl", &["application/vnd.hp-pcl"]), ("pclxl", &["application/vnd.hp-pclxl"]), ("pct", &["image/pict"]), ("pcurl", &["application/vnd.curl.pcurl"]), ("pcx", &["application/octet-stream"]), ("pcz", &["application/octet-stream"]), ("pdb", &["application/vnd.palm"]), ("pde", &["text/x-processing"]), ("pdf", &["application/pdf"]), ("pef", &["image/x-pentax-pef"]), ("pem", &["application/x-x509-ca-cert"]), ("pfa", &["application/x-font-type1"]), ("pfb", &["application/octet-stream"]), ("pfm", &["application/octet-stream"]), ("pfr", &["application/font-tdpfr"]), ("pfx", &["application/x-pkcs12"]), ("pgm", &["image/x-portable-graymap"]), ("pgn", &["application/x-chess-pgn"]), ("pgp", &["application/pgp-encrypted"]), ("php", &["application/x-httpd-php"]), ("pic", &["image/pict"]), ("pict", &["image/pict"]), ("pkg", &["application/octet-stream"]), ("pkgdef", &["text/plain"]), ("pkgundef", &["text/plain"]), ("pki", &["application/pkixcmp"]), ("pkipath", &["application/pkix-pkipath"]), ("pko", &["application/vnd.ms-pki.pko"]), ("pkpass", &["application/vnd.apple.pkpass"]), ("pl", &["application/x-perl"]), ("plb", &["application/vnd.3gpp.pic-bw-large"]), ("plc", &["application/vnd.mobius.plc"]), ("plf", &["application/vnd.pocketlearn"]), ("pls", &["audio/scpls"]), ("pm", &["application/x-perl"]), ("pma", &["application/x-perfmon"]), ("pmc", &["application/x-perfmon"]), ("pml", &["application/x-perfmon"]), ("pmr", &["application/x-perfmon"]), ("pmw", &["application/x-perfmon"]), ("png", &["image/png"]), ("pnm", &["image/x-portable-anymap"]), ("pnt", &["image/x-macpaint"]), ("pntg", &["image/x-macpaint"]), ("pnz", &["image/png"]), ("portpkg", &["application/vnd.macports.portpkg"]), ("pot", &["application/vnd.ms-powerpoint"]), ( "potm", &["application/vnd.ms-powerpoint.template.macroEnabled.12"], ), ( "potx", &["application/vnd.openxmlformats-officedocument.presentationml.template"], ), ("ppa", &["application/vnd.ms-powerpoint"]), ( "ppam", &["application/vnd.ms-powerpoint.addin.macroEnabled.12"], ), ("ppd", &["application/vnd.cups-ppd"]), ("ppm", &["image/x-portable-pixmap"]), ("pps", &["application/vnd.ms-powerpoint"]), ( "ppsm", &["application/vnd.ms-powerpoint.slideshow.macroEnabled.12"], ), ( "ppsx", &["application/vnd.openxmlformats-officedocument.presentationml.slideshow"], ), ("ppt", &["application/vnd.ms-powerpoint"]), ( "pptm", &["application/vnd.ms-powerpoint.presentation.macroEnabled.12"], ), ( "pptx", &["application/vnd.openxmlformats-officedocument.presentationml.presentation"], ), ("pqa", &["application/vnd.palm"]), ("prc", &["application/x-mobipocket-ebook"]), ("pre", &["application/vnd.lotus-freelance"]), ("prf", &["application/pics-rules"]), ("prm", &["application/octet-stream"]), ("prx", &["application/octet-stream"]), ("ps", &["application/postscript"]), ("psb", &["application/vnd.3gpp.pic-bw-small"]), ("psc1", &["application/PowerShell"]), ("psd", &["application/octet-stream"]), ("psess", &["application/xml"]), ("psf", &["application/x-font-linux-psf"]), ("pskcxml", &["application/pskc+xml"]), ("psm", &["application/octet-stream"]), ("psp", &["application/octet-stream"]), ("pst", &["application/vnd.ms-outlook"]), ("ptid", &["application/vnd.pvi.ptid1"]), ("pub", &["application/x-mspublisher"]), ("pvb", &["application/vnd.3gpp.pic-bw-var"]), ("pwn", &["application/vnd.3m.post-it-notes"]), ("pwz", &["application/vnd.ms-powerpoint"]), ("py", &["text/plain"]), ("pya", &["audio/vnd.ms-playready.media.pya"]), ("pyv", &["video/vnd.ms-playready.media.pyv"]), ("qam", &["application/vnd.epson.quickanime"]), ("qbo", &["application/vnd.intu.qbo"]), ("qfx", &["application/vnd.intu.qfx"]), ("qht", &["text/x-html-insertion"]), ("qhtm", &["text/x-html-insertion"]), ("qps", &["application/vnd.publishare-delta-tree"]), ("qt", &["video/quicktime"]), ("qti", &["image/x-quicktime"]), ("qtif", &["image/x-quicktime"]), ("qtl", &["application/x-quicktimeplayer"]), ("qwd", &["application/vnd.quark.quarkxpress"]), ("qwt", &["application/vnd.quark.quarkxpress"]), ("qxb", &["application/vnd.quark.quarkxpress"]), ("qxd", &["application/octet-stream"]), ("qxl", &["application/vnd.quark.quarkxpress"]), ("qxt", &["application/vnd.quark.quarkxpress"]), ("ra", &["audio/x-pn-realaudio"]), ("raf", &["image/x-fuji-raf"]), ("ram", &["audio/x-pn-realaudio"]), ("raml", &["application/raml+yaml"]), ("rar", &["application/x-rar-compressed"]), ("ras", &["image/x-cmu-raster"]), ("rat", &["application/rat-file"]), ("raw", &["image/x-panasonic-rw"]), ("rc", &["text/plain"]), ("rc2", &["text/plain"]), ("rcprofile", &["application/vnd.ipunplugged.rcprofile"]), ("rct", &["text/plain"]), ("rdf", &["application/rdf+xml"]), ("rdlc", &["application/xml"]), ("rdz", &["application/vnd.data-vision.rdz"]), ("reg", &["text/plain"]), ("rep", &["application/vnd.businessobjects"]), ("res", &["application/x-dtbresource+xml"]), ("resx", &["application/xml"]), ("rf", &["image/vnd.rn-realflash"]), ("rgb", &["image/x-rgb"]), ("rgs", &["text/plain"]), ("rif", &["application/reginfo+xml"]), ("rip", &["audio/vnd.rip"]), ("ris", &["application/x-research-info-systems"]), ("rl", &["application/resource-lists+xml"]), ("rlc", &["image/vnd.fujixerox.edmics-rlc"]), ("rld", &["application/resource-lists-diff+xml"]), ("rm", &["application/vnd.rn-realmedia"]), ("rmi", &["audio/mid"]), ("rmp", &["application/vnd.rn-rn_music_package"]), ("rms", &["application/vnd.jcp.javame.midlet-rms"]), ("rmvb", &["application/vnd.rn-realmedia-vbr"]), ("rnc", &["application/relax-ng-compact-syntax"]), ("rng", &["application/xml"]), ("roa", &["application/rpki-roa"]), ("roff", &["application/x-troff"]), ("rp9", &["application/vnd.cloanto.rp9"]), ("rpm", &["audio/x-pn-realaudio-plugin"]), ("rpss", &["application/vnd.nokia.radio-presets"]), ("rpst", &["application/vnd.nokia.radio-preset"]), ("rq", &["application/sparql-query"]), ("rqy", &["text/x-ms-rqy"]), ("rs", &["text/x-rust"]), ("rsd", &["application/rsd+xml"]), ("rss", &["application/rss+xml"]), ("rtf", &["application/rtf"]), ("rtx", &["text/richtext"]), ("ruleset", &["application/xml"]), ("run", &["application/x-makeself"]), ("rvt", &["application/octet-stream"]), ("rw2", &["image/x-panasonic-rw2"]), ("rwl", &["image/x-panasonic-rw2"]), ("s", &["text/plain"]), ("s3m", &["audio/s3m"]), ("saf", &["application/vnd.yamaha.smaf-audio"]), ("safariextz", &["application/x-safari-safariextz"]), ("sass", &["text/x-sass"]), ("sbml", &["application/sbml+xml"]), ("sc", &["application/vnd.ibm.secure-container"]), ("scd", &["application/x-msschedule"]), ("scm", &["application/vnd.lotus-screencam"]), ("scq", &["application/scvp-cv-request"]), ("scr", &["text/plain"]), ("scs", &["application/scvp-cv-response"]), ("scss", &["text/x-scss"]), ("sct", &["text/scriptlet"]), ("scurl", &["text/vnd.curl.scurl"]), ("sd2", &["audio/x-sd2"]), ("sda", &["application/vnd.stardivision.draw"]), ("sdc", &["application/vnd.stardivision.calc"]), ("sdd", &["application/vnd.stardivision.impress"]), ("sdkd", &["application/vnd.solent.sdkm+xml"]), ("sdkm", &["application/vnd.solent.sdkm+xml"]), ("sdp", &["application/sdp"]), ("sdw", &["application/vnd.stardivision.writer"]), ("sea", &["application/octet-stream"]), ( "searchconnector-ms", &["application/windows-search-connector+xml"], ), ("see", &["application/vnd.seemail"]), ("seed", &["application/vnd.fdsn.seed"]), ("sema", &["application/vnd.sema"]), ("semd", &["application/vnd.semd"]), ("semf", &["application/vnd.semf"]), ("ser", &["application/java-serialized-object"]), ("setpay", &["application/set-payment-initiation"]), ("setreg", &["application/set-registration-initiation"]), ("settings", &["application/xml"]), ("sfd-hdstx", &["application/vnd.hydrostatix.sof-data"]), ("sfs", &["application/vnd.spotfire.sfs"]), ("sfv", &["text/x-sfv"]), ("sgi", &["image/sgi"]), ("sgimb", &["application/x-sgimb"]), ("sgl", &["application/vnd.stardivision.writer-global"]), ("sgm", &["text/sgml"]), ("sgml", &["text/sgml"]), ("sh", &["application/x-sh"]), ("shar", &["application/x-shar"]), ("shex", &["text/shex"]), ("shf", &["application/shf+xml"]), ("shtml", &["text/html"]), ("sid", &["image/x-mrsid-image"]), ("sig", &["application/pgp-signature"]), ("sil", &["audio/silk"]), ("silo", &["model/mesh"]), ("sis", &["application/vnd.symbian.install"]), ("sisx", &["application/vnd.symbian.install"]), ("sit", &["application/x-stuffit"]), ("sitemap", &["application/xml"]), ("sitx", &["application/x-stuffitx"]), ("skd", &["application/vnd.koan"]), ("skin", &["application/xml"]), ("skm", &["application/vnd.koan"]), ("skp", &["application/x-koan"]), ("skt", &["application/vnd.koan"]), ( "sldm", &["application/vnd.ms-powerpoint.slide.macroEnabled.12"], ), ( "sldx", &["application/vnd.openxmlformats-officedocument.presentationml.slide"], ), ("slim", &["text/slim"]), ("slk", &["application/vnd.ms-excel"]), ("slm", &["text/slim"]), ("sln", &["text/plain"]), ("slt", &["application/vnd.epson.salt"]), ("slupkg-ms", &["application/x-ms-license"]), ("sm", &["application/vnd.stepmania.stepchart"]), ("smd", &["audio/x-smd"]), ("smf", &["application/vnd.stardivision.math"]), ("smi", &["application/octet-stream"]), ("smil", &["application/smil+xml"]), ("smv", &["video/x-smv"]), ("smx", &["audio/x-smd"]), ("smz", &["audio/x-smd"]), ("smzip", &["application/vnd.stepmania.package"]), ("snd", &["audio/basic"]), ("snf", &["application/x-font-snf"]), ("snippet", &["application/xml"]), ("snp", &["application/octet-stream"]), ("so", &["application/octet-stream"]), ("sol", &["text/plain"]), ("sor", &["text/plain"]), ("spc", &["application/x-pkcs7-certificates"]), ("spf", &["application/vnd.yamaha.smaf-phrase"]), ("spl", &["application/futuresplash"]), ("spot", &["text/vnd.in3d.spot"]), ("spp", &["application/scvp-vp-response"]), ("spq", &["application/scvp-vp-request"]), ("spx", &["audio/ogg"]), ("sql", &["application/x-sql"]), ("sr2", &["image/x-sony-sr2"]), ("src", &["application/x-wais-source"]), ("srf", &[ "text/plain", "image/x-sony-srf" ]), ("srt", &["application/x-subrip"]), ("sru", &["application/sru+xml"]), ("srx", &["application/sparql-results+xml"]), ("ssdl", &["application/ssdl+xml"]), ("sse", &["application/vnd.kodak-descriptor"]), ("ssf", &["application/vnd.epson.ssf"]), ("ssisdeploymentmanifest", &["text/xml"]), ("ssm", &["application/streamingmedia"]), ("ssml", &["application/ssml+xml"]), ("sst", &["application/vnd.ms-pki.certstore"]), ("st", &["application/vnd.sailingtracker.track"]), ("stc", &["application/vnd.sun.xml.calc.template"]), ("std", &["application/vnd.sun.xml.draw.template"]), ("step", &["application/step"]), ("stf", &["application/vnd.wt.stf"]), ("sti", &["application/vnd.sun.xml.impress.template"]), ("stk", &["application/hyperstudio"]), ("stl", &["application/vnd.ms-pki.stl"]), ("stp", &["application/step"]), ("str", &["application/vnd.pg.format"]), ("stw", &["application/vnd.sun.xml.writer.template"]), ("styl", &["text/stylus"]), ("stylus", &["text/stylus"]), ("sub", &["text/vnd.dvb.subtitle"]), ("sus", &["application/vnd.sus-calendar"]), ("susp", &["application/vnd.sus-calendar"]), ("sv4cpio", &["application/x-sv4cpio"]), ("sv4crc", &["application/x-sv4crc"]), ("svc", &["application/xml"]), ("svd", &["application/vnd.svd"]), ("svg", &["image/svg+xml"]), ("svgz", &["image/svg+xml"]), ("swa", &["application/x-director"]), ("swf", &["application/x-shockwave-flash"]), ("swi", &["application/vnd.aristanetworks.swi"]), ("sxc", &["application/vnd.sun.xml.calc"]), ("sxd", &["application/vnd.sun.xml.draw"]), ("sxg", &["application/vnd.sun.xml.writer.global"]), ("sxi", &["application/vnd.sun.xml.impress"]), ("sxm", &["application/vnd.sun.xml.math"]), ("sxw", &["application/vnd.sun.xml.writer"]), ("t", &["application/x-troff"]), ("t3", &["application/x-t3vm-image"]), ("taglet", &["application/vnd.mynfc"]), ("tao", &["application/vnd.tao.intent-module-archive"]), ("tar", &["application/x-tar"]), ("tcap", &["application/vnd.3gpp2.tcap"]), ("tcl", &["application/x-tcl"]), ("teacher", &["application/vnd.smart.teacher"]), ("tei", &["application/tei+xml"]), ("teicorpus", &["application/tei+xml"]), ("testrunconfig", &["application/xml"]), ("testsettings", &["application/xml"]), ("tex", &["application/x-tex"]), ("texi", &["application/x-texinfo"]), ("texinfo", &["application/x-texinfo"]), ("text", &["text/plain"]), ("tfi", &["application/thraud+xml"]), ("tfm", &["application/x-tex-tfm"]), ("tga", &["image/x-tga"]), ("tgz", &["application/x-compressed"]), ("thmx", &["application/vnd.ms-officetheme"]), ("thn", &["application/octet-stream"]), ("tif", &["image/tiff"]), ("tiff", &["image/tiff"]), ("tk", &["application/x-tcl"]), ("tlh", &["text/plain"]), ("tli", &["text/plain"]), ("tmo", &["application/vnd.tmobile-livetv"]), ("toc", &["application/octet-stream"]), ("toml", &["text/x-toml"]), ("torrent", &["application/x-bittorrent"]), ("tpl", &["application/vnd.groove-tool-template"]), ("tpt", &["application/vnd.trid.tpt"]), ("tr", &["application/x-troff"]), ("tra", &["application/vnd.trueapp"]), ("trig", &["application/trig"]), ("trm", &["application/x-msterminal"]), ("trx", &["application/xml"]), ("ts", &["video/vnd.dlna.mpeg-tts"]), ("tsd", &["application/timestamped-data"]), ("tsv", &["text/tab-separated-values"]), ("ttc", &["font/collection"]), ("ttf", &["font/ttf", "application/x-font-ttf", "application/font-sfnt"]), ("ttl", &["text/turtle"]), ("tts", &["video/vnd.dlna.mpeg-tts"]), ("twd", &["application/vnd.simtech-mindmapper"]), ("twds", &["application/vnd.simtech-mindmapper"]), ("txd", &["application/vnd.genomatix.tuxedo"]), ("txf", &["application/vnd.mobius.txf"]), ("txt", &["text/plain"]), ("u32", &["application/octet-stream"]), ("u8dsn", &["message/global-delivery-status"]), ("u8hdr", &["message/global-headers"]), ("u8mdn", &["message/global-disposition-notification"]), ("u8msg", &["message/global"]), ("udeb", &["application/x-debian-package"]), ("ufd", &["application/vnd.ufdl"]), ("ufdl", &["application/vnd.ufdl"]), ("uls", &["text/iuls"]), ("ulx", &["application/x-glulx"]), ("umj", &["application/vnd.umajin"]), ("unityweb", &["application/vnd.unity"]), ("uoml", &["application/vnd.uoml+xml"]), ("uri", &["text/uri-list"]), ("uris", &["text/uri-list"]), ("urls", &["text/uri-list"]), ("user", &["text/plain"]), ("ustar", &["application/x-ustar"]), ("utz", &["application/vnd.uiq.theme"]), ("uu", &["text/x-uuencode"]), ("uva", &["audio/vnd.dece.audio"]), ("uvd", &["application/vnd.dece.data"]), ("uvf", &["application/vnd.dece.data"]), ("uvg", &["image/vnd.dece.graphic"]), ("uvh", &["video/vnd.dece.hd"]), ("uvi", &["image/vnd.dece.graphic"]), ("uvm", &["video/vnd.dece.mobile"]), ("uvp", &["video/vnd.dece.pd"]), ("uvs", &["video/vnd.dece.sd"]), ("uvt", &["application/vnd.dece.ttml+xml"]), ("uvu", &["video/vnd.uvvu.mp4"]), ("uvv", &["video/vnd.dece.video"]), ("uvva", &["audio/vnd.dece.audio"]), ("uvvd", &["application/vnd.dece.data"]), ("uvvf", &["application/vnd.dece.data"]), ("uvvg", &["image/vnd.dece.graphic"]), ("uvvh", &["video/vnd.dece.hd"]), ("uvvi", &["image/vnd.dece.graphic"]), ("uvvm", &["video/vnd.dece.mobile"]), ("uvvp", &["video/vnd.dece.pd"]), ("uvvs", &["video/vnd.dece.sd"]), ("uvvt", &["application/vnd.dece.ttml+xml"]), ("uvvu", &["video/vnd.uvvu.mp4"]), ("uvvv", &["video/vnd.dece.video"]), ("uvvx", &["application/vnd.dece.unspecified"]), ("uvvz", &["application/vnd.dece.zip"]), ("uvx", &["application/vnd.dece.unspecified"]), ("uvz", &["application/vnd.dece.zip"]), ("vb", &["text/plain"]), ("vbdproj", &["text/plain"]), ("vbk", &["video/mpeg"]), ("vbox", &["application/x-virtualbox-vbox"]), ("vbox-extpack", &["application/x-virtualbox-vbox-extpack"]), ("vbproj", &["text/plain"]), ("vbs", &["text/vbscript"]), ("vcard", &["text/vcard"]), ("vcd", &["application/x-cdlink"]), ("vcf", &["text/x-vcard"]), ("vcg", &["application/vnd.groove-vcard"]), ("vcproj", &["application/xml"]), ("vcs", &["text/plain"]), ("vcx", &["application/vnd.vcx"]), ("vcxproj", &["application/xml"]), ("vddproj", &["text/plain"]), ("vdi", &["application/x-virtualbox-vdi"]), ("vdp", &["text/plain"]), ("vdproj", &["text/plain"]), ("vdx", &["application/vnd.ms-visio.viewer"]), ("vhd", &["application/x-virtualbox-vhd"]), ("vis", &["application/vnd.visionary"]), ("viv", &["video/vnd.vivo"]), ("vmdk", &["application/x-virtualbox-vmdk"]), ("vml", &["text/xml"]), ("vob", &["video/x-ms-vob"]), ("vor", &["application/vnd.stardivision.writer"]), ("vox", &["application/x-authorware-bin"]), ("vrml", &["model/vrml"]), ("vscontent", &["application/xml"]), ("vsct", &["text/xml"]), ("vsd", &["application/vnd.visio"]), ("vsf", &["application/vnd.vsf"]), ("vsi", &["application/ms-vsi"]), ("vsix", &["application/vsix"]), ("vsixlangpack", &["text/xml"]), ("vsixmanifest", &["text/xml"]), ("vsmdi", &["application/xml"]), ("vspscc", &["text/plain"]), ("vss", &["application/vnd.visio"]), ("vsscc", &["text/plain"]), ("vssettings", &["text/xml"]), ("vssscc", &["text/plain"]), ("vst", &["application/vnd.visio"]), ("vstemplate", &["text/xml"]), ("vsto", &["application/x-ms-vsto"]), ("vsw", &["application/vnd.visio"]), ("vsx", &["application/vnd.visio"]), ("vtt", &["text/vtt"]), ("vtu", &["model/vnd.vtu"]), ("vtx", &["application/vnd.visio"]), ("vxml", &["application/voicexml+xml"]), ("w3d", &["application/x-director"]), ("wad", &["application/x-doom"]), ("wadl", &["application/vnd.sun.wadl+xml"]), ("war", &["application/java-archive"]), ("wasm", &["application/wasm"]), ("wav", &["audio/wav"]), ("wave", &["audio/wav"]), ("wax", &["audio/x-ms-wax"]), ("wbk", &["application/msword"]), ("wbmp", &["image/vnd.wap.wbmp"]), ("wbs", &["application/vnd.criticaltools.wbs+xml"]), ("wbxml", &["application/vnd.wap.wbxml"]), ("wcm", &["application/vnd.ms-works"]), ("wdb", &["application/vnd.ms-works"]), ("wdp", &["image/vnd.ms-photo"]), ("weba", &["audio/webm"]), ("webapp", &["application/x-web-app-manifest+json"]), ("webarchive", &["application/x-safari-webarchive"]), ("webm", &["video/webm"]), ("webmanifest", &["application/manifest+json"]), ("webp", &["image/webp"]), ("webtest", &["application/xml"]), ("wg", &["application/vnd.pmi.widget"]), ("wgt", &["application/widget"]), ("wiq", &["application/xml"]), ("wiz", &["application/msword"]), ("wks", &["application/vnd.ms-works"]), ("wlmp", &["application/wlmoviemaker"]), ("wlpginstall", &["application/x-wlpg-detect"]), ("wlpginstall3", &["application/x-wlpg3-detect"]), ("wm", &["video/x-ms-wm"]), ("wma", &["audio/x-ms-wma"]), ("wmd", &["application/x-ms-wmd"]), ("wmf", &["application/x-msmetafile"]), ("wml", &["text/vnd.wap.wml"]), ("wmlc", &["application/vnd.wap.wmlc"]), ("wmls", &["text/vnd.wap.wmlscript"]), ("wmlsc", &["application/vnd.wap.wmlscriptc"]), ("wmp", &["video/x-ms-wmp"]), ("wmv", &["video/x-ms-wmv"]), ("wmx", &["video/x-ms-wmx"]), ("wmz", &["application/x-ms-wmz"]), ("woff", &["application/font-woff"]), ("woff2", &["font/woff2"]), ("wpd", &["application/vnd.wordperfect"]), ("wpl", &["application/vnd.ms-wpl"]), ("wps", &["application/vnd.ms-works"]), ("wqd", &["application/vnd.wqd"]), ("wri", &["application/x-mswrite"]), ("wrl", &["x-world/x-vrml"]), ("wrz", &["x-world/x-vrml"]), ("wsc", &["text/scriptlet"]), ("wsdl", &["text/xml"]), ("wspolicy", &["application/wspolicy+xml"]), ("wtb", &["application/vnd.webturbo"]), ("wvx", &["video/x-ms-wvx"]), ("x", &["application/directx"]), ("x32", &["application/x-authorware-bin"]), ("x3d", &["model/x3d+xml"]), ("x3db", &["model/x3d+binary"]), ("x3dbz", &["model/x3d+binary"]), ("x3dv", &["model/x3d+vrml"]), ("x3dvz", &["model/x3d+vrml"]), ("x3dz", &["model/x3d+xml"]), ("x3f", &["image/x-sigma-x3f"]), ("xaf", &["x-world/x-vrml"]), ("xaml", &["application/xaml+xml"]), ("xap", &["application/x-silverlight-app"]), ("xar", &["application/vnd.xara"]), ("xbap", &["application/x-ms-xbap"]), ("xbd", &["application/vnd.fujixerox.docuworks.binder"]), ("xbm", &["image/x-xbitmap"]), ("xdf", &["application/xcap-diff+xml"]), ("xdm", &["application/vnd.syncml.dm+xml"]), ("xdp", &["application/vnd.adobe.xdp+xml"]), ("xdr", &["text/plain"]), ("xdssc", &["application/dssc+xml"]), ("xdw", &["application/vnd.fujixerox.docuworks"]), ("xenc", &["application/xenc+xml"]), ("xer", &["application/patch-ops-error+xml"]), ("xfdf", &["application/vnd.adobe.xfdf"]), ("xfdl", &["application/vnd.xfdl"]), ("xht", &["application/xhtml+xml"]), ("xhtml", &["application/xhtml+xml"]), ("xhvml", &["application/xv+xml"]), ("xif", &["image/vnd.xiff"]), ("xla", &["application/vnd.ms-excel"]), ("xlam", &["application/vnd.ms-excel.addin.macroEnabled.12"]), ("xlc", &["application/vnd.ms-excel"]), ("xld", &["application/vnd.ms-excel"]), ("xlf", &["application/x-xliff+xml"]), ("xlk", &["application/vnd.ms-excel"]), ("xll", &["application/vnd.ms-excel"]), ("xlm", &["application/vnd.ms-excel"]), ("xls", &["application/vnd.ms-excel"]), ( "xlsb", &["application/vnd.ms-excel.sheet.binary.macroEnabled.12"], ), ("xlsm", &["application/vnd.ms-excel.sheet.macroEnabled.12"]), ( "xlsx", &["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"], ), ("xlt", &["application/vnd.ms-excel"]), ( "xltm", &["application/vnd.ms-excel.template.macroEnabled.12"], ), ( "xltx", &["application/vnd.openxmlformats-officedocument.spreadsheetml.template"], ), ("xlw", &["application/vnd.ms-excel"]), ("xm", &["audio/xm"]), ("xml", &["text/xml"]), ("xmp", &["application/octet-stream"]), ("xmta", &["application/xml"]), ("xo", &["application/vnd.olpc-sugar"]), ("xof", &["x-world/x-vrml"]), ("xoml", &["text/plain"]), ("xop", &["application/xop+xml"]), ("xpi", &["application/x-xpinstall"]), ("xpl", &["application/xproc+xml"]), ("xpm", &["image/x-xpixmap"]), ("xpr", &["application/vnd.is-xpr"]), ("xps", &["application/vnd.ms-xpsdocument"]), ("xpw", &["application/vnd.intercon.formnet"]), ("xpx", &["application/vnd.intercon.formnet"]), ("xrm-ms", &["text/xml"]), ("xsc", &["application/xml"]), ("xsd", &["text/xml"]), ("xsf", &["text/xml"]), ("xsl", &["text/xml"]), ("xslt", &["text/xml"]), ("xsm", &["application/vnd.syncml+xml"]), ("xsn", &["application/octet-stream"]), ("xspf", &["application/xspf+xml"]), ("xss", &["application/xml"]), ("xtp", &["application/octet-stream"]), ("xul", &["application/vnd.mozilla.xul+xml"]), ("xvm", &["application/xv+xml"]), ("xvml", &["application/xv+xml"]), ("xwd", &["image/x-xwindowdump"]), ("xyz", &["chemical/x-xyz"]), ("xz", &["application/x-xz"]), ("yaml", &["text/x-yaml"]), ("yang", &["application/yang"]), ("yin", &["application/yin+xml"]), ("yml", &["text/x-yaml"]), ("ymp", &["text/x-suse-ymp"]), ("z", &["application/x-compress"]), ("z1", &["application/x-zmachine"]), ("z2", &["application/x-zmachine"]), ("z3", &["application/x-zmachine"]), ("z4", &["application/x-zmachine"]), ("z5", &["application/x-zmachine"]), ("z6", &["application/x-zmachine"]), ("z7", &["application/x-zmachine"]), ("z8", &["application/x-zmachine"]), ("zaz", &["application/vnd.zzazz.deck+xml"]), ("zip", &["application/zip"]), ("zir", &["application/vnd.zul"]), ("zirz", &["application/vnd.zul"]), ("zmm", &["application/vnd.handheld-entertainment+xml"]), ];