@@ -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+
428440var newline = []byte ("\n " )
429441
430442// handleStreamingResponse handles streaming responses
0 commit comments