aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSven-Hendrik Haase <svenstaro@gmail.com>2024-09-21 21:32:05 +0000
committerGitHub <noreply@github.com>2024-09-21 21:32:05 +0000
commitbe39fa4937e020edd0697b351e44a145579eb895 (patch)
tree66fa1748fcd5c09bc1720760088d8d1fe8e49b37 /src
parentRelease miniserve version 0.28.0 (diff)
parentAdd missing `|` to `USERINFO` set (diff)
downloadminiserve-be39fa4937e020edd0697b351e44a145579eb895.tar.gz
miniserve-be39fa4937e020edd0697b351e44a145579eb895.zip
Merge pull request #1454 from cyqsimon/whatwg-spec
Make URL encoding fully WHATWG-compliant
Diffstat (limited to 'src')
-rw-r--r--src/listing.rs22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/listing.rs b/src/listing.rs
index 6c67051..a9d2e3a 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -19,16 +19,26 @@ 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
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 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'^')
+ .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();