@@ -11,12 +11,13 @@ use std::os::unix::fs::MetadataExt;
11
11
use enumflags2:: { BitFlags , bitflags} ;
12
12
use headers:: * ;
13
13
use tokio:: fs:: File ;
14
+ use tokio:: io:: AsyncReadExt ;
14
15
15
16
use super :: { ChunkedFile , ChunkedState } ;
16
17
use crate :: http:: header:: {
17
18
CONTENT_DISPOSITION , CONTENT_ENCODING , CONTENT_TYPE , IF_NONE_MATCH , RANGE ,
18
19
} ;
19
- use crate :: http:: { HttpRange , Mime , Request , Response , StatusCode , StatusError } ;
20
+ use crate :: http:: { HttpRange , Mime , Request , Response , StatusCode , StatusError , detect_text_mime } ;
20
21
use crate :: { Depot , Error , Result , Writer , async_trait} ;
21
22
22
23
const CHUNK_SIZE : u64 = 1024 * 1024 ;
@@ -171,21 +172,30 @@ impl NamedFileBuilder {
171
172
} = self ;
172
173
173
174
let file = File :: open ( & path) . await ?;
174
- let content_type = content_type. unwrap_or_else ( || {
175
- let ct = mime_infer:: from_path ( & path) . first_or_octet_stream ( ) ;
176
- let ftype = ct. type_ ( ) ;
177
- let stype = ct. subtype ( ) ;
178
- if ( ftype == mime:: TEXT || stype == mime:: JSON || stype == mime:: JAVASCRIPT )
179
- && ct. get_param ( mime:: CHARSET ) . is_none ( )
180
- {
181
- //TODO: auto detect charset
182
- format ! ( "{ct}; charset=utf-8" )
183
- . parse :: < mime:: Mime > ( )
184
- . unwrap_or ( ct)
175
+ let content_type =
176
+ if let Some ( mime) = content_type. or_else ( || mime_infer:: from_path ( & path) . first ( ) ) {
177
+ if mime == mime:: TEXT_PLAIN {
178
+ let mut buffer: Vec < u8 > = vec ! [ ] ;
179
+ let _ = file. take ( 1024 ) . read ( & mut buffer) . await ;
180
+ if let Some ( mime) = detect_text_mime ( & buffer) {
181
+ mime
182
+ } else {
183
+ mime
184
+ }
185
+ } else {
186
+ mime
187
+ }
185
188
} else {
186
- ct
187
- }
188
- } ) ;
189
+ let mut buffer: Vec < u8 > = vec ! [ ] ;
190
+ let _ = file. take ( 1024 ) . read ( & mut buffer) . await ;
191
+ if let Some ( mime) = detect_text_mime ( & buffer) {
192
+ mime
193
+ } else {
194
+ mime:: APPLICATION_OCTET_STREAM
195
+ }
196
+ } ;
197
+
198
+ let file = File :: open ( & path) . await ?;
189
199
let metadata = file. metadata ( ) . await ?;
190
200
let modified = metadata. modified ( ) . ok ( ) ;
191
201
let content_encoding = match content_encoding {
0 commit comments