diff options
author | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2021-05-12 11:53:29 +0000 |
---|---|---|
committer | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2021-08-30 17:48:49 +0000 |
commit | 79963079fae23668cb0694834faa5d43d0d99f3b (patch) | |
tree | 033bce5f4ddbe68a639229598f1fca8737cf8257 /src/main.rs | |
parent | Bump deps (diff) | |
download | miniserve-79963079fae23668cb0694834faa5d43d0d99f3b.tar.gz miniserve-79963079fae23668cb0694834faa5d43d0d99f3b.zip |
Fix clippy::too_many_arguments and rework error ..
... page rendering
Too many arguments are moved around and many of them are already stored
in MiniserveConfig. Many of these are used to render error pages.
To fix this issue, it was necessary to rework error page rendering:
1. Implement `ResponseError` for `ContextualError` so that it can be
returned from service handlers as is and will then be automatically
logged to the console and converted into an error response.
2. At service handler level, all error responses are now rendered as
plain text.
3. 'error_page_middleware' is now responsible for the rendering of the
final error page from plain text reponses.
Signed-off-by: Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com>
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 103 |
1 files changed, 8 insertions, 95 deletions
diff --git a/src/main.rs b/src/main.rs index 5f68cd2..f3ae50b 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}; @@ -210,6 +207,7 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { // 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), @@ -289,8 +287,8 @@ fn configure_header(conf: &MiniserveConfig) -> middleware::DefaultHeaders { /// Configures the Actix application fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { + let path = &conf.path; 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() { @@ -300,64 +298,22 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { }; 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 { + let files = match conf.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(), - ) - }) + .files_listing_renderer(listing::directory_listing) .prefer_utf8(true) .redirect_to_slash_directory() .default_handler(web::to(error_404)); @@ -365,29 +321,11 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { } }; - 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.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, - ) - })), + web::resource(&upload_route).route(web::post().to(file_upload::upload_file)), ) // Handle directories .service(serve_path); @@ -401,33 +339,8 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { } } -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 { |