mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-03 01:40:21 +08:00
feat(test,export,headers): 模型测试复用统一运行时、实时进度展示、导出增强与请求头大小写保留
- 模型测试 failover 从手动 FailoverEngine 改为 TaskService.execute_sync_candidates 统一运行时 - 前端新增实时 trace 轮询进度展示(候选状态、测试账号、进度条) - 用户导出/导入支持明文 Key 优先(版本升至 1.2),新增 email_verified 字段 - SENSITIVE_CREDENTIAL_FIELDS 统一到 provider_ops/types.py,补充 refresh_token - 请求头大小写保留机制(resolve_header_name_case + HeaderBuilder.add 语义修改) - Codex envelope 移除合成头部,保留客户端原始请求头 - endpoint_checker 支持自定义超时透传 - 新增 x-forwarded-scheme 到上游丢弃头部列表
This commit is contained in:
@@ -44,6 +44,7 @@ from src.core.api_format.headers import (
|
||||
merge_headers_with_protection,
|
||||
normalize_headers,
|
||||
redact_headers_for_log,
|
||||
resolve_header_name_case,
|
||||
)
|
||||
from src.core.api_format.metadata import (
|
||||
ENDPOINT_DEFINITIONS,
|
||||
@@ -122,6 +123,7 @@ __all__ = [
|
||||
"merge_headers_with_protection",
|
||||
"filter_response_headers",
|
||||
"redact_headers_for_log",
|
||||
"resolve_header_name_case",
|
||||
"build_adapter_base_headers_for_endpoint",
|
||||
"build_adapter_headers_for_endpoint",
|
||||
"get_adapter_protected_keys_for_endpoint",
|
||||
|
||||
@@ -82,6 +82,7 @@ UPSTREAM_DROP_HEADERS: frozenset[str] = frozenset(
|
||||
"x-real-proto",
|
||||
"x-forwarded-for",
|
||||
"x-forwarded-proto",
|
||||
"x-forwarded-scheme",
|
||||
"x-forwarded-host",
|
||||
"x-forwarded-port",
|
||||
}
|
||||
@@ -189,6 +190,19 @@ def extract_client_api_key_for_endpoint(
|
||||
return value
|
||||
|
||||
|
||||
def resolve_header_name_case(
|
||||
headers: dict[str, str] | None,
|
||||
preferred_key: str,
|
||||
) -> str:
|
||||
"""Preserve original header casing when replacing an existing header."""
|
||||
if headers:
|
||||
preferred_lower = preferred_key.lower()
|
||||
for key in headers.keys():
|
||||
if str(key).lower() == preferred_lower:
|
||||
return str(key)
|
||||
return preferred_key
|
||||
|
||||
|
||||
def extract_client_api_key_for_endpoint_with_query(
|
||||
headers: dict[str, str],
|
||||
query_params: dict[str, str] | None,
|
||||
@@ -279,8 +293,11 @@ class HeaderBuilder:
|
||||
self._headers: dict[str, tuple[str, str]] = {}
|
||||
|
||||
def add(self, key: str, value: str) -> HeaderBuilder:
|
||||
"""添加单个头部(会覆盖同名头部)"""
|
||||
self._headers[key.lower()] = (key, value)
|
||||
"""添加单个头部(会覆盖同名头部,但保留已存在 key 的原始大小写)"""
|
||||
key_lower = key.lower()
|
||||
existing = self._headers.get(key_lower)
|
||||
stored_key = existing[0] if existing else key
|
||||
self._headers[key_lower] = (stored_key, value)
|
||||
return self
|
||||
|
||||
def add_many(self, headers: dict[str, str]) -> HeaderBuilder:
|
||||
@@ -454,7 +471,7 @@ def build_upstream_headers_for_endpoint(
|
||||
if extra_headers:
|
||||
builder.add_many(extra_headers)
|
||||
|
||||
builder.add(auth_header, auth_value)
|
||||
builder.add(resolve_header_name_case(original_headers, auth_header), auth_value)
|
||||
|
||||
result = builder.build()
|
||||
if not any(k.lower() == "content-type" for k in result):
|
||||
|
||||
Reference in New Issue
Block a user