aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs173
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 {