mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-01-29 17:15:38 +08:00
fix: add basic authorization header support for URL parsing in NetworkManager #4618
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
- 修复通过 scheme 导入订阅崩溃
|
- 修复通过 scheme 导入订阅崩溃
|
||||||
- 修复单例检测实效
|
- 修复单例检测实效
|
||||||
- 修复启动阶段可能导致的无法连接内核
|
- 修复启动阶段可能导致的无法连接内核
|
||||||
|
- 修复导入订阅无法 Author Basic
|
||||||
|
|
||||||
### 👙 界面样式
|
### 👙 界面样式
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use base64::{engine::general_purpose, Engine as _};
|
||||||
use isahc::prelude::*;
|
use isahc::prelude::*;
|
||||||
use isahc::{
|
use isahc::{
|
||||||
config::RedirectPolicy,
|
config::RedirectPolicy,
|
||||||
@@ -10,6 +11,7 @@ use isahc::{
|
|||||||
use isahc::{config::SslOption, HttpClient};
|
use isahc::{config::SslOption, HttpClient};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use sysproxy::Sysproxy;
|
use sysproxy::Sysproxy;
|
||||||
|
use tauri::Url;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use tokio::time::timeout;
|
use tokio::time::timeout;
|
||||||
|
|
||||||
@@ -195,15 +197,40 @@ impl NetworkManager {
|
|||||||
self.reset_clients().await;
|
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
|
let client = self
|
||||||
.create_request(proxy_type, timeout_secs, user_agent, accept_invalid_certs)
|
.create_request(proxy_type, timeout_secs, user_agent, accept_invalid_certs)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let timeout_duration = Duration::from_secs(timeout_secs.unwrap_or(20));
|
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 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 status = response.status();
|
||||||
let headers = response.headers().clone();
|
let headers = response.headers().clone();
|
||||||
let body = response.text().await?;
|
let body = response.text().await?;
|
||||||
|
|||||||
Reference in New Issue
Block a user