aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2021-04-06 17:15:04 +0000
committerAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2021-04-06 17:15:04 +0000
commitdd6ca41fcaa1f67875dbe3e9c6a047813075e391 (patch)
tree4b5dfc1a2629f85180929db05a3e437329c05fde
parent(cargo-release) start next development iteration 0.13.1-alpha.0 (diff)
downloadminiserve-dd6ca41fcaa1f67875dbe3e9c6a047813075e391.tar.gz
miniserve-dd6ca41fcaa1f67875dbe3e9c6a047813075e391.zip
Fix percent encoding for URL
Use proper percent-encoding charset for each context.
-rw-r--r--src/listing.rs19
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