Skip to content

Commit d6b3493

Browse files
committed
feat: 提取响应错误信息处理逻辑,支持Gzip解压
1 parent 59d4f79 commit d6b3493

File tree

1 file changed

+35
-23
lines changed

1 file changed

+35
-23
lines changed

internal/proxy/server.go

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -342,29 +342,8 @@ func (ps *ProxyServer) executeRequestWithRetry(c *gin.Context, startTime time.Ti
342342
logrus.Debugf("Initial request returned error %d (response time: %v)", resp.StatusCode, responseTime)
343343
}
344344

345-
// Read response body to get error information
346-
var errorMessage string
347-
errorBodyBytes, err := io.ReadAll(resp.Body)
348-
if err != nil {
349-
errorMessage = fmt.Sprintf("HTTP %d (failed to read body: %v)", resp.StatusCode, err)
350-
} else {
351-
if resp.Header.Get("Content-Encoding") == "gzip" {
352-
reader, gErr := gzip.NewReader(bytes.NewReader(errorBodyBytes))
353-
if gErr != nil {
354-
errorMessage = fmt.Sprintf("gzip reader error: %v", gErr)
355-
} else {
356-
uncompressedBytes, rErr := io.ReadAll(reader)
357-
reader.Close()
358-
if rErr != nil {
359-
errorMessage = fmt.Sprintf("gzip read error: %v", rErr)
360-
} else {
361-
errorMessage = string(uncompressedBytes)
362-
}
363-
}
364-
} else {
365-
errorMessage = string(errorBodyBytes)
366-
}
367-
}
345+
// Extract error message from response, handling Gzip
346+
errorMessage := getErrorMessageFromResponse(resp)
368347

369348
var jsonError struct {
370349
Error struct {
@@ -425,6 +404,39 @@ func (ps *ProxyServer) executeRequestWithRetry(c *gin.Context, startTime time.Ti
425404
}
426405
}
427406

407+
// getErrorMessageFromResponse reads the response body, handles Gzip decompression,
408+
// and returns a meaningful error message.
409+
func getErrorMessageFromResponse(resp *http.Response) string {
410+
bodyBytes, err := io.ReadAll(resp.Body)
411+
if err != nil {
412+
return fmt.Sprintf("HTTP %d (failed to read body: %v)", resp.StatusCode, err)
413+
}
414+
defer resp.Body.Close()
415+
416+
var errorMessage string
417+
if resp.Header.Get("Content-Encoding") == "gzip" {
418+
reader, gErr := gzip.NewReader(bytes.NewReader(bodyBytes))
419+
if gErr != nil {
420+
errorMessage = string(bodyBytes)
421+
} else {
422+
defer reader.Close()
423+
uncompressedBytes, rErr := io.ReadAll(reader)
424+
if rErr != nil {
425+
return fmt.Sprintf("gzip read error: %v", rErr)
426+
}
427+
errorMessage = string(uncompressedBytes)
428+
}
429+
} else {
430+
errorMessage = string(bodyBytes)
431+
}
432+
433+
if strings.TrimSpace(errorMessage) == "" {
434+
return fmt.Sprintf("HTTP %d: %s", resp.StatusCode, http.StatusText(resp.StatusCode))
435+
}
436+
437+
return errorMessage
438+
}
439+
428440
var newline = []byte("\n")
429441

430442
// handleStreamingResponse handles streaming responses

0 commit comments

Comments
 (0)