diff options
author | cyqsimon <28627918+cyqsimon@users.noreply.github.com> | 2024-09-15 13:56:53 +0000 |
---|---|---|
committer | cyqsimon <28627918+cyqsimon@users.noreply.github.com> | 2024-09-15 13:56:53 +0000 |
commit | 17f4b0243bd8a66bc1578067685b10bdbef3fe04 (patch) | |
tree | c3305192545cafea8fc756fa13c1400118023d14 | |
parent | Release miniserve version 0.28.0 (diff) | |
download | miniserve-17f4b0243bd8a66bc1578067685b10bdbef3fe04.tar.gz miniserve-17f4b0243bd8a66bc1578067685b10bdbef3fe04.zip |
Make URL encoding fully WHATWG-compliant
-rw-r--r-- | src/listing.rs | 18 |
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(); |