From 3b462d670cb9bebe4261e8f26c42bde410753a84 Mon Sep 17 00:00:00 2001
From: Eduardo Trujillo <ed@chromabits.com>
Date: Mon, 14 Nov 2022 23:10:58 -0800
Subject: [PATCH] fix(files): Address a few linter errors

---
 src/files/mod.rs       | 1448 ++++++++++++++++++++--------------------
 src/files/named_ext.rs |    2 +-
 src/files/service.rs   |   14 +-
 src/server.rs          |   11 +-
 4 files changed, 736 insertions(+), 739 deletions(-)

diff --git a/src/files/mod.rs b/src/files/mod.rs
index fb2a953..7d85c67 100644
--- a/src/files/mod.rs
+++ b/src/files/mod.rs
@@ -13,7 +13,7 @@ use actix_web::dev::{
 };
 use actix_web::error::Error as ActixError;
 use actix_web::guard::Guard;
-use futures_util::future::{ok, FutureExt, LocalBoxFuture};
+use futures_util::future::LocalBoxFuture;
 
 use path_context::PathContext;
 use service::FilesService;
@@ -139,11 +139,11 @@ impl Files {
   where
     F: IntoServiceFactory<U, ServiceRequest>,
     U: ServiceFactory<
-      ServiceRequest,
-      Config = (),
-      Response = ServiceResponse,
-      Error = actix_web::error::Error,
-    > + 'static,
+        ServiceRequest,
+        Config = (),
+        Response = ServiceResponse,
+        Error = actix_web::error::Error,
+      > + 'static,
   {
     // create and configure default resource
     self.default = Rc::new(RefCell::new(Some(Rc::new(boxed::factory(
@@ -195,7 +195,7 @@ impl ServiceFactory<ServiceRequest> for Files {
         match fut.await {
           Ok(default) => {
             inner.default = Some(default);
-                        Ok(FilesService(Rc::new(inner)))
+            Ok(FilesService(Rc::new(inner)))
           }
           Err(_) => Err(()),
         }
@@ -208,723 +208,723 @@ impl ServiceFactory<ServiceRequest> for Files {
 
 #[cfg(test)]
 mod tests {
-//   use std::fs;
-//   use std::ops::Add;
-//   use std::{
-//     convert::TryInto,
-//     time::{Duration, SystemTime},
-//   };
-
-//   use super::*;
-//   use crate::config::{ContentDispositionConfig, IndexStrategyConfig, ServerConfig};
-//   use actix_files::NamedFile;
-// use actix_web::guard;
-//   use actix_web::http::header::{self, ContentDisposition, DispositionParam, DispositionType};
-//   use actix_web::http::{Method, StatusCode};
-//   use actix_web::middleware::Compress;
-//   use actix_web::test::{self, TestRequest};
-//   use actix_web::{web, App, HttpResponse, Responder};
-//   use bytes::Bytes;
-//   use fs::File;
-
-//   fn serve_dir<T: Into<PathBuf>>(path: T) -> Arc<RwLock<Option<PathBuf>>> {
-//     Arc::new(RwLock::new(Some(path.into())))
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_if_modified_since_without_if_none_match() {
-//     let file = NamedFile::open("Cargo.toml").unwrap();
-//     let since = header::HttpDate::from(SystemTime::now().add(Duration::from_secs(60)));
-
-//     let req = TestRequest::default()
-//       .header(header::IF_MODIFIED_SINCE, since)
-//       .to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(resp.status(), StatusCode::NOT_MODIFIED);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_if_modified_since_with_if_none_match() {
-//     let file = NamedFile::open("Cargo.toml").unwrap();
-//     let since = header::HttpDate::from(SystemTime::now().add(Duration::from_secs(60)));
-
-//     let req = TestRequest::default()
-//       .header(header::IF_NONE_MATCH, "miss_etag")
-//       .header(header::IF_MODIFIED_SINCE, since)
-//       .to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_ne!(resp.status(), StatusCode::NOT_MODIFIED);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_text() {
-//     assert!(NamedFile::open("test--").is_err());
-//     let mut file = NamedFile::open("Cargo.toml").unwrap();
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "text/x-toml"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "inline; filename=\"Cargo.toml\""
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_content_disposition() {
-//     assert!(NamedFile::open("test--").is_err());
-//     let mut file = NamedFile::open("Cargo.toml").unwrap();
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "inline; filename=\"Cargo.toml\""
-//     );
-
-//     let file = NamedFile::open("Cargo.toml")
-//       .unwrap()
-//       .disable_content_disposition();
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert!(resp.headers().get(header::CONTENT_DISPOSITION).is_none());
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_non_ascii_file_name() {
-//     let mut file = NamedFile::from_file(File::open("Cargo.toml").unwrap(), "貨物.toml").unwrap();
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "text/x-toml"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "inline; filename=\"貨物.toml\"; filename*=UTF-8''%E8%B2%A8%E7%89%A9.toml"
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_set_content_type() {
-//     let mut file = NamedFile::open("Cargo.toml")
-//       .unwrap()
-//       .set_content_type(mime::TEXT_XML);
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "text/xml"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "inline; filename=\"Cargo.toml\""
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_image() {
-//     let mut file = NamedFile::open("tests/test.png").unwrap();
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "image/png"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "inline; filename=\"test.png\""
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_image_attachment() {
-//     let cd = ContentDisposition {
-//       disposition: DispositionType::Attachment,
-//       parameters: vec![DispositionParam::Filename(String::from("test.png"))],
-//     };
-//     let mut file = NamedFile::open("tests/test.png")
-//       .unwrap()
-//       .set_content_disposition(cd);
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "image/png"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "attachment; filename=\"test.png\""
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_binary() {
-//     let mut file = NamedFile::open("tests/test.binary").unwrap();
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "application/octet-stream"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "attachment; filename=\"test.binary\""
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_status_code_text() {
-//     let mut file = NamedFile::open("Cargo.toml")
-//       .unwrap()
-//       .set_status_code(StatusCode::NOT_FOUND);
-//     {
-//       file.file();
-//       let _f: &File = &file;
-//     }
-//     {
-//       let _f: &mut File = &mut file;
-//     }
-
-//     let req = TestRequest::default().to_http_request();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "text/x-toml"
-//     );
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
-//       "inline; filename=\"Cargo.toml\""
-//     );
-//     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_mime_override() {
-//     let mut server_config = ServerConfig::default();
-
-//     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
-//       filenames: ["Cargo.toml".to_owned()].iter().cloned().collect(),
-//     });
-//     server_config.mime_disposition = Some(
-//       vec![(
-//         "text/x-toml".to_owned(),
-//         ContentDispositionConfig::Attachment,
-//       )]
-//       .iter()
-//       .cloned()
-//       .collect(),
-//     );
-
-//     let root_path_context = Arc::new((&server_config).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-
-//     let request = TestRequest::get().uri("/").to_request();
-//     let response = test::call_service(&mut srv, request).await;
-//     assert_eq!(response.status(), StatusCode::OK);
-
-//     let content_disposition = response
-//       .headers()
-//       .get(header::CONTENT_DISPOSITION)
-//       .expect("To have CONTENT_DISPOSITION");
-//     let content_disposition = content_disposition
-//       .to_str()
-//       .expect("Convert CONTENT_DISPOSITION to str");
-//     assert_eq!(content_disposition, "attachment; filename=\"Cargo.toml\"");
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_ranges_status_code() {
-//     let mut server_config = ServerConfig::default();
-
-//     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
-//       filenames: ["Cargo.toml".to_owned()].iter().cloned().collect(),
-//     });
-
-//     let root_path_context = Arc::new((&server_config).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(Files::new(
-//       "/test",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-
-//     // Valid range header
-//     let request = TestRequest::get()
-//       .uri("/t%65st/Cargo.toml")
-//       .header(header::RANGE, "bytes=10-20")
-//       .to_request();
-//     let response = test::call_service(&mut srv, request).await;
-//     assert_eq!(response.status(), StatusCode::PARTIAL_CONTENT);
-
-//     // Invalid range header
-//     let request = TestRequest::get()
-//       .uri("/t%65st/Cargo.toml")
-//       .header(header::RANGE, "bytes=1-0")
-//       .to_request();
-//     let response = test::call_service(&mut srv, request).await;
-
-//     assert_eq!(response.status(), StatusCode::RANGE_NOT_SATISFIABLE);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_content_range_headers() {
-//     let srv = test::init_service(|| {
-//       let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//       let path_contexts = Arc::new(vec![]);
-
-//       App::new().service(Files::new(
-//         "/",
-//         serve_dir("."),
-//         root_path_context,
-//         path_contexts,
-//       ))
-//     });
-
-//     // Valid range header
-//     let response = srv
-//       .get("/tests/test.binary")
-//       .header(header::RANGE, "bytes=10-20")
-//       .send()
-//       .await
-//       .unwrap();
-//     let content_range = response.headers().get(header::CONTENT_RANGE).unwrap();
-//     assert_eq!(content_range.to_str().unwrap(), "bytes 10-20/100");
-
-//     // Invalid range header
-//     let response = srv
-//       .get("/tests/test.binary")
-//       .header(header::RANGE, "bytes=10-5")
-//       .send()
-//       .await
-//       .unwrap();
-//     let content_range = response.headers().get(header::CONTENT_RANGE).unwrap();
-//     assert_eq!(content_range.to_str().unwrap(), "bytes */100");
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_content_length_headers() {
-//     let srv = test::init_service(|| {
-//       let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//       let path_contexts = Arc::new(vec![]);
-
-//       App::new().service(Files::new(
-//         "/",
-//         serve_dir("."),
-//         root_path_context,
-//         path_contexts,
-//       ))
-//     });
-
-//     // Valid range header
-//     let response = srv
-//       .get("/tests/test.binary")
-//       .header(header::RANGE, "bytes=10-20")
-//       .send()
-//       .await
-//       .unwrap();
-//     let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
-//     assert_eq!(content_length.to_str().unwrap(), "11");
-
-//     // Valid range header, starting from 0
-//     let response = srv
-//       .get("/tests/test.binary")
-//       .header(header::RANGE, "bytes=0-20")
-//       .send()
-//       .await
-//       .unwrap();
-//     let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
-//     assert_eq!(content_length.to_str().unwrap(), "21");
-
-//     // Without range header
-//     let mut response = srv.get("/tests/test.binary").send().await.unwrap();
-//     let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
-//     assert_eq!(content_length.to_str().unwrap(), "100");
-
-//     // Should be no transfer-encoding
-//     let transfer_encoding = response.headers().get(header::TRANSFER_ENCODING);
-//     assert!(transfer_encoding.is_none());
-
-//     // Check file contents
-//     let bytes = response.body().await.unwrap();
-//     let data = Bytes::from(fs::read("tests/test.binary").unwrap());
-    
-//     assert_eq!(bytes, data);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_head_content_length_headers() {
-//     let srv = test::init_service(|| {
-//       let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//       let path_contexts = Arc::new(vec![]);
-
-//       App::new().service(Files::new(
-//         "/",
-//         serve_dir("."),
-//         root_path_context,
-//         path_contexts,
-//       ))
-//     });
-
-//     let response = srv.head("/tests/test.binary").send().await.unwrap();
-
-//     let content_length = response
-//       .headers()
-//       .get(header::CONTENT_LENGTH)
-//       .unwrap()
-//       .to_str()
-//       .unwrap();
-
-//     assert_eq!(content_length, "100");
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_static_files_with_spaces() {
-//     let mut server_config = ServerConfig::default();
-
-//     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
-//       filenames: ["Cargo.toml".to_owned()].iter().cloned().collect(),
-//     });
-
-//     let root_path_context = Arc::new((&server_config).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-//     let request = TestRequest::get()
-//       .uri("/tests/test%20space.binary")
-//       .to_request();
-//     let response = test::call_service(&mut srv, request).await;
-//     assert_eq!(response.status(), StatusCode::OK);
-
-//     let bytes = test::read_body(response).await;
-//     let data = Bytes::from(fs::read("tests/test space.binary").unwrap());
-//     assert_eq!(bytes, data);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_files_not_allowed() {
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().default_service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-
-//     let req = TestRequest::default()
-//       .uri("/Cargo.toml")
-//       .method(Method::POST)
-//       .to_request();
-
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::METHOD_NOT_ALLOWED);
-
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().default_service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-//     let req = TestRequest::default()
-//       .method(Method::PUT)
-//       .uri("/Cargo.toml")
-//       .to_request();
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::METHOD_NOT_ALLOWED);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_files_guards() {
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(
-//       Files::new("/", serve_dir("."), root_path_context, path_contexts).use_guards(guard::Post()),
-//     ))
-//     .await;
-
-//     let req = TestRequest::default()
-//       .uri("/Cargo.toml")
-//       .method(Method::POST)
-//       .to_request();
-
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::OK);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_content_encoding() {
-//     let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
-//       web::resource("/").to(|| async {
-//         NamedFile::open("Cargo.toml")
-//           .unwrap()
-//           .set_content_encoding(header::ContentEncoding::Identity)
-//       }),
-//     ))
-//     .await;
-
-//     let request = TestRequest::get()
-//       .uri("/")
-//       .header(header::ACCEPT_ENCODING, "gzip")
-//       .to_request();
-//     let res = test::call_service(&mut srv, request).await;
-//     assert_eq!(res.status(), StatusCode::OK);
-//     assert!(!res.headers().contains_key(header::CONTENT_ENCODING));
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_content_encoding_gzip() {
-//     let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
-//       web::resource("/").to(|| async {
-//         NamedFile::open("Cargo.toml")
-//           .unwrap()
-//           .set_content_encoding(header::ContentEncoding::Gzip)
-//       }),
-//     ))
-//     .await;
-
-//     let request = TestRequest::get()
-//       .uri("/")
-//       .header(header::ACCEPT_ENCODING, "gzip")
-//       .to_request();
-//     let res = test::call_service(&mut srv, request).await;
-//     assert_eq!(res.status(), StatusCode::OK);
-//     assert_eq!(
-//       res
-//         .headers()
-//         .get(header::CONTENT_ENCODING)
-//         .unwrap()
-//         .to_str()
-//         .unwrap(),
-//       "gzip"
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_named_file_allowed_method() {
-//     let req = TestRequest::default().method(Method::GET).to_http_request();
-//     let file = NamedFile::open("Cargo.toml").unwrap();
-//     let resp = file.respond_to(&req).await.unwrap();
-//     assert_eq!(resp.status(), StatusCode::OK);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_static_files() {
-//     let mut server_config = ServerConfig::default();
-
-//     server_config.index_strategy = Some(IndexStrategyConfig::AlwaysShowListing);
-
-//     let root_path_context = Arc::new((&server_config).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-//     let req = TestRequest::with_uri("/missing").to_request();
-
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
-
-//     // Without index strategy.
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-
-//     let req = TestRequest::default().to_request();
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
-
-//     // With default renderer.
-//     server_config.index_strategy = Some(IndexStrategyConfig::AlwaysShowListing);
-
-//     let root_path_context = Arc::new((&server_config).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut srv = test::init_service(App::new().service(Files::new(
-//       "/",
-//       serve_dir("."),
-//       root_path_context,
-//       path_contexts,
-//     )))
-//     .await;
-//     let req = TestRequest::with_uri("/tests").to_request();
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(
-//       resp.headers().get(header::CONTENT_TYPE).unwrap(),
-//       "text/html; charset=utf-8"
-//     );
-
-//     let bytes = test::read_body(resp).await;
-//     assert!(format!("{:?}", bytes).contains("/tests/test.png"));
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_redirect_to_slash_directory() {
-//     let mut server_config = ServerConfig::default();
-
-//     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
-//       filenames: ["test.png".to_owned()].iter().cloned().collect(),
-//     });
-
-//     let root_path_context = Arc::new((&server_config).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     // should not redirect if no index
-//     // let mut srv = test::init_service(
-//     //   App::new().service(Files::new("/", serve_dir(".")).redirect_to_slash_directory()),
-//     // )
-//     // .await;
-//     // let req = TestRequest::with_uri("/tests").to_request();
-//     // let resp = test::call_service(&mut srv, req).await;
-//     // assert_eq!(resp.status(), StatusCode::NOT_FOUND);
-
-//     // should redirect if index present
-//     let mut srv = test::init_service(
-//       App::new().service(
-//         Files::new("/", serve_dir("."), root_path_context, path_contexts)
-//           .redirect_to_slash_directory(),
-//       ),
-//     )
-//     .await;
-//     let req = TestRequest::with_uri("/tests").to_request();
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::FOUND);
-
-//     // should not redirect if the path is wrong
-//     let req = TestRequest::with_uri("/not_existing").to_request();
-//     let resp = test::call_service(&mut srv, req).await;
-//     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_static_files_bad_directory() {
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let _st: Files = Files::new("/", serve_dir("missing"), root_path_context, path_contexts);
-
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let _st: Files = Files::new(
-//       "/",
-//       serve_dir("Cargo.toml"),
-//       root_path_context,
-//       path_contexts,
-//     );
-//   }
-
-//   #[actix_rt::test]
-//   async fn test_default_handler_file_missing() {
-//     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
-//     let path_contexts = Arc::new(vec![]);
-
-//     let mut st = Files::new("/", serve_dir("."), root_path_context, path_contexts)
-//       .default_handler(|req: ServiceRequest| {
-//         ok(req.into_response(HttpResponse::Ok().body("default content")))
-//       })
-//       .new_service(())
-//       .await
-//       .unwrap();
-//     let req = TestRequest::with_uri("/missing").to_srv_request();
-
-//     let resp = test::call_service(&mut st, req).await;
-//     assert_eq!(resp.status(), StatusCode::OK);
-//     let bytes = test::read_body(resp).await;
-//     assert_eq!(bytes, Bytes::from_static(b"default content"));
-//   }
+  //   use std::fs;
+  //   use std::ops::Add;
+  //   use std::{
+  //     convert::TryInto,
+  //     time::{Duration, SystemTime},
+  //   };
+
+  //   use super::*;
+  //   use crate::config::{ContentDispositionConfig, IndexStrategyConfig, ServerConfig};
+  //   use actix_files::NamedFile;
+  // use actix_web::guard;
+  //   use actix_web::http::header::{self, ContentDisposition, DispositionParam, DispositionType};
+  //   use actix_web::http::{Method, StatusCode};
+  //   use actix_web::middleware::Compress;
+  //   use actix_web::test::{self, TestRequest};
+  //   use actix_web::{web, App, HttpResponse, Responder};
+  //   use bytes::Bytes;
+  //   use fs::File;
+
+  //   fn serve_dir<T: Into<PathBuf>>(path: T) -> Arc<RwLock<Option<PathBuf>>> {
+  //     Arc::new(RwLock::new(Some(path.into())))
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_if_modified_since_without_if_none_match() {
+  //     let file = NamedFile::open("Cargo.toml").unwrap();
+  //     let since = header::HttpDate::from(SystemTime::now().add(Duration::from_secs(60)));
+
+  //     let req = TestRequest::default()
+  //       .header(header::IF_MODIFIED_SINCE, since)
+  //       .to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(resp.status(), StatusCode::NOT_MODIFIED);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_if_modified_since_with_if_none_match() {
+  //     let file = NamedFile::open("Cargo.toml").unwrap();
+  //     let since = header::HttpDate::from(SystemTime::now().add(Duration::from_secs(60)));
+
+  //     let req = TestRequest::default()
+  //       .header(header::IF_NONE_MATCH, "miss_etag")
+  //       .header(header::IF_MODIFIED_SINCE, since)
+  //       .to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_ne!(resp.status(), StatusCode::NOT_MODIFIED);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_text() {
+  //     assert!(NamedFile::open("test--").is_err());
+  //     let mut file = NamedFile::open("Cargo.toml").unwrap();
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "text/x-toml"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "inline; filename=\"Cargo.toml\""
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_content_disposition() {
+  //     assert!(NamedFile::open("test--").is_err());
+  //     let mut file = NamedFile::open("Cargo.toml").unwrap();
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "inline; filename=\"Cargo.toml\""
+  //     );
+
+  //     let file = NamedFile::open("Cargo.toml")
+  //       .unwrap()
+  //       .disable_content_disposition();
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert!(resp.headers().get(header::CONTENT_DISPOSITION).is_none());
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_non_ascii_file_name() {
+  //     let mut file = NamedFile::from_file(File::open("Cargo.toml").unwrap(), "貨物.toml").unwrap();
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "text/x-toml"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "inline; filename=\"貨物.toml\"; filename*=UTF-8''%E8%B2%A8%E7%89%A9.toml"
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_set_content_type() {
+  //     let mut file = NamedFile::open("Cargo.toml")
+  //       .unwrap()
+  //       .set_content_type(mime::TEXT_XML);
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "text/xml"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "inline; filename=\"Cargo.toml\""
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_image() {
+  //     let mut file = NamedFile::open("tests/test.png").unwrap();
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "image/png"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "inline; filename=\"test.png\""
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_image_attachment() {
+  //     let cd = ContentDisposition {
+  //       disposition: DispositionType::Attachment,
+  //       parameters: vec![DispositionParam::Filename(String::from("test.png"))],
+  //     };
+  //     let mut file = NamedFile::open("tests/test.png")
+  //       .unwrap()
+  //       .set_content_disposition(cd);
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "image/png"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "attachment; filename=\"test.png\""
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_binary() {
+  //     let mut file = NamedFile::open("tests/test.binary").unwrap();
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "application/octet-stream"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "attachment; filename=\"test.binary\""
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_status_code_text() {
+  //     let mut file = NamedFile::open("Cargo.toml")
+  //       .unwrap()
+  //       .set_status_code(StatusCode::NOT_FOUND);
+  //     {
+  //       file.file();
+  //       let _f: &File = &file;
+  //     }
+  //     {
+  //       let _f: &mut File = &mut file;
+  //     }
+
+  //     let req = TestRequest::default().to_http_request();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "text/x-toml"
+  //     );
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_DISPOSITION).unwrap(),
+  //       "inline; filename=\"Cargo.toml\""
+  //     );
+  //     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_mime_override() {
+  //     let mut server_config = ServerConfig::default();
+
+  //     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
+  //       filenames: ["Cargo.toml".to_owned()].iter().cloned().collect(),
+  //     });
+  //     server_config.mime_disposition = Some(
+  //       vec![(
+  //         "text/x-toml".to_owned(),
+  //         ContentDispositionConfig::Attachment,
+  //       )]
+  //       .iter()
+  //       .cloned()
+  //       .collect(),
+  //     );
+
+  //     let root_path_context = Arc::new((&server_config).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+
+  //     let request = TestRequest::get().uri("/").to_request();
+  //     let response = test::call_service(&mut srv, request).await;
+  //     assert_eq!(response.status(), StatusCode::OK);
+
+  //     let content_disposition = response
+  //       .headers()
+  //       .get(header::CONTENT_DISPOSITION)
+  //       .expect("To have CONTENT_DISPOSITION");
+  //     let content_disposition = content_disposition
+  //       .to_str()
+  //       .expect("Convert CONTENT_DISPOSITION to str");
+  //     assert_eq!(content_disposition, "attachment; filename=\"Cargo.toml\"");
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_ranges_status_code() {
+  //     let mut server_config = ServerConfig::default();
+
+  //     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
+  //       filenames: ["Cargo.toml".to_owned()].iter().cloned().collect(),
+  //     });
+
+  //     let root_path_context = Arc::new((&server_config).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(Files::new(
+  //       "/test",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+
+  //     // Valid range header
+  //     let request = TestRequest::get()
+  //       .uri("/t%65st/Cargo.toml")
+  //       .header(header::RANGE, "bytes=10-20")
+  //       .to_request();
+  //     let response = test::call_service(&mut srv, request).await;
+  //     assert_eq!(response.status(), StatusCode::PARTIAL_CONTENT);
+
+  //     // Invalid range header
+  //     let request = TestRequest::get()
+  //       .uri("/t%65st/Cargo.toml")
+  //       .header(header::RANGE, "bytes=1-0")
+  //       .to_request();
+  //     let response = test::call_service(&mut srv, request).await;
+
+  //     assert_eq!(response.status(), StatusCode::RANGE_NOT_SATISFIABLE);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_content_range_headers() {
+  //     let srv = test::init_service(|| {
+  //       let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //       let path_contexts = Arc::new(vec![]);
+
+  //       App::new().service(Files::new(
+  //         "/",
+  //         serve_dir("."),
+  //         root_path_context,
+  //         path_contexts,
+  //       ))
+  //     });
+
+  //     // Valid range header
+  //     let response = srv
+  //       .get("/tests/test.binary")
+  //       .header(header::RANGE, "bytes=10-20")
+  //       .send()
+  //       .await
+  //       .unwrap();
+  //     let content_range = response.headers().get(header::CONTENT_RANGE).unwrap();
+  //     assert_eq!(content_range.to_str().unwrap(), "bytes 10-20/100");
+
+  //     // Invalid range header
+  //     let response = srv
+  //       .get("/tests/test.binary")
+  //       .header(header::RANGE, "bytes=10-5")
+  //       .send()
+  //       .await
+  //       .unwrap();
+  //     let content_range = response.headers().get(header::CONTENT_RANGE).unwrap();
+  //     assert_eq!(content_range.to_str().unwrap(), "bytes */100");
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_content_length_headers() {
+  //     let srv = test::init_service(|| {
+  //       let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //       let path_contexts = Arc::new(vec![]);
+
+  //       App::new().service(Files::new(
+  //         "/",
+  //         serve_dir("."),
+  //         root_path_context,
+  //         path_contexts,
+  //       ))
+  //     });
+
+  //     // Valid range header
+  //     let response = srv
+  //       .get("/tests/test.binary")
+  //       .header(header::RANGE, "bytes=10-20")
+  //       .send()
+  //       .await
+  //       .unwrap();
+  //     let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
+  //     assert_eq!(content_length.to_str().unwrap(), "11");
+
+  //     // Valid range header, starting from 0
+  //     let response = srv
+  //       .get("/tests/test.binary")
+  //       .header(header::RANGE, "bytes=0-20")
+  //       .send()
+  //       .await
+  //       .unwrap();
+  //     let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
+  //     assert_eq!(content_length.to_str().unwrap(), "21");
+
+  //     // Without range header
+  //     let mut response = srv.get("/tests/test.binary").send().await.unwrap();
+  //     let content_length = response.headers().get(header::CONTENT_LENGTH).unwrap();
+  //     assert_eq!(content_length.to_str().unwrap(), "100");
+
+  //     // Should be no transfer-encoding
+  //     let transfer_encoding = response.headers().get(header::TRANSFER_ENCODING);
+  //     assert!(transfer_encoding.is_none());
+
+  //     // Check file contents
+  //     let bytes = response.body().await.unwrap();
+  //     let data = Bytes::from(fs::read("tests/test.binary").unwrap());
+
+  //     assert_eq!(bytes, data);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_head_content_length_headers() {
+  //     let srv = test::init_service(|| {
+  //       let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //       let path_contexts = Arc::new(vec![]);
+
+  //       App::new().service(Files::new(
+  //         "/",
+  //         serve_dir("."),
+  //         root_path_context,
+  //         path_contexts,
+  //       ))
+  //     });
+
+  //     let response = srv.head("/tests/test.binary").send().await.unwrap();
+
+  //     let content_length = response
+  //       .headers()
+  //       .get(header::CONTENT_LENGTH)
+  //       .unwrap()
+  //       .to_str()
+  //       .unwrap();
+
+  //     assert_eq!(content_length, "100");
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_static_files_with_spaces() {
+  //     let mut server_config = ServerConfig::default();
+
+  //     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
+  //       filenames: ["Cargo.toml".to_owned()].iter().cloned().collect(),
+  //     });
+
+  //     let root_path_context = Arc::new((&server_config).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+  //     let request = TestRequest::get()
+  //       .uri("/tests/test%20space.binary")
+  //       .to_request();
+  //     let response = test::call_service(&mut srv, request).await;
+  //     assert_eq!(response.status(), StatusCode::OK);
+
+  //     let bytes = test::read_body(response).await;
+  //     let data = Bytes::from(fs::read("tests/test space.binary").unwrap());
+  //     assert_eq!(bytes, data);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_files_not_allowed() {
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().default_service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+
+  //     let req = TestRequest::default()
+  //       .uri("/Cargo.toml")
+  //       .method(Method::POST)
+  //       .to_request();
+
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::METHOD_NOT_ALLOWED);
+
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().default_service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+  //     let req = TestRequest::default()
+  //       .method(Method::PUT)
+  //       .uri("/Cargo.toml")
+  //       .to_request();
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::METHOD_NOT_ALLOWED);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_files_guards() {
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(
+  //       Files::new("/", serve_dir("."), root_path_context, path_contexts).use_guards(guard::Post()),
+  //     ))
+  //     .await;
+
+  //     let req = TestRequest::default()
+  //       .uri("/Cargo.toml")
+  //       .method(Method::POST)
+  //       .to_request();
+
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::OK);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_content_encoding() {
+  //     let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
+  //       web::resource("/").to(|| async {
+  //         NamedFile::open("Cargo.toml")
+  //           .unwrap()
+  //           .set_content_encoding(header::ContentEncoding::Identity)
+  //       }),
+  //     ))
+  //     .await;
+
+  //     let request = TestRequest::get()
+  //       .uri("/")
+  //       .header(header::ACCEPT_ENCODING, "gzip")
+  //       .to_request();
+  //     let res = test::call_service(&mut srv, request).await;
+  //     assert_eq!(res.status(), StatusCode::OK);
+  //     assert!(!res.headers().contains_key(header::CONTENT_ENCODING));
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_content_encoding_gzip() {
+  //     let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
+  //       web::resource("/").to(|| async {
+  //         NamedFile::open("Cargo.toml")
+  //           .unwrap()
+  //           .set_content_encoding(header::ContentEncoding::Gzip)
+  //       }),
+  //     ))
+  //     .await;
+
+  //     let request = TestRequest::get()
+  //       .uri("/")
+  //       .header(header::ACCEPT_ENCODING, "gzip")
+  //       .to_request();
+  //     let res = test::call_service(&mut srv, request).await;
+  //     assert_eq!(res.status(), StatusCode::OK);
+  //     assert_eq!(
+  //       res
+  //         .headers()
+  //         .get(header::CONTENT_ENCODING)
+  //         .unwrap()
+  //         .to_str()
+  //         .unwrap(),
+  //       "gzip"
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_named_file_allowed_method() {
+  //     let req = TestRequest::default().method(Method::GET).to_http_request();
+  //     let file = NamedFile::open("Cargo.toml").unwrap();
+  //     let resp = file.respond_to(&req).await.unwrap();
+  //     assert_eq!(resp.status(), StatusCode::OK);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_static_files() {
+  //     let mut server_config = ServerConfig::default();
+
+  //     server_config.index_strategy = Some(IndexStrategyConfig::AlwaysShowListing);
+
+  //     let root_path_context = Arc::new((&server_config).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+  //     let req = TestRequest::with_uri("/missing").to_request();
+
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
+
+  //     // Without index strategy.
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+
+  //     let req = TestRequest::default().to_request();
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
+
+  //     // With default renderer.
+  //     server_config.index_strategy = Some(IndexStrategyConfig::AlwaysShowListing);
+
+  //     let root_path_context = Arc::new((&server_config).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut srv = test::init_service(App::new().service(Files::new(
+  //       "/",
+  //       serve_dir("."),
+  //       root_path_context,
+  //       path_contexts,
+  //     )))
+  //     .await;
+  //     let req = TestRequest::with_uri("/tests").to_request();
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(
+  //       resp.headers().get(header::CONTENT_TYPE).unwrap(),
+  //       "text/html; charset=utf-8"
+  //     );
+
+  //     let bytes = test::read_body(resp).await;
+  //     assert!(format!("{:?}", bytes).contains("/tests/test.png"));
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_redirect_to_slash_directory() {
+  //     let mut server_config = ServerConfig::default();
+
+  //     server_config.index_strategy = Some(IndexStrategyConfig::IndexFiles {
+  //       filenames: ["test.png".to_owned()].iter().cloned().collect(),
+  //     });
+
+  //     let root_path_context = Arc::new((&server_config).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     // should not redirect if no index
+  //     // let mut srv = test::init_service(
+  //     //   App::new().service(Files::new("/", serve_dir(".")).redirect_to_slash_directory()),
+  //     // )
+  //     // .await;
+  //     // let req = TestRequest::with_uri("/tests").to_request();
+  //     // let resp = test::call_service(&mut srv, req).await;
+  //     // assert_eq!(resp.status(), StatusCode::NOT_FOUND);
+
+  //     // should redirect if index present
+  //     let mut srv = test::init_service(
+  //       App::new().service(
+  //         Files::new("/", serve_dir("."), root_path_context, path_contexts)
+  //           .redirect_to_slash_directory(),
+  //       ),
+  //     )
+  //     .await;
+  //     let req = TestRequest::with_uri("/tests").to_request();
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::FOUND);
+
+  //     // should not redirect if the path is wrong
+  //     let req = TestRequest::with_uri("/not_existing").to_request();
+  //     let resp = test::call_service(&mut srv, req).await;
+  //     assert_eq!(resp.status(), StatusCode::NOT_FOUND);
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_static_files_bad_directory() {
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let _st: Files = Files::new("/", serve_dir("missing"), root_path_context, path_contexts);
+
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let _st: Files = Files::new(
+  //       "/",
+  //       serve_dir("Cargo.toml"),
+  //       root_path_context,
+  //       path_contexts,
+  //     );
+  //   }
+
+  //   #[actix_rt::test]
+  //   async fn test_default_handler_file_missing() {
+  //     let root_path_context = Arc::new((&ServerConfig::default()).try_into().unwrap());
+  //     let path_contexts = Arc::new(vec![]);
+
+  //     let mut st = Files::new("/", serve_dir("."), root_path_context, path_contexts)
+  //       .default_handler(|req: ServiceRequest| {
+  //         ok(req.into_response(HttpResponse::Ok().body("default content")))
+  //       })
+  //       .new_service(())
+  //       .await
+  //       .unwrap();
+  //     let req = TestRequest::with_uri("/missing").to_srv_request();
+
+  //     let resp = test::call_service(&mut st, req).await;
+  //     assert_eq!(resp.status(), StatusCode::OK);
+  //     let bytes = test::read_body(resp).await;
+  //     assert_eq!(bytes, Bytes::from_static(b"default content"));
+  //   }
 
   //     #[actix_rt::test]
   //     async fn test_serve_index() {
diff --git a/src/files/named_ext.rs b/src/files/named_ext.rs
index 9062522..fe2be1a 100644
--- a/src/files/named_ext.rs
+++ b/src/files/named_ext.rs
@@ -8,7 +8,7 @@ pub trait NamedFileExt {
 }
 
 impl NamedFileExt for NamedFile {
-  fn with_path_context(mut self, path_context: &PathContext) -> Self {
+  fn with_path_context(self, path_context: &PathContext) -> Self {
     let mut this = self;
 
     if let Some(mime_disposition) = path_context.get_mime_disposition() {
diff --git a/src/files/service.rs b/src/files/service.rs
index afab4c1..ff4c332 100644
--- a/src/files/service.rs
+++ b/src/files/service.rs
@@ -17,17 +17,17 @@ use actix_web::{
   HttpResponse, ResponseError,
 };
 use async_recursion::async_recursion;
-use futures_util::future::{err, ok, Either, LocalBoxFuture, Ready};
+use futures_util::future::LocalBoxFuture;
 use snafu::ResultExt;
 use snafu::Snafu;
 use std::{
   convert::TryInto,
   io,
+  ops::Deref,
   path::{Path, PathBuf},
   rc::Rc,
   sync::{Arc, RwLock},
   task::{Context, Poll},
-  ops::Deref,
 };
 
 /// Errors which can occur when serving static files.
@@ -101,11 +101,11 @@ struct RequestContext {
 pub struct FilesService(pub(crate) Rc<FilesServiceInner>);
 
 impl Deref for FilesService {
-    type Target = FilesServiceInner;
+  type Target = FilesServiceInner;
 
-    fn deref(&self) -> &Self::Target {
-        &self.0
-    }
+  fn deref(&self) -> &Self::Target {
+    &self.0
+  }
 }
 
 pub struct FilesServiceInner {
@@ -356,7 +356,7 @@ impl FilesServiceInner {
 
     match NamedFile::open(path).context(OpenFileError) {
       Ok(named_file) => {
-        let (http_req, payload) = req.into_parts();
+        let (http_req, _payload) = req.into_parts();
 
         let mut response = named_file
           .with_path_context(&path_context)
diff --git a/src/server.rs b/src/server.rs
index 8425eb4..404d592 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -1,14 +1,13 @@
 use crate::{
-  config::{CompressionConfig, ServerConfig},
+  config::ServerConfig,
   files::{path_context::PathContext, Files},
   thread,
   thread::ThreadHandle,
 };
-use actix::System;
-use actix_http::http::{uri::InvalidUri, ContentEncoding};
+use actix_http::http::uri::InvalidUri;
 use actix_rt::Runtime;
 use actix_web::{
-  dev::{Server as ActixServer, ServerHandle},
+  dev::ServerHandle,
   middleware::{self, Logger},
   App, HttpServer,
 };
@@ -109,9 +108,7 @@ impl Server {
 
       let _ = tx.send(srv.handle());
 
-      rt.block_on(async {
-        srv.await
-      });
+      rt.block_on(async { srv.await });
 
       Ok(())
 
-- 
GitLab