]> OzVa Git service - ozva-cloud/commitdiff
fix: escape path-prefix/url-prefix different
authorsigoden <sigoden@gmail.com>
Mon, 6 Jun 2022 00:00:26 +0000 (08:00 +0800)
committersigoden <sigoden@gmail.com>
Mon, 6 Jun 2022 00:00:26 +0000 (08:00 +0800)
src/args.rs
src/main.rs
src/server.rs

index c9c4e77bb27f21d4368faaa2a42077901eb0b58e..55e70e8e290f58c7ab6ba90eea805c1ce4c3f7d7 100644 (file)
@@ -143,7 +143,7 @@ impl Args {
         let uri_prefix = if path_prefix.is_empty() {
             "/".to_owned()
         } else {
-            format!("/{}/", encode_uri(&path_prefix))
+            format!("/{}/", &path_prefix)
         };
         let cors = matches.is_present("cors");
         let auth = match matches.value_of("auth") {
@@ -237,8 +237,3 @@ pub fn load_private_key(filename: &str) -> BoxResult<PrivateKey> {
     }
     Ok(PrivateKey(keys[0].to_owned()))
 }
-
-pub fn encode_uri(v: &str) -> String {
-    let parts: Vec<_> = v.split('/').map(urlencoding::encode).collect();
-    parts.join("/")
-}
index 176d7e6c94cbd7c3a3295da695b58cf749c32dbd..3258e444cf21cb9e812b886af0059a3b29f1e3a2 100644 (file)
@@ -10,7 +10,7 @@ pub type BoxResult<T> = Result<T, Box<dyn std::error::Error>>;
 use std::env;
 use std::io::Write;
 
-use crate::args::{encode_uri, matches, Args};
+use crate::args::{matches, Args};
 use crate::server::serve;
 
 #[tokio::main]
index 5bda54c8a0ff206f6e0ee834d1bfff40f5b65c1d..28dfd92c8e97e88bc006658c3517e812eadd46a5 100644 (file)
@@ -1,5 +1,5 @@
 use crate::auth::{generate_www_auth, valid_digest};
-use crate::{encode_uri, Args, BoxResult};
+use crate::{Args, BoxResult};
 use xml::escape::escape_str_pcdata;
 
 use async_walkdir::WalkDir;
@@ -822,7 +822,7 @@ impl PathItem {
 <D:status>HTTP/1.1 200 OK</D:status>
 </D:propstat>
 </D:response>"#,
-                prefix,
+                escape_str_pcdata(prefix),
                 escape_str_pcdata(&self.name),
                 escape_str_pcdata(&self.base_name),
                 mtime
@@ -840,7 +840,7 @@ impl PathItem {
 <D:status>HTTP/1.1 200 OK</D:status>
 </D:propstat>
 </D:response>"#,
-                prefix,
+                escape_str_pcdata(prefix),
                 escape_str_pcdata(&self.name),
                 escape_str_pcdata(&self.base_name),
                 self.size.unwrap_or_default(),
@@ -975,7 +975,7 @@ fn to_content_range(range: &Range, complete_length: u64) -> Option<ContentRange>
 }
 
 fn print_listening(address: &str, port: u16, prefix: &str, tls: bool) {
-    let prefix = prefix.trim_end_matches('/');
+    let prefix = encode_uri(prefix.trim_end_matches('/'));
     let addrs = retrieve_listening_addrs(address);
     let protocol = if tls { "https" } else { "http" };
     if addrs.len() == 1 {
@@ -1006,3 +1006,8 @@ fn retrieve_listening_addrs(address: &str) -> Vec<String> {
     }
     vec![address.to_owned()]
 }
+
+fn encode_uri(v: &str) -> String {
+    let parts: Vec<_> = v.split('/').map(urlencoding::encode).collect();
+    parts.join("/")
+}