fix(sse): 修复非标准 SSE 格式解析问题

部分上游 API 返回的 SSE 格式不符合标准规范:
- 标准格式: `data: {...}`(冒号后有空格)
- 非标准格式: `data:{...}`(冒号后无空格)

使用预编译正则 `^data:\s*` 统一处理两种格式。
This commit is contained in:
ianshaw
2025-12-26 03:49:55 -08:00
parent ecb2c5353c
commit 16eec4eb41
3 changed files with 64 additions and 30 deletions

View File

@@ -10,6 +10,7 @@ import (
"io"
"log"
"net/http"
"regexp"
"strconv"
"strings"
"time"
@@ -21,6 +22,10 @@ import (
"github.com/google/uuid"
)
// sseDataPrefix matches SSE data lines with optional whitespace after colon.
// Some upstream APIs return non-standard "data:" without space (should be "data: ").
var sseDataPrefix = regexp.MustCompile(`^data:\s*`)
const (
testClaudeAPIURL = "https://api.anthropic.com/v1/messages"
testOpenAIAPIURL = "https://api.openai.com/v1/responses"
@@ -412,11 +417,11 @@ func (s *AccountTestService) processClaudeStream(c *gin.Context, body io.Reader)
}
line = strings.TrimSpace(line)
if line == "" || !strings.HasPrefix(line, "data: ") {
if line == "" || !sseDataPrefix.MatchString(line) {
continue
}
jsonStr := strings.TrimPrefix(line, "data: ")
jsonStr := sseDataPrefix.ReplaceAllString(line, "")
if jsonStr == "[DONE]" {
s.sendEvent(c, TestEvent{Type: "test_complete", Success: true})
return nil
@@ -466,11 +471,11 @@ func (s *AccountTestService) processOpenAIStream(c *gin.Context, body io.Reader)
}
line = strings.TrimSpace(line)
if line == "" || !strings.HasPrefix(line, "data: ") {
if line == "" || !sseDataPrefix.MatchString(line) {
continue
}
jsonStr := strings.TrimPrefix(line, "data: ")
jsonStr := sseDataPrefix.ReplaceAllString(line, "")
if jsonStr == "[DONE]" {
s.sendEvent(c, TestEvent{Type: "test_complete", Success: true})
return nil