aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven-Hendrik Haase <svenstaro@gmail.com>2020-09-24 02:39:19 +0000
committerSven-Hendrik Haase <svenstaro@gmail.com>2020-09-24 02:39:19 +0000
commit13352ef42532d1f96e3b54059756d8b6e3c7f374 (patch)
tree4d22230eabb8954cedaca8966cc0d40cda5473b1
parentSlightly better variable name (diff)
downloadminiserve-13352ef42532d1f96e3b54059756d8b6e3c7f374.tar.gz
miniserve-13352ef42532d1f96e3b54059756d8b6e3c7f374.zip
Add embedded favicon (fixes #364)
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml1
-rw-r--r--src/args.rs5
-rw-r--r--src/auth.rs1
-rw-r--r--src/file_upload.rs7
-rw-r--r--src/listing.rs3
-rw-r--r--src/main.rs23
-rw-r--r--src/renderer.rs8
8 files changed, 45 insertions, 4 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 2398161..cafd617 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1652,6 +1652,7 @@ dependencies = [
"libflate",
"log",
"maud",
+ "mime",
"nanoid",
"percent-encoding",
"port_check",
diff --git a/Cargo.toml b/Cargo.toml
index 08cb54b..f179f28 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -45,6 +45,7 @@ actix-files = "0.3.0"
actix-multipart = "0.3.0"
actix-rt = "1.1.1"
actix-web-httpauth = "0.5.0"
+mime = "0.3"
[dev-dependencies]
assert_cmd = "1.0"
diff --git a/src/args.rs b/src/args.rs
index 8893ebd..8467a92 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -171,6 +171,10 @@ pub fn parse_args() -> crate::MiniserveConfig {
None
};
+ // Generate some random route for the favicon so that it is very unlikely to conflict with a
+ // real file.
+ let favicon_route = nanoid::nanoid!(10, &ROUTE_ALPHABET);
+
let default_color_scheme = args.color_scheme;
let path_explicitly_chosen = args.path.is_some();
@@ -189,6 +193,7 @@ pub fn parse_args() -> crate::MiniserveConfig {
path_explicitly_chosen,
no_symlinks: args.no_symlinks,
random_route,
+ favicon_route,
default_color_scheme,
index: args.index,
overwrite_files: args.overwrite_files,
diff --git a/src/auth.rs b/src/auth.rs
index 91c7bb0..e3eec89 100644
--- a/src/auth.rs
+++ b/src/auth.rs
@@ -124,6 +124,7 @@ fn build_unauthorized_response(
state.default_color_scheme,
false,
false,
+ &state.favicon_route,
)
.into_string()
}
diff --git a/src/file_upload.rs b/src/file_upload.rs
index 136bd45..394afbc 100644
--- a/src/file_upload.rs
+++ b/src/file_upload.rs
@@ -111,6 +111,7 @@ pub fn upload_file(
payload: actix_web::web::Payload,
default_color_scheme: ColorScheme,
uses_random_route: bool,
+ favicon_route: String,
) -> Pin<Box<dyn Future<Output = Result<HttpResponse, actix_web::Error>>>> {
let conf = req.app_data::<crate::MiniserveConfig>().unwrap();
let return_path = if let Some(header) = req.headers().get(header::REFERER) {
@@ -139,6 +140,7 @@ pub fn upload_file(
color_scheme,
default_color_scheme,
uses_random_route,
+ &favicon_route,
));
}
};
@@ -159,6 +161,7 @@ pub fn upload_file(
color_scheme,
default_color_scheme,
uses_random_route,
+ &favicon_route,
));
}
};
@@ -179,6 +182,7 @@ pub fn upload_file(
color_scheme,
default_color_scheme,
uses_random_route,
+ &favicon_route,
));
}
};
@@ -204,6 +208,7 @@ pub fn upload_file(
color_scheme,
default_color_scheme,
uses_random_route,
+ &favicon_route,
),
}),
)
@@ -220,6 +225,7 @@ fn create_error_response(
color_scheme: ColorScheme,
default_color_scheme: ColorScheme,
uses_random_route: bool,
+ favicon_route: &str,
) -> future::Ready<Result<HttpResponse, actix_web::Error>> {
errors::log_error_chain(description.to_string());
future::ok(
@@ -236,6 +242,7 @@ fn create_error_response(
default_color_scheme,
true,
!uses_random_route,
+ &favicon_route,
)
.into_string(),
),
diff --git a/src/listing.rs b/src/listing.rs
index 89d4e6c..a70e237 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -137,6 +137,7 @@ pub fn directory_listing(
skip_symlinks: bool,
file_upload: bool,
random_route: Option<String>,
+ favicon_route: String,
default_color_scheme: ColorScheme,
show_qrcode: bool,
upload_route: String,
@@ -296,6 +297,7 @@ pub fn directory_listing(
default_color_scheme,
false,
false,
+ &favicon_route,
)
.into_string(),
),
@@ -356,6 +358,7 @@ pub fn directory_listing(
show_qrcode,
file_upload,
&upload_route,
+ &favicon_route,
&encoded_dir,
&display_dir,
tar_enabled,
diff --git a/src/main.rs b/src/main.rs
index 12314b0..f50b1a4 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,10 @@
#![feature(proc_macro_hygiene)]
-use actix_web::http::StatusCode;
use actix_web::web;
+use actix_web::{
+ http::{header::ContentType, StatusCode},
+ Responder,
+};
use actix_web::{middleware, App, HttpRequest, HttpResponse};
use actix_web_httpauth::middleware::HttpAuthentication;
use std::io::{self, Write};
@@ -50,6 +53,9 @@ pub struct MiniserveConfig {
/// Enable random route generation
pub random_route: Option<String>,
+ /// Randomly generated favicon route
+ pub favicon_route: String,
+
/// Default color scheme
pub default_color_scheme: themes::ColorScheme,
@@ -239,6 +245,7 @@ async fn run() -> Result<(), ContextualError> {
HttpAuthentication::basic(auth::handle_auth),
))
.wrap(middleware::Logger::default())
+ .route(&format!("/{}", inside_config.favicon_route), web::get().to(favicon))
.configure(|c| configure_app(c, &inside_config))
.default_service(web::get().to(error_404))
})
@@ -270,6 +277,7 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) {
let path = &conf.path;
let no_symlinks = conf.no_symlinks;
let random_route = conf.random_route.clone();
+ let favicon_route = conf.favicon_route.clone();
let default_color_scheme = conf.default_color_scheme;
let show_qrcode = conf.show_qrcode;
let file_upload = conf.file_upload;
@@ -298,6 +306,7 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) {
no_symlinks,
file_upload,
random_route.clone(),
+ favicon_route.clone(),
default_color_scheme,
show_qrcode,
u_r.clone(),
@@ -310,13 +319,14 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) {
}
};
+ let favicon_route = conf.favicon_route.clone();
if let Some(serve_path) = serve_path {
if conf.file_upload {
let default_color_scheme = conf.default_color_scheme;
// Allow file upload
app.service(
web::resource(&upload_route).route(web::post().to(move |req, payload| {
- file_upload::upload_file(req, payload, default_color_scheme, uses_random_route)
+ file_upload::upload_file(req, payload, default_color_scheme, uses_random_route, favicon_route.clone())
})),
)
// Handle directories
@@ -336,6 +346,7 @@ async fn error_404(req: HttpRequest) -> HttpResponse {
let conf = req.app_data::<MiniserveConfig>().unwrap();
let default_color_scheme = conf.default_color_scheme;
let uses_random_route = conf.random_route.is_some();
+ let favicon_route = conf.favicon_route.clone();
let query_params = listing::extract_query_parameters(&req);
let color_scheme = query_params.theme.unwrap_or(default_color_scheme);
@@ -352,7 +363,15 @@ async fn error_404(req: HttpRequest) -> HttpResponse {
default_color_scheme,
false,
!uses_random_route,
+ &favicon_route,
)
.into_string(),
)
}
+
+async fn favicon() -> impl Responder {
+ let logo = include_str!("../data/logo.svg");
+ web::HttpResponse::Ok()
+ .set(ContentType(mime::IMAGE_SVG))
+ .message_body(logo.into())
+}
diff --git a/src/renderer.rs b/src/renderer.rs
index c26059e..11fe8e3 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -22,6 +22,7 @@ pub fn page(
show_qrcode: bool,
file_upload: bool,
upload_route: &str,
+ favicon_route: &str,
encoded_dir: &str,
display_dir: &str,
tar_enabled: bool,
@@ -39,7 +40,7 @@ pub fn page(
html! {
(DOCTYPE)
html {
- (page_header(display_dir, color_scheme, file_upload, false))
+ (page_header(display_dir, color_scheme, file_upload, favicon_route, false))
body#drop-container {
@if file_upload {
div.drag-form {
@@ -838,6 +839,7 @@ fn page_header(
serve_path: &str,
color_scheme: ColorScheme,
file_upload: bool,
+ favicon_route: &str,
is_error: bool,
) -> Markup {
html! {
@@ -845,6 +847,7 @@ fn page_header(
meta charset="utf-8";
meta http-equiv="X-UA-Compatible" content="IE=edge";
meta name="viewport" content="width=device-width, initial-scale=1";
+ link rel="icon" type="image/svg+xml" href={ "/" (favicon_route) };
@if is_error {
title { (serve_path) }
} @else {
@@ -924,6 +927,7 @@ pub fn render_error(
default_color_scheme: ColorScheme,
has_referer: bool,
display_back_link: bool,
+ favicon_route: &str,
) -> Markup {
let link = if has_referer {
return_address.to_string()
@@ -940,7 +944,7 @@ pub fn render_error(
html! {
(DOCTYPE)
html {
- (page_header(&error_code.to_string(), color_scheme, false, true))
+ (page_header(&error_code.to_string(), color_scheme, false, favicon_route, true))
body {
div.error {
p { (error_code.to_string()) }