aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohannes May <johannes@may-se.de>2022-03-12 21:12:35 +0000
committerJohannes May <johannes@may-se.de>2022-03-12 21:12:35 +0000
commita9ee18dcbbf837225f05d4dd0186fc989a319c63 (patch)
treeb8202254eefb688814e409b1fd7d5f23cb5b09e2 /src
parentMerge pull request #747 from svenstaro/dependabot/cargo/clap_complete-3.1.1 (diff)
downloadminiserve-a9ee18dcbbf837225f05d4dd0186fc989a319c63.tar.gz
miniserve-a9ee18dcbbf837225f05d4dd0186fc989a319c63.zip
Allow to set the accept input attribute to arbitrary values
Diffstat (limited to '')
-rw-r--r--src/args.rs20
-rw-r--r--src/config.rs23
-rw-r--r--src/renderer.rs5
3 files changed, 46 insertions, 2 deletions
diff --git a/src/args.rs b/src/args.rs
index 841db3a..7667bee 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -8,6 +8,13 @@ use crate::auth;
use crate::errors::ContextualError;
use crate::renderer;
+#[derive(clap::ArgEnum, Clone)]
+pub enum MediaType {
+ Image,
+ Audio,
+ Video,
+}
+
#[derive(Parser)]
#[clap(name = "miniserve", author, about, version)]
pub struct CliArgs {
@@ -104,6 +111,19 @@ pub struct CliArgs {
#[clap(short = 'u', long = "upload-files")]
pub file_upload: bool,
+ /// Specify uploadable media types
+ #[clap(arg_enum, short = 'm', long = "media-type", requires = "file-upload")]
+ pub media_type: Option<Vec<MediaType>>,
+
+ /// Directly specify the uploadable media type expression
+ #[clap(
+ short = 'M',
+ long = "raw-media-type",
+ requires = "file-upload",
+ conflicts_with = "media-type"
+ )]
+ pub media_type_raw: Option<String>,
+
/// Enable overriding existing files during file upload
#[clap(short = 'o', long = "overwrite-files")]
pub overwrite_files: bool,
diff --git a/src/config.rs b/src/config.rs
index 73fcec2..1bb8e08 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -13,7 +13,10 @@ use http::HeaderMap;
#[cfg(feature = "tls")]
use rustls_pemfile as pemfile;
-use crate::{args::CliArgs, auth::RequiredAuth};
+use crate::{
+ args::{CliArgs, MediaType},
+ auth::RequiredAuth,
+};
/// Possible characters for random routes
const ROUTE_ALPHABET: [char; 16] = [
@@ -81,6 +84,9 @@ pub struct MiniserveConfig {
/// Enable file upload
pub file_upload: bool,
+ /// HTML accept attribute value
+ pub uploadable_media_type: Option<String>,
+
/// Enable upload to override existing files
pub overwrite_files: bool,
@@ -188,6 +194,20 @@ impl MiniserveConfig {
#[cfg(not(feature = "tls"))]
let tls_rustls_server_config = None;
+ let uploadable_media_type = args.media_type_raw.or_else(|| {
+ args.media_type.map(|types| {
+ types
+ .into_iter()
+ .map(|t| match t {
+ MediaType::Audio => "audio/*",
+ MediaType::Image => "image/*",
+ MediaType::Video => "video/*",
+ })
+ .collect::<Vec<_>>()
+ .join(",")
+ })
+ });
+
Ok(MiniserveConfig {
verbose: args.verbose,
path: args.path.unwrap_or_else(|| PathBuf::from(".")),
@@ -207,6 +227,7 @@ impl MiniserveConfig {
overwrite_files: args.overwrite_files,
show_qrcode: args.qrcode,
file_upload: args.file_upload,
+ uploadable_media_type,
tar_enabled: args.enable_tar,
tar_gz_enabled: args.enable_tar_gz,
zip_enabled: args.enable_zip,
diff --git a/src/renderer.rs b/src/renderer.rs
index ef7285b..c64d459 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -107,7 +107,10 @@ pub fn page(
form id="file_submit" action=(upload_action) method="POST" enctype="multipart/form-data" {
p { "Select a file to upload or drag it anywhere into the window" }
div {
- input #file-input type="file" name="file_to_upload" required="" multiple {}
+ @match &conf.uploadable_media_type {
+ Some(accept) => {input #file-input accept=(accept) type="file" name="file_to_upload" required="" multiple {}},
+ None => {input #file-input type="file" name="file_to_upload" required="" multiple {}}
+ }
button type="submit" { "Upload file" }
}
}