diff options
author | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2021-04-06 17:15:04 +0000 |
---|---|---|
committer | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2021-04-06 17:15:04 +0000 |
commit | dd6ca41fcaa1f67875dbe3e9c6a047813075e391 (patch) | |
tree | 4b5dfc1a2629f85180929db05a3e437329c05fde /src/listing.rs | |
parent | (cargo-release) start next development iteration 0.13.1-alpha.0 (diff) | |
download | miniserve-dd6ca41fcaa1f67875dbe3e9c6a047813075e391.tar.gz miniserve-dd6ca41fcaa1f67875dbe3e9c6a047813075e391.zip |
Fix percent encoding for URL
Use proper percent-encoding charset for each context.
Diffstat (limited to 'src/listing.rs')
-rw-r--r-- | src/listing.rs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/listing.rs b/src/listing.rs index 66aea6b..2a62fd6 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -4,7 +4,7 @@ use actix_web::http::StatusCode; use actix_web::web::Query; use actix_web::{HttpRequest, HttpResponse, Result}; use bytesize::ByteSize; -use percent_encoding::{percent_decode_str, utf8_percent_encode, AsciiSet, CONTROLS}; +use percent_encoding::{percent_decode_str, utf8_percent_encode}; use qrcodegen::{QrCode, QrCodeEcc}; use serde::Deserialize; use std::io; @@ -15,8 +15,17 @@ use strum_macros::{Display, EnumString}; use crate::archive::CompressionMethod; use crate::errors::{self, ContextualError}; use crate::renderer; - -const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`'); +use percent_encode_sets::{PATH, PATH_SEGMENT}; + +/// "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 PATH: &AsciiSet = &QUERY.add(b'?').add(b'`').add(b'{').add(b'}'); + pub const PATH_SEGMENT: &AsciiSet = &PATH.add(b'/'); +} /// Query parameters #[derive(Deserialize)] @@ -213,7 +222,7 @@ pub fn directory_listing( Component::Normal(s) => { name = s.to_string_lossy().to_string(); link_accumulator - .push_str(&(utf8_percent_encode(&name, FRAGMENT).to_string() + "/")); + .push_str(&(utf8_percent_encode(&name, PATH_SEGMENT).to_string() + "/")); } _ => name = "".to_string(), }; @@ -256,7 +265,7 @@ pub fn directory_listing( Err(_) => continue, }; // show file url as relative to static path - let file_url = utf8_percent_encode(&p.to_string_lossy(), FRAGMENT).to_string(); + let file_url = utf8_percent_encode(&p.to_string_lossy(), PATH).to_string(); let file_name = entry.file_name().to_string_lossy().to_string(); // if file is a directory, add '/' to the end of the name |