From 02fd924119ccaa7a4ec11d83acc192da7369eedb Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Wed, 31 Dec 2025 12:50:04 +0800 Subject: [PATCH] fix(proxy): bypass timeout and retry configs when failover is disabled When auto_failover_enabled is false, timeout and retry configurations should not affect normal request flow. This change ensures: - create_forwarder: passes 0 for all timeout/retry params when failover is disabled, effectively bypassing these checks - streaming_timeout_config: returns 0 for both first_byte_timeout and idle_timeout when failover is disabled This prevents unnecessary timeout errors and retry attempts when users have explicitly disabled the failover feature. --- src-tauri/src/proxy/handler_context.rs | 49 ++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/proxy/handler_context.rs b/src-tauri/src/proxy/handler_context.rs index 86bce211d..71a726ef7 100644 --- a/src-tauri/src/proxy/handler_context.rs +++ b/src-tauri/src/proxy/handler_context.rs @@ -148,18 +148,40 @@ impl RequestContext { /// 创建 RequestForwarder /// /// 使用共享的 ProviderRouter,确保熔断器状态跨请求保持 + /// + /// 配置生效规则: + /// - 故障转移开启:超时配置和重试次数正常生效(0 表示禁用超时/不重试直接故障转移) + /// - 故障转移关闭:超时配置和重试次数不生效(全部传入 0) pub fn create_forwarder(&self, state: &ProxyState) -> RequestForwarder { + let (non_streaming_timeout, max_retries, first_byte_timeout, idle_timeout) = + if self.app_config.auto_failover_enabled { + // 故障转移开启:使用配置的值(0 = 禁用超时 / 不重试直接故障转移) + ( + self.app_config.non_streaming_timeout as u64, + self.app_config.max_retries as u8, + self.app_config.streaming_first_byte_timeout as u64, + self.app_config.streaming_idle_timeout as u64, + ) + } else { + // 故障转移关闭:不启用超时和重试配置 + log::info!( + "[{}] Failover disabled, timeout and retry configs are bypassed", + self.tag + ); + (0, 0, 0, 0) + }; + RequestForwarder::new( state.provider_router.clone(), - self.app_config.non_streaming_timeout as u64, - self.app_config.max_retries as u8, + non_streaming_timeout, + max_retries, state.status.clone(), state.current_providers.clone(), state.failover_manager.clone(), state.app_handle.clone(), self.current_provider_id.clone(), - self.app_config.streaming_first_byte_timeout as u64, - self.app_config.streaming_idle_timeout as u64, + first_byte_timeout, + idle_timeout, ) } @@ -177,11 +199,24 @@ impl RequestContext { } /// 获取流式超时配置 + /// + /// 配置生效规则: + /// - 故障转移开启:返回配置的值(0 表示禁用超时检查) + /// - 故障转移关闭:返回 0(禁用超时检查) #[inline] pub fn streaming_timeout_config(&self) -> StreamingTimeoutConfig { - StreamingTimeoutConfig { - first_byte_timeout: self.app_config.streaming_first_byte_timeout as u64, - idle_timeout: self.app_config.streaming_idle_timeout as u64, + if self.app_config.auto_failover_enabled { + // 故障转移开启:使用配置的值(0 = 禁用超时) + StreamingTimeoutConfig { + first_byte_timeout: self.app_config.streaming_first_byte_timeout as u64, + idle_timeout: self.app_config.streaming_idle_timeout as u64, + } + } else { + // 故障转移关闭:禁用流式超时检查 + StreamingTimeoutConfig { + first_byte_timeout: 0, + idle_timeout: 0, + } } } }