From 7132018950869674a6da72f46fa2bbd6b90d9381 Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Tue, 1 Oct 2024 20:04:41 +0800 Subject: [PATCH] chore(NamedFile): Skip write content-type if it exists (#939) * chore(NamedFile): Skip write content-type if it exists * wip --- crates/core/src/fs/named_file.rs | 11 +++++++---- crates/craft-macros/src/craft.rs | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/crates/core/src/fs/named_file.rs b/crates/core/src/fs/named_file.rs index 540710c21..ed9367caa 100644 --- a/crates/core/src/fs/named_file.rs +++ b/crates/core/src/fs/named_file.rs @@ -13,7 +13,9 @@ use headers::*; use tokio::fs::File; use super::{ChunkedFile, ChunkedState}; -use crate::http::header::{CONTENT_DISPOSITION, CONTENT_ENCODING, IF_NONE_MATCH, RANGE}; +use crate::http::header::{ + CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_TYPE, IF_NONE_MATCH, RANGE, +}; use crate::http::{HttpRange, Mime, Request, Response, StatusCode, StatusError}; use crate::{async_trait, Depot, Error, Result, Writer}; @@ -459,9 +461,10 @@ impl NamedFile { } } } - - res.headers_mut() - .typed_insert(ContentType::from(self.content_type.clone())); + if !res.headers().contains_key(CONTENT_TYPE) { + res.headers_mut() + .typed_insert(ContentType::from(self.content_type.clone())); + } if let Some(lm) = last_modified { res.headers_mut().typed_insert(LastModified::from(lm)); } diff --git a/crates/craft-macros/src/craft.rs b/crates/craft-macros/src/craft.rs index ceba57162..25f35636a 100644 --- a/crates/craft-macros/src/craft.rs +++ b/crates/craft-macros/src/craft.rs @@ -29,12 +29,12 @@ pub(crate) fn generate(input: Item) -> syn::Result { } } -const REGEX_STR: &'static str = r#"(?s)#\s*\[\s*(::)?\s*([A-Za-z_][A-Za-z0-9_]*\s*::\s*)*\s*craft\s*\(\s*(?Phandler|endpoint)\s*(?P\(.*\))?\s*\)\s*\]"#; +const REGEX_STR: &str = r#"(?s)#\s*\[\s*(::)?\s*([A-Za-z_][A-Za-z0-9_]*\s*::\s*)*\s*craft\s*\(\s*(?Phandler|endpoint)\s*(?P\(.*\))?\s*\)\s*\]"#; fn take_method_macro(item_fn: &mut ImplItemFn) -> syn::Result> { let mut index: Option = None; let mut new_attr: Option = None; - let re = Regex::new(REGEX_STR).unwrap(); + let re = Regex::new(REGEX_STR).expect("regex compile should not fail"); for (idx, attr) in &mut item_fn.attrs.iter().enumerate() { if !(match attr.path().segments.last() { Some(segment) => segment.ident == "craft",