mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-05 07:03:45 +08:00
fix: network request failure termination logic and add connection pool optimization
This commit is contained in:
parent
ba0f4cdde0
commit
779291151e
@ -15,6 +15,8 @@ const H2_KEEP_ALIVE_INTERVAL: Duration = Duration::from_secs(5);
|
|||||||
const H2_KEEP_ALIVE_TIMEOUT: Duration = Duration::from_secs(5);
|
const H2_KEEP_ALIVE_TIMEOUT: Duration = Duration::from_secs(5);
|
||||||
const DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(10);
|
const DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(10);
|
||||||
const DEFAULT_REQUEST_TIMEOUT: Duration = Duration::from_secs(30);
|
const DEFAULT_REQUEST_TIMEOUT: Duration = Duration::from_secs(30);
|
||||||
|
const POOL_MAX_IDLE_PER_HOST: usize = 5;
|
||||||
|
const POOL_IDLE_TIMEOUT: Duration = Duration::from_secs(15);
|
||||||
|
|
||||||
/// 网络管理器
|
/// 网络管理器
|
||||||
pub struct NetworkManager {
|
pub struct NetworkManager {
|
||||||
@ -67,8 +69,8 @@ impl NetworkManager {
|
|||||||
let no_proxy_client = ClientBuilder::new()
|
let no_proxy_client = ClientBuilder::new()
|
||||||
.use_rustls_tls()
|
.use_rustls_tls()
|
||||||
.no_proxy()
|
.no_proxy()
|
||||||
.pool_max_idle_per_host(5)
|
.pool_max_idle_per_host(POOL_MAX_IDLE_PER_HOST)
|
||||||
.pool_idle_timeout(Duration::from_secs(30))
|
.pool_idle_timeout(POOL_IDLE_TIMEOUT)
|
||||||
.connect_timeout(Duration::from_secs(10))
|
.connect_timeout(Duration::from_secs(10))
|
||||||
.timeout(Duration::from_secs(30))
|
.timeout(Duration::from_secs(30))
|
||||||
.build()
|
.build()
|
||||||
@ -107,7 +109,7 @@ impl NetworkManager {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset_clients(&self) {
|
pub fn reset_clients(&self) {
|
||||||
logging!(info, Type::Network, true, "正在重置所有HTTP客户端");
|
logging!(info, Type::Network, true, "正在重置所有HTTP客户端");
|
||||||
{
|
{
|
||||||
let mut client = self.self_proxy_client.lock().unwrap();
|
let mut client = self.self_proxy_client.lock().unwrap();
|
||||||
@ -145,8 +147,8 @@ impl NetworkManager {
|
|||||||
|
|
||||||
let mut builder = ClientBuilder::new()
|
let mut builder = ClientBuilder::new()
|
||||||
.use_rustls_tls()
|
.use_rustls_tls()
|
||||||
.pool_max_idle_per_host(5)
|
.pool_max_idle_per_host(POOL_MAX_IDLE_PER_HOST)
|
||||||
.pool_idle_timeout(Duration::from_secs(30))
|
.pool_idle_timeout(POOL_IDLE_TIMEOUT)
|
||||||
.connect_timeout(DEFAULT_CONNECT_TIMEOUT)
|
.connect_timeout(DEFAULT_CONNECT_TIMEOUT)
|
||||||
.timeout(DEFAULT_REQUEST_TIMEOUT)
|
.timeout(DEFAULT_REQUEST_TIMEOUT)
|
||||||
.http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE)
|
.http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE)
|
||||||
@ -189,8 +191,8 @@ impl NetworkManager {
|
|||||||
|
|
||||||
let mut builder = ClientBuilder::new()
|
let mut builder = ClientBuilder::new()
|
||||||
.use_rustls_tls()
|
.use_rustls_tls()
|
||||||
.pool_max_idle_per_host(5)
|
.pool_max_idle_per_host(POOL_MAX_IDLE_PER_HOST)
|
||||||
.pool_idle_timeout(Duration::from_secs(30))
|
.pool_idle_timeout(POOL_IDLE_TIMEOUT)
|
||||||
.connect_timeout(DEFAULT_CONNECT_TIMEOUT)
|
.connect_timeout(DEFAULT_CONNECT_TIMEOUT)
|
||||||
.timeout(DEFAULT_REQUEST_TIMEOUT)
|
.timeout(DEFAULT_REQUEST_TIMEOUT)
|
||||||
.http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE)
|
.http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE)
|
||||||
@ -253,6 +255,8 @@ impl NetworkManager {
|
|||||||
|
|
||||||
let mut builder = ClientBuilder::new()
|
let mut builder = ClientBuilder::new()
|
||||||
.use_rustls_tls()
|
.use_rustls_tls()
|
||||||
|
.pool_max_idle_per_host(POOL_MAX_IDLE_PER_HOST)
|
||||||
|
.pool_idle_timeout(POOL_IDLE_TIMEOUT)
|
||||||
.connect_timeout(DEFAULT_CONNECT_TIMEOUT)
|
.connect_timeout(DEFAULT_CONNECT_TIMEOUT)
|
||||||
.http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE)
|
.http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE)
|
||||||
.http2_initial_connection_window_size(H2_CONNECTION_WINDOW_SIZE)
|
.http2_initial_connection_window_size(H2_CONNECTION_WINDOW_SIZE)
|
||||||
@ -396,15 +400,13 @@ impl NetworkManager {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let result = tokio::select! {
|
let result = tokio::select! {
|
||||||
result = request.send() => {
|
result = request.send() => result,
|
||||||
watchdog.abort();
|
|
||||||
result
|
|
||||||
},
|
|
||||||
_ = cancel_rx => {
|
_ = cancel_rx => {
|
||||||
self.record_connection_error(&format!("Request interrupted for: {}", url));
|
self.record_connection_error(&format!("Request interrupted for: {}", url));
|
||||||
return Err(anyhow::anyhow!("Request interrupted after {} seconds", timeout_duration));
|
return Err(anyhow::anyhow!("Request interrupted after {} seconds", timeout_duration));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
watchdog.abort();
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(response) => Ok(response),
|
Ok(response) => Ok(response),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user