From 62600fe8810b1c9c84bfbddcf6bcad414b3a1494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 17:36:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E8=B7=AF=E5=BE=84=E4=B9=9F?= =?UTF-8?q?=E6=8B=A6=E4=BD=8F=E8=B6=8A=E7=95=8C=E7=9A=84=20TRIPO=5FRETRIES?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server-rs/crates/api-server/src/tripo3d/provider.rs:tripo_settings 显式校验 config.tripo_retries 不超过 TRIPO_MAX_RETRIES 并映射 503。TripoSettings::validate 只查空值与零超时,越界值会原样进 artifact_retries,把产物下载的挂起时间成倍拉长;注释里「第二道防线」的说法此前并不成立 - server-rs/crates/api-server/src/tripo3d/provider.rs:补越界拒绝 / 上限放行的用例 --- .../crates/api-server/src/tripo3d/provider.rs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/server-rs/crates/api-server/src/tripo3d/provider.rs b/server-rs/crates/api-server/src/tripo3d/provider.rs index 640f3cdc6..7f8d5d23a 100644 --- a/server-rs/crates/api-server/src/tripo3d/provider.rs +++ b/server-rs/crates/api-server/src/tripo3d/provider.rs @@ -118,6 +118,15 @@ pub(crate) fn tripo_settings(config: &AppConfig) -> Result TRIPO_MAX_RETRIES { + return Err(not_configured(&format!( + "TRIPO_RETRIES 不能超过 {TRIPO_MAX_RETRIES},当前为 {}。", + config.tripo_retries + ))); + } + // 取值原样交给构造器:零超时或越界重试是配置错误,由 `TripoSettings::validate` // 判失败并映射成 503,不再在这里静默钳制(启动期门禁已经先一步拒掉这种配置)。 TripoSettings::new( @@ -272,6 +281,20 @@ mod tests { assert_eq!(error.status_code(), StatusCode::SERVICE_UNAVAILABLE); } + /// 越过重试上限的配置必须在请求前就 503,不能落进 artifact_retries 拉长挂起时间。 + #[test] + fn request_path_rejects_out_of_range_retries() { + let mut config = AppConfig::default(); + config.tripo_base_url = "https://openapi.tripo3d.com/v3".to_string(); + config.tripo_api_key = Some("test-key".to_string()); + config.tripo_retries = TRIPO_MAX_RETRIES + 1; + let error = tripo_settings(&config).expect_err("越界重试必须拒绝"); + assert_eq!(error.status_code(), StatusCode::SERVICE_UNAVAILABLE); + + config.tripo_retries = TRIPO_MAX_RETRIES; + assert!(tripo_settings(&config).is_ok(), "上限本身必须放行"); + } + #[test] fn configured_settings_trim_trailing_slash() { let mut config = AppConfig::default();