diff options
author | Sven-Hendrik Haase <svenstaro@gmail.com> | 2021-08-31 12:07:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-31 12:07:37 +0000 |
commit | 1e4230e8c4b462611c680f28c9fc8c80474dbca4 (patch) | |
tree | 9c1b8b2a7c472d939ddf7327e597fcc4213a3451 /src/main.rs | |
parent | Bump deps (diff) | |
parent | Use selected theme in error page (diff) | |
download | miniserve-1e4230e8c4b462611c680f28c9fc8c80474dbca4.tar.gz miniserve-1e4230e8c4b462611c680f28c9fc8c80474dbca4.zip |
Merge pull request #529 from aliemjay/src-refactor
[Refactor] Fix clippy::too_many_arguments and rework error page rendering
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 173 |
1 files changed, 34 insertions, 139 deletions
diff --git a/src/main.rs b/src/main.rs index 5f68cd2..e5cc596 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,10 +5,7 @@ use std::thread; use std::time::Duration; use actix_web::web; -use actix_web::{ - http::{header::ContentType, StatusCode}, - Responder, -}; +use actix_web::{http::header::ContentType, Responder}; use actix_web::{middleware, App, HttpRequest, HttpResponse}; use anyhow::{bail, Result}; use clap::{crate_version, Clap, IntoApp}; @@ -205,18 +202,22 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { App::new() .wrap(configure_header(&inside_config.clone())) .app_data(inside_config.clone()) - // we should use `actix_web_httpauth::middleware::HttpAuthentication` - // but it is unfortuantrly broken - // see: https://github.com/actix/actix-extras/issues/127 - // TODO replace this when fixed upstream - .wrap_fn(auth::auth_middleware) + .wrap_fn(errors::error_page_middleware) .wrap(middleware::Logger::default()) .route( &format!("/{}", inside_config.favicon_route), web::get().to(favicon), ) .route(&format!("/{}", inside_config.css_route), web::get().to(css)) - .configure(|c| configure_app(c, &inside_config)) + .service( + web::scope(inside_config.random_route.as_deref().unwrap_or("")) + // we should use `actix_web_httpauth::middleware::HttpAuthentication` + // but it is unfortuantrly broken + // see: https://github.com/actix/actix-extras/issues/127 + // TODO replace this when fixed upstream + .wrap_fn(auth::auth_middleware) + .configure(|c| configure_app(c, &inside_config)), + ) .default_service(web::get().to(error_404)) }); @@ -289,145 +290,39 @@ fn configure_header(conf: &MiniserveConfig) -> middleware::DefaultHeaders { /// Configures the Actix application fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { - let random_route = conf.random_route.clone().unwrap_or_default(); - let uses_random_route = conf.random_route.clone().is_some(); - let full_route = format!("/{}", random_route); - - let upload_route = if let Some(random_route) = conf.random_route.clone() { - format!("/{}/upload", random_route) - } else { - "/upload".to_string() - }; - - let serve_path = { - let path = &conf.path; - let no_symlinks = conf.no_symlinks; - let show_hidden = conf.show_hidden; - let random_route = conf.random_route.clone(); - let favicon_route = conf.favicon_route.clone(); - let css_route = conf.css_route.clone(); - let default_color_scheme = conf.default_color_scheme.clone(); - let default_color_scheme_dark = conf.default_color_scheme_dark.clone(); - let show_qrcode = conf.show_qrcode; - let file_upload = conf.file_upload; - let tar_enabled = conf.tar_enabled; - let tar_gz_enabled = conf.tar_gz_enabled; - let zip_enabled = conf.zip_enabled; - let dirs_first = conf.dirs_first; - let hide_version_footer = conf.hide_version_footer; - let cmd_enable_symlink_dest = conf.show_symlink_info; - let title = conf.title.clone(); - - if path.is_file() { - None - } else { - let u_r = upload_route.clone(); - - // build `Files` service using configuraion parameters - let files = actix_files::Files::new(&full_route, path); - let files = match &conf.index { - Some(index_file) => files.index_file(index_file.to_string_lossy()), - None => files, - }; - let files = match show_hidden { - true => files.use_hidden_files(), - false => files, - }; - let files = files - .show_files_listing() - .files_listing_renderer(move |dir, req| { - listing::directory_listing( - dir, - req, - no_symlinks, - show_hidden, - file_upload, - random_route.clone(), - favicon_route.clone(), - css_route.clone(), - &default_color_scheme, - &default_color_scheme_dark, - show_qrcode, - u_r.clone(), - tar_enabled, - tar_gz_enabled, - zip_enabled, - dirs_first, - hide_version_footer, - cmd_enable_symlink_dest, - title.clone(), - ) - }) - .prefer_utf8(true) - .redirect_to_slash_directory() - .default_handler(web::to(error_404)); - Some(files) - } + let files_service = || { + let files = actix_files::Files::new("", &conf.path); + let files = match &conf.index { + Some(index_file) => files.index_file(index_file.to_string_lossy()), + None => files, + }; + let files = match conf.show_hidden { + true => files.use_hidden_files(), + false => files, + }; + files + .show_files_listing() + .files_listing_renderer(listing::directory_listing) + .prefer_utf8(true) + .redirect_to_slash_directory() + .default_handler(web::to(error_404)) }; - let favicon_route = conf.favicon_route.clone(); - let css_route = conf.css_route.clone(); - - let default_color_scheme = conf.default_color_scheme.clone(); - let default_color_scheme_dark = conf.default_color_scheme_dark.clone(); - let hide_version_footer = conf.hide_version_footer; - - if let Some(serve_path) = serve_path { + if !conf.path.is_file() { if conf.file_upload { // Allow file upload - app.service( - web::resource(&upload_route).route(web::post().to(move |req, payload| { - file_upload::upload_file( - req, - payload, - uses_random_route, - favicon_route.clone(), - css_route.clone(), - default_color_scheme.clone(), - default_color_scheme_dark.clone(), - hide_version_footer, - ) - })), - ) - // Handle directories - .service(serve_path); - } else { - // Handle directories - app.service(serve_path); + app.service(web::resource("/upload").route(web::post().to(file_upload::upload_file))); } + // Handle directories + app.service(files_service()); } else { // Handle single files - app.service(web::resource(&full_route).route(web::to(listing::file_handler))); + app.service(web::resource(["", "/"]).route(web::to(listing::file_handler))); } } -async fn error_404(req: HttpRequest) -> HttpResponse { - let err_404 = ContextualError::RouteNotFoundError(req.path().to_string()); - let conf = req.app_data::<MiniserveConfig>().unwrap(); - let uses_random_route = conf.random_route.is_some(); - let favicon_route = conf.favicon_route.clone(); - let css_route = conf.css_route.clone(); - let query_params = listing::extract_query_parameters(&req); - - errors::log_error_chain(err_404.to_string()); - - actix_web::HttpResponse::NotFound().body( - renderer::render_error( - &err_404.to_string(), - StatusCode::NOT_FOUND, - "/", - query_params.sort, - query_params.order, - false, - !uses_random_route, - &favicon_route, - &css_route, - &conf.default_color_scheme, - &conf.default_color_scheme_dark, - conf.hide_version_footer, - ) - .into_string(), - ) +async fn error_404(req: HttpRequest) -> Result<HttpResponse, ContextualError> { + Err(ContextualError::RouteNotFoundError(req.path().to_string())) } async fn favicon() -> impl Responder { |