fix(headers): 兼容非 ASCII header 值,避免 httpx ASCII 编码报错

将 HeaderBuilder 中的 latin-1 透传方案替换为 ASCII 归一化策略:
- 对 x-codex-turn-metadata 做 JSON 重编码(ensure_ascii=true)保留语义
- 其他非 ASCII 头值仅转义非 ASCII 字符为 \uXXXX,保留 ASCII 字符原样
- 新增单测覆盖中文 header 与 codex turn metadata 场景

Close #180

Co-Authored-By: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
fawney19
2026-02-26 02:56:54 +08:00
parent c0b80c923a
commit b6ca16e084
2 changed files with 57 additions and 16 deletions

View File

@@ -1,3 +1,5 @@
import json
from src.core.api_format import (
CORE_REDACT_HEADERS,
HeaderBuilder,
@@ -73,6 +75,23 @@ class TestHeaderBuilder:
assert built["Authorization"] == "base"
assert built["X-Test"] == "1"
def test_non_ascii_value_is_escaped_for_httpx(self) -> None:
builder = HeaderBuilder()
builder.add("X-Test", "桌面")
built = builder.build()
assert built["X-Test"] == r"\u684c\u9762"
def test_codex_turn_metadata_is_normalized_to_ascii_json(self) -> None:
builder = HeaderBuilder()
raw = '{"turn_id":"t1","workspaces":{"d:\\\\桌面\\\\123\\\\Aether":{"has_changes":true}}}'
builder.add("x-codex-turn-metadata", raw)
built = builder.build()
normalized = built["x-codex-turn-metadata"]
assert normalized.isascii()
parsed = json.loads(normalized)
assert "d:\\桌面\\123\\Aether" in parsed["workspaces"]
class TestBuildUpstreamHeaders:
def test_priority_and_drop_headers(self) -> None: