From 17f4b0243bd8a66bc1578067685b10bdbef3fe04 Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Sun, 15 Sep 2024 21:56:53 +0800 Subject: Make URL encoding fully WHATWG-compliant --- src/listing.rs | 18 ++++++++++++++---- 1 file 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(); -- cgit v1.2.3 From 8577561843ecdfbf6159813bebf8049beb8aa58f Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Sun, 22 Sep 2024 02:33:06 +0800 Subject: Remove non-compliant `BASE` set --- src/listing.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/listing.rs b/src/listing.rs index 88d4f69..9e916cc 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -25,8 +25,7 @@ use self::percent_encode_sets::COMPONENT; /// https://url.spec.whatwg.org/#percent-encoded-bytes mod percent_encode_sets { use percent_encoding::{AsciiSet, CONTROLS}; - const BASE: &AsciiSet = &CONTROLS.add(b'%'); - pub const QUERY: &AsciiSet = &BASE.add(b' ').add(b'"').add(b'#').add(b'<').add(b'>'); + pub const QUERY: &AsciiSet = &CONTROLS.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 USERINFO: &AsciiSet = &PATH .add(b'/') -- cgit v1.2.3 From e6b50aea4c1355f6df8b03e0bf9f74b2860807af Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Sun, 22 Sep 2024 02:38:43 +0800 Subject: Add missing `|` to `USERINFO` set --- src/listing.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/listing.rs b/src/listing.rs index 9e916cc..a9d2e3a 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -36,7 +36,8 @@ mod percent_encode_sets { .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','); } -- cgit v1.2.3