From bf2e35537cee4bfb187cfb3b366416df7ad72428 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Wed, 30 Dec 2020 22:12:38 -0800 Subject: [PATCH] Percent-escape more characters --- src/main.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 06d98f0..c234547 100644 --- a/src/main.rs +++ b/src/main.rs @@ -229,7 +229,15 @@ async fn send_header(stream: &mut W, status: &str, meta: &[&st } async fn list_directory(stream: &mut W, path: &Path) -> Result { - const WHITESPACE: AsciiSet = CONTROLS.add(b' '); + const ENCODE_SET: AsciiSet = CONTROLS.add(b' ') + // https://url.spec.whatwg.org/#path-percent-encode-set + .add(b'"').add(b'#').add(b'<').add(b'>') + .add(b'?').add(b'`').add(b'{').add(b'}') + // https://tools.ietf.org/html/rfc3986#section-2.2 + .add(b':').add(b'/').add(b'?').add(b'#').add(b'[').add(b']').add(b'@') + .add(b'!').add(b'$').add(b'&').add(b'\'').add(b'(').add(b')') + .add(b'*').add(b'+').add(b',').add(b';').add(b'='); + log::info!("Listing directory {:?}", path); send_text_gemini_header(stream).await?; let mut entries = async_std::fs::read_dir(path).await?; @@ -244,7 +252,7 @@ async fn list_directory(stream: &mut W, path: &Path) -> Result name += "/"; } if name.contains(char::is_whitespace) { - let url = percent_encode(name.as_bytes(), &WHITESPACE); + let url = percent_encode(name.as_bytes(), &ENCODE_SET); lines.push(format!("=> {} {}\n", url, name)); } else { lines.push(format!("=> {}\n", name));