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:
@@ -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",
|
||||||
|
|||||||
@@ -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("/")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user