mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-18 08:21:34 +08:00
fix(scheme): prevent double-decoding of subscription URLs #2609
Closes #2609
This commit is contained in:
parent
2128e1f788
commit
620841592f
@ -39,8 +39,25 @@ pub(super) async fn resolve_scheme(param: &str) -> Result<()> {
|
|||||||
let url_param = if let Some(query) = link_parsed.query() {
|
let url_param = if let Some(query) = link_parsed.query() {
|
||||||
let prefix = "url=";
|
let prefix = "url=";
|
||||||
if let Some(pos) = query.find(prefix) {
|
if let Some(pos) = query.find(prefix) {
|
||||||
let raw_url = &query[pos + prefix.len()..];
|
let raw_url = query[pos + prefix.len()..].trim();
|
||||||
Some(percent_decode_str(raw_url).decode_utf8_lossy().to_string())
|
// Avoid double-decoding nested subscription URLs; decode only when needed.
|
||||||
|
let decoded = if Url::parse(raw_url).is_ok() {
|
||||||
|
raw_url.to_string()
|
||||||
|
} else {
|
||||||
|
let mut candidate = raw_url.to_string();
|
||||||
|
for _ in 0..2 {
|
||||||
|
let next = percent_decode_str(&candidate).decode_utf8_lossy().to_string();
|
||||||
|
if next == candidate {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
candidate = next;
|
||||||
|
if Url::parse(&candidate).is_ok() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
candidate
|
||||||
|
};
|
||||||
|
Some(decoded)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user