fix: add basic authorization header support for URL parsing in NetworkManager #4618

This commit is contained in:
Tunglies
2025-09-03 01:07:45 +08:00
parent b989aeb7b0
commit 893188d693
2 changed files with 31 additions and 3 deletions

View File

@@ -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?;