fix: 阻止客户端 accept-encoding: zstd 透传到上游导致 JSON 解析失败

客户端(Claude Code CLI)发送的 accept-encoding 含 zstd,被透传到上游后
返回 zstd 压缩响应,Node.js 18 无法解压导致 "Failed to parse JSON"。

- headerFilter: 从 filterForClaude 白名单移除 accept-encoding
- claudeCodeHeadersService: 从捕获列表移除 accept-encoding
- claudeRelayService: spread 后强制覆盖 accept-encoding 为 identity,
  防御 Redis 旧缓存残留覆盖
This commit is contained in:
shaw
2026-03-03 14:12:34 +08:00
parent b0842ca927
commit f0b21fdcc4
3 changed files with 8 additions and 3 deletions

View File

@@ -43,8 +43,8 @@ class ClaudeCodeHeadersService {
'x-app',
'user-agent',
'accept-language',
'sec-fetch-mode',
'accept-encoding'
'sec-fetch-mode'
// 注意:不捕获 accept-encoding,避免存储客户端的 zstd 等不支持的编码
]
// Headers 缓存 TTL60秒

View File

@@ -1526,6 +1526,10 @@ class ClaudeRelayService {
...finalHeaders
}
// 强制 identity 编码finalHeaders 可能携带客户端或 Redis 缓存中的 accept-encoding如 zstd
// 必须在 spread 后覆盖回 identity因为 https.request 的手动解压只支持 gzip/deflate
headers['accept-encoding'] = 'identity'
// 使用统一 User-Agent 或客户端提供的,最后使用默认值
const userAgent = unifiedUA || headers['user-agent'] || 'claude-cli/1.0.119 (external, cli)'
const acceptHeader = headers['accept'] || 'application/json'

View File

@@ -73,7 +73,8 @@ function filterForClaude(headers) {
'anthropic-beta',
'accept-language',
'sec-fetch-mode',
'accept-encoding',
// 注意:不透传 accept-encoding,避免客户端发送的 zstd 等 Node.js 不支持的编码
// 被转发到上游,导致 axios 无法解压响应Node 18 zlib 不支持 zstd
'user-agent',
'content-type',
'connection'