mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-04-19 03:17:28 +00:00
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:
@@ -43,8 +43,8 @@ class ClaudeCodeHeadersService {
|
||||
'x-app',
|
||||
'user-agent',
|
||||
'accept-language',
|
||||
'sec-fetch-mode',
|
||||
'accept-encoding'
|
||||
'sec-fetch-mode'
|
||||
// 注意:不捕获 accept-encoding,避免存储客户端的 zstd 等不支持的编码
|
||||
]
|
||||
|
||||
// Headers 缓存 TTL(60秒)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user