aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilux <silux@silux.ink>2023-02-22 12:24:46 +0000
committerSilux <silux@silux.ink>2023-02-22 12:24:46 +0000
commit27702d6687e40663f47c5445a4415365d116651f (patch)
tree6ae93ce500e2ab04cd60acd0153e5b56e254518c
parentMake the wget footer click to copy (diff)
downloadminiserve-27702d6687e40663f47c5445a4415365d116651f.tar.gz
miniserve-27702d6687e40663f47c5445a4415365d116651f.zip
Switched from using AsRef<str> to using &Uri
I honestly just switched the definition and then frantically changed small things based on rusts error messages, but it passes fmt, clippy and tests so I think it's fine. This allow a bit finer control over the URI, but is honetly a bit insignificant.
-rw-r--r--src/listing.rs14
-rw-r--r--src/renderer.rs19
2 files changed, 17 insertions, 16 deletions
diff --git a/src/listing.rs b/src/listing.rs
index a62c969..e360368 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -163,12 +163,12 @@ pub fn directory_listing(
let base = Path::new(serve_path);
let random_route_abs = format!("/{}", conf.route_prefix);
- let abs_url = format!(
- "{}://{}{}",
- req.connection_info().scheme(),
- req.connection_info().host(),
- req.uri()
- );
+ let abs_uri = http::Uri::builder()
+ .scheme(req.connection_info().scheme())
+ .authority(req.connection_info().host())
+ .path_and_query(req.uri().to_string())
+ .build()
+ .unwrap();
let is_root = base.parent().is_none() || Path::new(&req.path()) == Path::new(&random_route_abs);
let encoded_dir = match base.strip_prefix(random_route_abs) {
@@ -379,7 +379,7 @@ pub fn directory_listing(
renderer::page(
entries,
readme,
- abs_url,
+ &abs_uri,
is_root,
query_params,
&breadcrumbs,
diff --git a/src/renderer.rs b/src/renderer.rs
index affcbb2..2bb2b2c 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -9,6 +9,7 @@ use fast_qr::{
qr::QRCodeError,
QRBuilder,
};
+use http::Uri;
use maud::{html, Markup, PreEscaped, DOCTYPE};
use strum::{Display, IntoEnumIterator};
@@ -22,7 +23,7 @@ use crate::{archive::ArchiveMethod, MiniserveConfig};
pub fn page(
entries: Vec<Entry>,
readme: Option<(String, String)>,
- abs_url: impl AsRef<str>,
+ abs_uri: &Uri,
is_root: bool,
query_params: QueryParameters,
breadcrumbs: &[Breadcrumb],
@@ -100,7 +101,7 @@ pub fn page(
}
}
nav {
- (qr_spoiler(conf.show_qrcode, abs_url.as_ref()))
+ (qr_spoiler(conf.show_qrcode, abs_uri))
(color_scheme_selector(conf.hide_theme_selector))
}
div.container {
@@ -193,7 +194,7 @@ pub fn page(
}
div.footer {
@if conf.show_wget_footer {
- (wget_footer(abs_url.as_ref(), breadcrumbs[0].name.as_str(), current_user))
+ (wget_footer(abs_uri, breadcrumbs[0].name.as_str(), current_user))
}
@if !conf.hide_version_footer {
(version_footer())
@@ -240,8 +241,8 @@ pub fn raw(entries: Vec<Entry>, is_root: bool) -> Markup {
}
/// Renders the QR code SVG
-fn qr_code_svg(url: impl AsRef<str>, margin: usize) -> Result<String, QRCodeError> {
- let qr = QRBuilder::new(url.as_ref().to_string())
+fn qr_code_svg(url: &Uri, margin: usize) -> Result<String, QRCodeError> {
+ let qr = QRBuilder::new(url.to_string())
.ecl(consts::QR_EC_LEVEL)
.build()?;
let svg = SvgBuilder::default().margin(margin).to_str(&qr);
@@ -267,9 +268,9 @@ fn version_footer() -> Markup {
}
}
-fn wget_footer(abs_path: &str, root_dir_name: &str, current_user: Option<&CurrentUser>) -> Markup {
+fn wget_footer(abs_path: &Uri, root_dir_name: &str, current_user: Option<&CurrentUser>) -> Markup {
// Directory depth, 0 is root directory
- let cut_dirs = match abs_path.matches('/').count() - 3 {
+ let cut_dirs = match abs_path.path().matches('/').count() - 1 {
// Put all the files in a folder of this name
0 => format!(" -P {root_dir_name}"),
1 => String::new(),
@@ -339,14 +340,14 @@ pub enum ThemeSlug {
}
/// Partial: qr code spoiler
-fn qr_spoiler(show_qrcode: bool, content: impl AsRef<str>) -> Markup {
+fn qr_spoiler(show_qrcode: bool, content: &Uri) -> Markup {
html! {
@if show_qrcode {
div {
p {
"QR code"
}
- div.qrcode #qrcode title=(PreEscaped(content.as_ref())) {
+ div.qrcode #qrcode title=(PreEscaped(content.to_string())) {
@match qr_code_svg(content, consts::SVG_QR_MARGIN) {
Ok(svg) => (PreEscaped(svg)),
Err(err) => (format!("QR generation error: {err:?}")),