aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcyqsimon <28627918+cyqsimon@users.noreply.github.com>2024-09-15 13:56:53 +0000
committercyqsimon <28627918+cyqsimon@users.noreply.github.com>2024-09-15 13:56:53 +0000
commit17f4b0243bd8a66bc1578067685b10bdbef3fe04 (patch)
treec3305192545cafea8fc756fa13c1400118023d14
parentRelease miniserve version 0.28.0 (diff)
downloadminiserve-17f4b0243bd8a66bc1578067685b10bdbef3fe04.tar.gz
miniserve-17f4b0243bd8a66bc1578067685b10bdbef3fe04.zip
Make URL encoding fully WHATWG-compliant
-rw-r--r--src/listing.rs18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/listing.rs b/src/listing.rs
index 6c67051..88d4f69 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -19,7 +19,7 @@ use crate::auth::CurrentUser;
use crate::errors::{self, RuntimeError};
use crate::renderer;
-use self::percent_encode_sets::PATH_SEGMENT;
+use self::percent_encode_sets::COMPONENT;
/// "percent-encode sets" as defined by WHATWG specs:
/// https://url.spec.whatwg.org/#percent-encoded-bytes
@@ -28,7 +28,17 @@ mod percent_encode_sets {
const BASE: &AsciiSet = &CONTROLS.add(b'%');
pub const QUERY: &AsciiSet = &BASE.add(b' ').add(b'"').add(b'#').add(b'<').add(b'>');
pub const PATH: &AsciiSet = &QUERY.add(b'?').add(b'`').add(b'{').add(b'}');
- pub const PATH_SEGMENT: &AsciiSet = &PATH.add(b'/').add(b'\\');
+ pub const USERINFO: &AsciiSet = &PATH
+ .add(b'/')
+ .add(b':')
+ .add(b';')
+ .add(b'=')
+ .add(b'@')
+ .add(b'[')
+ .add(b'\\')
+ .add(b']')
+ .add(b'^');
+ pub const COMPONENT: &AsciiSet = &USERINFO.add(b'$').add(b'%').add(b'&').add(b'+').add(b',');
}
/// Query parameters used by listing APIs
@@ -216,7 +226,7 @@ pub fn directory_listing(
Component::Normal(s) => {
name = s.to_string_lossy().to_string();
link_accumulator
- .push_str(&(utf8_percent_encode(&name, PATH_SEGMENT).to_string() + "/"));
+ .push_str(&(utf8_percent_encode(&name, COMPONENT).to_string() + "/"));
}
_ => name = "".to_string(),
};
@@ -255,7 +265,7 @@ pub fn directory_listing(
.and_then(|path| std::fs::read_link(path).ok())
.map(|path| path.to_string_lossy().into_owned());
let file_url = base
- .join(utf8_percent_encode(&file_name, PATH_SEGMENT).to_string())
+ .join(utf8_percent_encode(&file_name, COMPONENT).to_string())
.to_string_lossy()
.to_string();