mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-01-29 00:35:38 +08:00
fix: add basic authorization header support for URL parsing in NetworkManager #4618
This commit is contained in:
@@ -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?;
|
||||
|
||||
Reference in New Issue
Block a user