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