Skip to content

Commit a17ac50

Browse files
committed
fix: 修复 Chat Completions 编译错误和运行时 panic
1. 修复 WriteFilteredHeaders API 不兼容(2处): 将 s.cfg.Security.ResponseHeaders 改为 s.responseHeaderFilter, 因为 main 分支已将函数签名改为接受 *responseheaders.CompiledHeaderFilter 2. 修复 writer 生命周期导致的 nil pointer panic: ChatCompletions handler 替换了 c.Writer 但未恢复,导致 OpsErrorLogger 中间件的 defer 释放 opsCaptureWriter 后, Logger 中间件调用 c.Writer.Status() 触发空指针解引用。 通过保存并恢复 originalWriter 修复。 3. 为 chatCompletionsResponseWriter 添加防御性 Status() 和 Written() 方法,包含 nil 安全检查 4. 恢复 gateway.go 中被误删的 net/http import
1 parent 656a77d commit a17ac50

3 files changed

Lines changed: 23 additions & 3 deletions

File tree

backend/internal/handler/openai_chat_completions.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,15 @@ func (h *OpenAIGatewayHandler) ChatCompletions(c *gin.Context) {
6262

6363
stream, _ := converted["stream"].(bool)
6464
model, _ := converted["model"].(string)
65+
originalWriter := c.Writer
6566
writer := newChatCompletionsResponseWriter(c.Writer, stream, includeUsage, model)
6667
c.Writer = writer
6768
c.Request.Body = io.NopCloser(bytes.NewReader(convertedBody))
6869
c.Request.ContentLength = int64(len(convertedBody))
6970

7071
h.Responses(c)
7172
writer.Finalize()
73+
c.Writer = originalWriter
7274
}
7375

7476
type chatCompletionsResponseWriter struct {
@@ -167,6 +169,20 @@ func (w *chatCompletionsResponseWriter) SetPassthrough() {
167169
w.passthrough = true
168170
}
169171

172+
func (w *chatCompletionsResponseWriter) Status() int {
173+
if w.ResponseWriter == nil {
174+
return 0
175+
}
176+
return w.ResponseWriter.Status()
177+
}
178+
179+
func (w *chatCompletionsResponseWriter) Written() bool {
180+
if w.ResponseWriter == nil {
181+
return false
182+
}
183+
return w.ResponseWriter.Written()
184+
}
185+
170186
func (w *chatCompletionsResponseWriter) flushStreamBuffer() {
171187
for {
172188
buf := w.streamBuf.Bytes()

backend/internal/server/routes/gateway.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package routes
22

33
import (
4+
"net/http"
5+
46
"github.com/Wei-Shaw/sub2api/internal/config"
57
"github.com/Wei-Shaw/sub2api/internal/handler"
68
"github.com/Wei-Shaw/sub2api/internal/server/middleware"

backend/internal/service/openai_chat_completions_forward.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ func (s *OpenAIGatewayService) buildChatCompletionsRequest(ctx context.Context,
209209
}
210210

211211
func (s *OpenAIGatewayService) handleChatCompletionsStreamingResponse(ctx context.Context, resp *http.Response, c *gin.Context, account *Account, startTime time.Time, originalModel, mappedModel string) (*chatStreamingResult, error) {
212-
if s.cfg != nil {
213-
responseheaders.WriteFilteredHeaders(c.Writer.Header(), resp.Header, s.cfg.Security.ResponseHeaders)
212+
if s.responseHeaderFilter != nil {
213+
responseheaders.WriteFilteredHeaders(c.Writer.Header(), resp.Header, s.responseHeaderFilter)
214214
}
215215

216216
c.Header("Content-Type", "text/event-stream")
@@ -409,7 +409,9 @@ func (s *OpenAIGatewayService) handleChatCompletionsNonStreamingResponse(resp *h
409409
}
410410
body = s.correctToolCallsInResponseBody(body)
411411

412-
responseheaders.WriteFilteredHeaders(c.Writer.Header(), resp.Header, s.cfg.Security.ResponseHeaders)
412+
if s.responseHeaderFilter != nil {
413+
responseheaders.WriteFilteredHeaders(c.Writer.Header(), resp.Header, s.responseHeaderFilter)
414+
}
413415

414416
contentType := "application/json"
415417
if s.cfg != nil && !s.cfg.Security.ResponseHeaders.Enabled {

0 commit comments

Comments
 (0)