mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-03-30 00:33:35 +00:00
Merge pull request #1028 from nanobanana123/fix/stream-gzip-decompression
fix: 解压 streaming 响应的 gzip 压缩,修复 SSE 数据损坏
This commit is contained in:
@@ -2386,7 +2386,28 @@ class ClaudeRelayService {
|
||||
const requestedModel = body?.model || 'unknown'
|
||||
const { isRealClaudeCodeRequest } = requestOptions
|
||||
|
||||
res.on('data', (chunk) => {
|
||||
// 🔧 处理上游 gzip/deflate 压缩:Anthropic (经 Cloudflare) 可能返回压缩响应
|
||||
const upstreamEncoding = res.headers['content-encoding']
|
||||
let dataSource = res
|
||||
if (upstreamEncoding === 'gzip') {
|
||||
dataSource = res.pipe(zlib.createGunzip())
|
||||
dataSource.on('error', (err) => {
|
||||
logger.error('❌ Gzip decompression error in stream:', err.message)
|
||||
if (isStreamWritable(responseStream)) {
|
||||
responseStream.end()
|
||||
}
|
||||
})
|
||||
} else if (upstreamEncoding === 'deflate') {
|
||||
dataSource = res.pipe(zlib.createInflate())
|
||||
dataSource.on('error', (err) => {
|
||||
logger.error('❌ Deflate decompression error in stream:', err.message)
|
||||
if (isStreamWritable(responseStream)) {
|
||||
responseStream.end()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
dataSource.on('data', (chunk) => {
|
||||
try {
|
||||
const chunkStr = chunk.toString()
|
||||
|
||||
@@ -2531,7 +2552,7 @@ class ClaudeRelayService {
|
||||
}
|
||||
})
|
||||
|
||||
res.on('end', async () => {
|
||||
dataSource.on('end', async () => {
|
||||
try {
|
||||
// 处理缓冲区中剩余的数据
|
||||
if (buffer.trim() && isStreamWritable(responseStream)) {
|
||||
|
||||
Reference in New Issue
Block a user