diff --git a/Cargo.lock b/Cargo.lock index 3c2ef1e..5e3b487 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -288,6 +288,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.8.5" @@ -399,7 +409,7 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "static-serve" -version = "0.1.0" +version = "0.2.0" dependencies = [ "axum", "bytes", @@ -413,11 +423,12 @@ dependencies = [ [[package]] name = "static-serve-macro" -version = "0.1.0" +version = "0.2.0" dependencies = [ "display_full_error", "flate2", "glob", + "mime_guess", "proc-macro2", "quote", "sha1", @@ -517,6 +528,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/static-serve-macro/Cargo.toml b/static-serve-macro/Cargo.toml index 29e0c64..f85daa0 100644 --- a/static-serve-macro/Cargo.toml +++ b/static-serve-macro/Cargo.toml @@ -16,6 +16,7 @@ proc-macro = true display_full_error = "1.1" flate2 = "1.1" glob = "0.3" +mime_guess = "2.0.5" proc-macro2 = "1.0" quote = "1.0" sha1 = "0.10" diff --git a/static-serve-macro/src/lib.rs b/static-serve-macro/src/lib.rs index b69458d..462d027 100644 --- a/static-serve-macro/src/lib.rs +++ b/static-serve-macro/src/lib.rs @@ -12,6 +12,7 @@ use std::{ use display_full_error::DisplayFullError; use flate2::write::GzEncoder; use glob::glob; +use mime_guess::MimeGuess; use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens}; use sha1::{Digest as _, Sha1}; @@ -357,15 +358,11 @@ fn maybe_get_compressed(compressed: &[u8], contents: &[u8]) -> Option Result<&'static str, error::Error> { - match path.extension() { - Some(ext) if ext.eq_ignore_ascii_case("css") => Ok("text/css"), - Some(ext) if ext.eq_ignore_ascii_case("js") => Ok("text/javascript"), - Some(ext) if ext.eq_ignore_ascii_case("txt") => Ok("text/plain"), - Some(ext) if ext.eq_ignore_ascii_case("woff") => Ok("font/woff"), - Some(ext) if ext.eq_ignore_ascii_case("woff2") => Ok("font/woff2"), - Some(ext) if ext.eq_ignore_ascii_case("svg") => Ok("image/svg+xml"), - ext => Err(error::Error::UnknownFileExtension(ext.map(Into::into))), +fn file_content_type(path: &Path) -> Result { + if let Some(mime) = MimeGuess::from_path(path).first() { + Ok(mime.essence_str().to_string()) + } else { + Err(error::Error::UnknownFileExtension(path.extension().map(Into::into))) } }