aboutsummaryrefslogtreecommitdiffstats
path: root/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/config.rs b/src/config.rs
new file mode 100644
index 0000000..3d9971b
--- /dev/null
+++ b/src/config.rs
@@ -0,0 +1,62 @@
+use actix_web::{fs, App, HttpRequest, Result};
+use std::net::IpAddr;
+
+use crate::auth;
+use crate::listing;
+
+#[derive(Clone, Debug)]
+pub struct MiniserveConfig {
+ pub verbose: bool,
+ pub path: std::path::PathBuf,
+ pub port: u16,
+ pub interfaces: Vec<IpAddr>,
+ pub auth: Option<auth::BasicAuthParams>,
+ pub path_explicitly_chosen: bool,
+ pub no_symlinks: bool,
+ pub random_route: Option<String>,
+ pub sort_method: listing::SortingMethods,
+ pub reverse_sort: bool,
+}
+
+pub fn configure_app(app: App<MiniserveConfig>) -> App<MiniserveConfig> {
+ let s = {
+ let path = &app.state().path;
+ let no_symlinks = app.state().no_symlinks;
+ let random_route = app.state().random_route.clone();
+ let sort_method = app.state().sort_method.clone();
+ let reverse_sort = app.state().reverse_sort;
+ if path.is_file() {
+ None
+ } else {
+ Some(
+ fs::StaticFiles::new(path)
+ .expect("Couldn't create path")
+ .show_files_listing()
+ .files_listing_renderer(move |dir, req| {
+ listing::directory_listing(
+ dir,
+ req,
+ no_symlinks,
+ random_route.clone(),
+ sort_method.clone(),
+ reverse_sort,
+ )
+ }),
+ )
+ }
+ };
+
+ let random_route = app.state().random_route.clone().unwrap_or_default();
+ let full_route = format!("/{}", random_route);
+
+ if let Some(s) = s {
+ app.handler(&full_route, s)
+ } else {
+ app.resource(&full_route, |r| r.f(file_handler))
+ }
+}
+
+fn file_handler(req: &HttpRequest<MiniserveConfig>) -> Result<fs::NamedFile> {
+ let path = &req.state().path;
+ Ok(fs::NamedFile::open(path)?)
+}