fix: 支持 HTTP 协议和内网地址访问,修复聊天 URL 缺协议前缀问题

- validate_public_url 默认允许 http 和 https 协议
- 移除 _is_forbidden_ip_address 中 is_private 和 is_site_local 拦截,允许内网 IP
- validate_public_url 中无 scheme 时自动补全 http://
- normalize_openai_base_url 中无协议前缀时自动补全 http://
- pyproject.toml 添加 httpx[socks] 依赖以支持 SOCKS 代理
This commit is contained in:
hsd221
2026-05-03 14:36:45 +08:00
committed by SengokuCola
parent ccabcf5e36
commit e962326f93
3 changed files with 10 additions and 5 deletions

View File

@@ -15,7 +15,7 @@ dependencies = [
"faiss-cpu>=1.11.0", "faiss-cpu>=1.11.0",
"fastapi>=0.116.0", "fastapi>=0.116.0",
"google-genai>=1.39.1", "google-genai>=1.39.1",
"httpx", "httpx[socks]",
"jieba>=0.42.1", "jieba>=0.42.1",
"json-repair>=0.47.6", "json-repair>=0.47.6",
"maim-message>=0.6.2", "maim-message>=0.6.2",

View File

@@ -26,12 +26,17 @@ class OpenAICompatibleRequestOverrides:
def normalize_openai_base_url(base_url: str) -> str: def normalize_openai_base_url(base_url: str) -> str:
"""规范化 OpenAI 兼容接口的基础地址。 """规范化 OpenAI 兼容接口的基础地址。
去掉尾部斜杠,且如果缺少协议前缀则自动补全 http://。
Args: Args:
base_url: 原始基础地址。 base_url: 原始基础地址。
Returns: Returns:
str: 去掉尾部斜杠后的地址。 str: 规范化后的地址。
""" """
base_url = base_url.strip()
if base_url and "://" not in base_url:
base_url = "http://" + base_url
return base_url.rstrip("/") return base_url.rstrip("/")

View File

@@ -31,19 +31,19 @@ def _is_forbidden_ip_address(address: ipaddress.IPv4Address | ipaddress.IPv6Addr
address.is_loopback, address.is_loopback,
address.is_link_local, address.is_link_local,
address.is_multicast, address.is_multicast,
address.is_private,
address.is_reserved, address.is_reserved,
address.is_unspecified, address.is_unspecified,
getattr(address, "is_site_local", False),
) )
) )
def validate_public_url(url: str, allowed_schemes: Iterable[str] = ("https",)) -> str: def validate_public_url(url: str, allowed_schemes: Iterable[str] = ("http", "https")) -> str:
normalized_url = url.strip() normalized_url = url.strip()
if not normalized_url: if not normalized_url:
raise ValueError("URL 不能为空") raise ValueError("URL 不能为空")
if "://" not in normalized_url:
normalized_url = "http://" + normalized_url
parsed = urlparse(normalized_url) parsed = urlparse(normalized_url)
allowed_scheme_set = {scheme.lower() for scheme in allowed_schemes} allowed_scheme_set = {scheme.lower() for scheme in allowed_schemes}
if parsed.scheme.lower() not in allowed_scheme_set: if parsed.scheme.lower() not in allowed_scheme_set: