请求路径也拦住越界的 TRIPO_RETRIES

- 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:补越界拒绝 / 上限放行的用例
This commit is contained in:
2026-09-24 17:36:55 +08:00
parent 1600c107e0
commit 62600fe881
@@ -118,6 +118,15 @@ pub(crate) fn tripo_settings(config: &AppConfig) -> Result<TripoSettings, AppErr
.filter(|value| !value.is_empty())
.ok_or_else(|| not_configured("TRIPO_API_KEY 未配置,无法调用 Tripo 3D 生成服务。"))?;
// 越界重试必须在这里拒掉:`TripoSettings::validate` 只查空值与零超时,不看重试上限,
// 放着它进 artifact_retries 只会把产物下载的挂起时间成倍拉长,还不会有任何 503。
if config.tripo_retries > 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();