请求路径也拦住越界的 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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user