From a719237556a3c856257b97bc39ed42d9ad4f51b4 Mon Sep 17 00:00:00 2001 From: MystiPanda Date: Fri, 15 Dec 2023 11:35:10 +0800 Subject: [PATCH] fix: Subinfo parse error --- src-tauri/src/config/prfitem.rs | 13 ++++++------- src-tauri/src/utils/help.rs | 31 ++++++++++++++----------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src-tauri/src/config/prfitem.rs b/src-tauri/src/config/prfitem.rs index a7de9efb..455cc3b5 100644 --- a/src-tauri/src/config/prfitem.rs +++ b/src-tauri/src/config/prfitem.rs @@ -247,12 +247,11 @@ impl PrfItem { let extra = match header.get("Subscription-Userinfo") { Some(value) => { let sub_info = value.to_str().unwrap_or(""); - Some(PrfExtra { - upload: help::parse_str(sub_info, "upload=").unwrap_or(0), - download: help::parse_str(sub_info, "download=").unwrap_or(0), - total: help::parse_str(sub_info, "total=").unwrap_or(0), - expire: help::parse_str(sub_info, "expire=").unwrap_or(0), + upload: help::parse_str(sub_info, "upload").unwrap_or(0), + download: help::parse_str(sub_info, "download").unwrap_or(0), + total: help::parse_str(sub_info, "total").unwrap_or(0), + expire: help::parse_str(sub_info, "expire").unwrap_or(0), }) } None => None, @@ -262,9 +261,9 @@ impl PrfItem { let filename = match header.get("Content-Disposition") { Some(value) => { let filename = value.to_str().unwrap_or(""); - match help::parse_str::(filename, "filename=") { + match help::parse_str::(filename, "filename") { Some(filename) => Some(filename), - None => match help::parse_str::(filename, "filename*=") { + None => match help::parse_str::(filename, "filename*") { Some(filename) => { let iter = percent_encoding::percent_decode(filename.as_bytes()); let filename = iter.decode_utf8().unwrap_or_default(); diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs index 48eeced9..481d5772 100644 --- a/src-tauri/src/utils/help.rs +++ b/src-tauri/src/utils/help.rs @@ -71,15 +71,12 @@ pub fn get_uid(prefix: &str) -> String { /// parse the string /// xxx=123123; => 123123 pub fn parse_str(target: &str, key: &str) -> Option { - target.find(key).and_then(|idx| { - let idx = idx + key.len(); - let value = &target[idx..]; - - match value.split(';').nth(0) { - Some(value) => value.trim().parse(), - None => value.trim().parse(), + target.split(';').map(str::trim).find_map(|s| { + let mut parts = s.splitn(2, '='); + match (parts.next(), parts.next()) { + (Some(k), Some(v)) if k == key => v.parse::().ok(), + _ => None, } - .ok() }) } @@ -162,17 +159,17 @@ fn test_parse_value() { let test_1 = "upload=111; download=2222; total=3333; expire=444"; let test_2 = "attachment; filename=Clash.yaml"; - assert_eq!(parse_str::(test_1, "upload=").unwrap(), 111); - assert_eq!(parse_str::(test_1, "download=").unwrap(), 2222); - assert_eq!(parse_str::(test_1, "total=").unwrap(), 3333); - assert_eq!(parse_str::(test_1, "expire=").unwrap(), 444); + assert_eq!(parse_str::(test_1, "upload").unwrap(), 111); + assert_eq!(parse_str::(test_1, "download").unwrap(), 2222); + assert_eq!(parse_str::(test_1, "total").unwrap(), 3333); + assert_eq!(parse_str::(test_1, "expire").unwrap(), 444); assert_eq!( - parse_str::(test_2, "filename=").unwrap(), + parse_str::(test_2, "filename").unwrap(), format!("Clash.yaml") ); - assert_eq!(parse_str::(test_1, "aaa="), None); - assert_eq!(parse_str::(test_1, "upload1="), None); - assert_eq!(parse_str::(test_1, "expire1="), None); - assert_eq!(parse_str::(test_2, "attachment="), None); + assert_eq!(parse_str::(test_1, "aaa"), None); + assert_eq!(parse_str::(test_1, "upload1"), None); + assert_eq!(parse_str::(test_1, "expire1"), None); + assert_eq!(parse_str::(test_2, "attachment"), None); }