diff --git a/server-rs/crates/api-server/src/tripo3d/provider.rs b/server-rs/crates/api-server/src/tripo3d/provider.rs index 7f8d5d23a..0bc42c64c 100644 --- a/server-rs/crates/api-server/src/tripo3d/provider.rs +++ b/server-rs/crates/api-server/src/tripo3d/provider.rs @@ -54,17 +54,7 @@ pub(crate) fn validate_tripo_startup_values(values: TripoStartupValues<'_>) -> R "{TRIPO_BASE_URL_ENV} 未配置:3D 生成要求显式给出 Tripo 网关地址,缺失时 api-server 拒绝启动。" )); } - let url = reqwest::Url::parse(base_url) - .map_err(|error| format!("{TRIPO_BASE_URL_ENV} 不是合法 URL({error})。"))?; - if !matches!(url.scheme(), "http" | "https") { - return Err(format!( - "{TRIPO_BASE_URL_ENV} 必须是 HTTP/HTTPS 地址,当前为 {}。", - url.scheme() - )); - } - if url.host_str().is_none() { - return Err(format!("{TRIPO_BASE_URL_ENV} 缺少主机名。")); - } + validate_tripo_base_url_syntax(base_url)?; if values .api_key .map(str::trim) @@ -99,6 +89,25 @@ pub(crate) fn validate_tripo_startup_values(values: TripoStartupValues<'_>) -> R Ok(()) } +/// 网关地址写法校验:必须是带主机名的 HTTP(S) 绝对地址。 +/// +/// 启动期门禁与请求期兜底共用这一份判据:门禁挡的是环境变量,请求期挡的是 +/// 「启动后才被改坏或不由 `from_env` 构造」的配置,两边口径必须一致。 +fn validate_tripo_base_url_syntax(base_url: &str) -> Result<(), String> { + let url = reqwest::Url::parse(base_url) + .map_err(|error| format!("{TRIPO_BASE_URL_ENV} 不是合法 URL({error})。"))?; + if !matches!(url.scheme(), "http" | "https") { + return Err(format!( + "{TRIPO_BASE_URL_ENV} 必须是 HTTP/HTTPS 地址,当前为 {}。", + url.scheme() + )); + } + if url.host_str().is_none() { + return Err(format!("{TRIPO_BASE_URL_ENV} 缺少主机名。")); + } + Ok(()) +} + /// 只把「显式声明过」的取值当输入;空串与纯空白视同未声明。 fn read_declared_env(raw: Option<&str>) -> Option<&str> { raw.map(str::trim).filter(|value| !value.is_empty()) @@ -111,6 +120,9 @@ pub(crate) fn tripo_settings(config: &AppConfig) -> Result