From 893188d6939d0fa3b637099446a6ad7ee6ef706c Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 3 Sep 2025 01:07:45 +0800 Subject: [PATCH] fix: add basic authorization header support for URL parsing in NetworkManager #4618 --- UPDATELOG.md | 1 + src-tauri/src/utils/network.rs | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index 97456cb82..09a9efebe 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -19,6 +19,7 @@ - 修复通过 scheme 导入订阅崩溃 - 修复单例检测实效 - 修复启动阶段可能导致的无法连接内核 +- 修复导入订阅无法 Author Basic ### 👙 界面样式 diff --git a/src-tauri/src/utils/network.rs b/src-tauri/src/utils/network.rs index 47aa96fda..23b83c2c4 100644 --- a/src-tauri/src/utils/network.rs +++ b/src-tauri/src/utils/network.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use base64::{engine::general_purpose, Engine as _}; use isahc::prelude::*; use isahc::{ config::RedirectPolicy, @@ -10,6 +11,7 @@ use isahc::{ use isahc::{config::SslOption, HttpClient}; use std::time::{Duration, Instant}; use sysproxy::Sysproxy; +use tauri::Url; use tokio::sync::Mutex; use tokio::time::timeout; @@ -195,15 +197,40 @@ impl NetworkManager { self.reset_clients().await; } + let parsed = Url::parse(url)?; + let mut extra_headers = HeaderMap::new(); + + if !parsed.username().is_empty() { + if let Some(pass) = parsed.password() { + let auth_str = format!("{}:{}", parsed.username(), pass); + let encoded = general_purpose::STANDARD.encode(auth_str); + extra_headers.insert( + "Authorization", + HeaderValue::from_str(&format!("Basic {}", encoded))?, + ); + } + } + + let clean_url = { + let mut no_auth = parsed.clone(); + no_auth.set_username("").ok(); + no_auth.set_password(None).ok(); + no_auth.to_string() + }; + let client = self .create_request(proxy_type, timeout_secs, user_agent, accept_invalid_certs) .await?; let timeout_duration = Duration::from_secs(timeout_secs.unwrap_or(20)); - let url_owned = url.to_string(); - let response = match timeout(timeout_duration, async { - let mut response = client.get_async(&url_owned).await?; + let mut req = isahc::Request::get(&clean_url); + + for (k, v) in extra_headers.iter() { + req = req.header(k, v); + } + + let mut response = client.send_async(req.body(())?).await?; let status = response.status(); let headers = response.headers().clone(); let body = response.text().await?;