@@ -9,6 +9,7 @@ use http::{Request, StatusCode};
9
9
use http_body:: Body as HttpBody ;
10
10
use http_body_util:: BodyExt ;
11
11
use std:: convert:: Infallible ;
12
+ use std:: fs;
12
13
use std:: io:: Read ;
13
14
use tower:: { service_fn, ServiceExt } ;
14
15
@@ -252,6 +253,54 @@ async fn missing_precompressed_variant_fallbacks_to_uncompressed_for_head_reques
252
253
assert ! ( res. into_body( ) . frame( ) . await . is_none( ) ) ;
253
254
}
254
255
256
+ #[ tokio:: test]
257
+ async fn precompressed_without_extension ( ) {
258
+ let svc = ServeDir :: new ( "../test-files" ) . precompressed_gzip ( ) ;
259
+
260
+ let request = Request :: builder ( )
261
+ . uri ( "/extensionless_precompressed" )
262
+ . header ( "Accept-Encoding" , "gzip" )
263
+ . body ( Body :: empty ( ) )
264
+ . unwrap ( ) ;
265
+ let res = svc. oneshot ( request) . await . unwrap ( ) ;
266
+
267
+ assert_eq ! ( res. status( ) , StatusCode :: OK ) ;
268
+
269
+ assert_eq ! ( res. headers( ) [ "content-type" ] , "application/octet-stream" ) ;
270
+ assert_eq ! ( res. headers( ) [ "content-encoding" ] , "gzip" ) ;
271
+
272
+ let body = res. into_body ( ) . collect ( ) . await . unwrap ( ) . to_bytes ( ) ;
273
+ let mut decoder = GzDecoder :: new ( & body[ ..] ) ;
274
+ let mut decompressed = String :: new ( ) ;
275
+ decoder. read_to_string ( & mut decompressed) . unwrap ( ) ;
276
+
277
+ let correct = fs:: read_to_string ( "../test-files/extensionless_precompressed" ) . unwrap ( ) ;
278
+ assert_eq ! ( decompressed, correct) ;
279
+ }
280
+
281
+ #[ tokio:: test]
282
+ async fn missing_precompressed_without_extension_fallbacks_to_uncompressed ( ) {
283
+ let svc = ServeDir :: new ( "../test-files" ) . precompressed_gzip ( ) ;
284
+
285
+ let request = Request :: builder ( )
286
+ . uri ( "/extensionless_precompressed_missing" )
287
+ . header ( "Accept-Encoding" , "gzip" )
288
+ . body ( Body :: empty ( ) )
289
+ . unwrap ( ) ;
290
+ let res = svc. oneshot ( request) . await . unwrap ( ) ;
291
+
292
+ assert_eq ! ( res. status( ) , StatusCode :: OK ) ;
293
+
294
+ assert_eq ! ( res. headers( ) [ "content-type" ] , "application/octet-stream" ) ;
295
+ assert ! ( res. headers( ) . get( "content-encoding" ) . is_none( ) ) ;
296
+
297
+ let body = res. into_body ( ) . collect ( ) . await . unwrap ( ) . to_bytes ( ) ;
298
+ let body = String :: from_utf8 ( body. to_vec ( ) ) . unwrap ( ) ;
299
+
300
+ let correct = fs:: read_to_string ( "../test-files/extensionless_precompressed_missing" ) . unwrap ( ) ;
301
+ assert_eq ! ( body, correct) ;
302
+ }
303
+
255
304
#[ tokio:: test]
256
305
async fn access_to_sub_dirs ( ) {
257
306
let svc = ServeDir :: new ( ".." ) ;
0 commit comments