aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/args.rs12
-rw-r--r--src/file_upload.rs2
-rw-r--r--src/listing.rs2
-rw-r--r--src/main.rs20
4 files changed, 32 insertions, 4 deletions
diff --git a/src/args.rs b/src/args.rs
index 8fde78a..fe976ed 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -27,6 +27,13 @@ struct CLIArgs {
#[structopt(name = "PATH", parse(from_os_str))]
path: Option<PathBuf>,
+ /// The name of a directory index file to serve, like "index.html"
+ ///
+ /// Normally, when miniserve serves a directory, it creates a listing for that directory.
+ /// However, if a directory contains this file, miniserve will serve that file instead.
+ #[structopt(long, parse(from_os_str), name="index_file")]
+ index: Option<PathBuf>,
+
/// Port to use
#[structopt(short = "p", long = "port", default_value = "8080")]
port: u16,
@@ -108,8 +115,8 @@ fn parse_auth(src: &str) -> Result<auth::RequiredAuth, ContextualError> {
};
match second_part {
- "sha256" => auth::RequiredAuthPassword::Sha256(hash_bin.to_owned()),
- "sha512" => auth::RequiredAuthPassword::Sha512(hash_bin.to_owned()),
+ "sha256" => auth::RequiredAuthPassword::Sha256(hash_bin),
+ "sha512" => auth::RequiredAuthPassword::Sha512(hash_bin),
_ => return Err(ContextualError::InvalidHashMethod(second_part.to_owned())),
}
} else {
@@ -162,6 +169,7 @@ pub fn parse_args() -> crate::MiniserveConfig {
no_symlinks: args.no_symlinks,
random_route,
default_color_scheme,
+ index: args.index,
overwrite_files: args.overwrite_files,
file_upload: args.file_upload,
}
diff --git a/src/file_upload.rs b/src/file_upload.rs
index 900792f..af4fcf2 100644
--- a/src/file_upload.rs
+++ b/src/file_upload.rs
@@ -201,7 +201,7 @@ pub fn upload_file(
.then(move |e| match e {
Ok(_) => future::ok(
HttpResponse::SeeOther()
- .header(header::LOCATION, return_path.to_string())
+ .header(header::LOCATION, return_path)
.finish(),
),
Err(e) => create_error_response(
diff --git a/src/listing.rs b/src/listing.rs
index 42eb59a..d419775 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -152,7 +152,7 @@ pub fn directory_listing<S>(
let base = Path::new(serve_path);
let random_route = format!("/{}", random_route.unwrap_or_default());
- let is_root = base.parent().is_none() || req.path() == random_route;
+ let is_root = base.parent().is_none() || Path::new(&req.path()) == Path::new(&random_route);
let current_dir = match base.strip_prefix(random_route) {
Ok(c_d) => Path::new("/").join(c_d),
Err(_) => base.to_path_buf(),
diff --git a/src/main.rs b/src/main.rs
index 2482d95..9b9c628 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -51,6 +51,12 @@ pub struct MiniserveConfig {
/// Default color scheme
pub default_color_scheme: themes::ColorScheme,
+ /// The name of a directory index file to serve, like "index.html"
+ ///
+ /// Normally, when miniserve serves a directory, it creates a listing for that directory.
+ /// However, if a directory contains this file, miniserve will serve that file instead.
+ pub index: Option<std::path::PathBuf>,
+
/// Enable file upload
pub file_upload: bool,
@@ -129,6 +135,14 @@ fn run() -> Result<(), ContextualError> {
let canon_path = miniserve_config.path.canonicalize().map_err(|e| {
ContextualError::IOError("Failed to resolve path to be served".to_string(), e)
})?;
+
+ if let Some(index_path) = &miniserve_config.index {
+ let has_index: std::path::PathBuf = [&canon_path, index_path].iter().collect();
+ if !has_index.exists() {
+
+ println!("{warning} The provided index file could not be found.", warning=Color::RGB(255, 192, 0).paint("Notice:").bold());
+ }
+ }
let path_string = canon_path.to_string_lossy();
println!(
@@ -244,6 +258,12 @@ fn configure_app(app: App<MiniserveConfig>) -> App<MiniserveConfig> {
};
if path.is_file() {
None
+ } else if let Some(index_file) = &app.state().index {
+ Some(
+ fs::StaticFiles::new(path)
+ .expect("Failed to setup static file handler")
+ .index_file(index_file.to_string_lossy())
+ )
} else {
let u_r = upload_route.clone();
Some(