From 110354fad9eba016d947623f37c6e43958212cf0 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:38:28 +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=E5=86=99=E6=AD=AA=E7=9A=84=20Tripo=20?= =?UTF-8?q?=E7=BD=91=E5=85=B3=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server-rs/crates/api-server/src/tripo3d/provider.rs:URL 判据(合法 URL + HTTP(S) + 有主机名)抽成 validate_tripo_base_url_syntax,启动期门禁与 tripo_settings 共用;非空但缺 scheme / 非 HTTP(S) / 无主机名的地址在请求前就映射 503,不再拖到 SDK 里变成一条指向连接失败的报错 - server-rs/crates/api-server/src/tripo3d/provider.rs:补请求期拒绝写歪地址的用例 --- .../crates/api-server/src/tripo3d/provider.rs | 50 +++++++++++++++---- 1 file changed, 39 insertions(+), 11 deletions(-) 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