| package service |
|
|
| import ( |
| "bytes" |
| "fmt" |
| "io" |
| "net/http" |
|
|
| "github.com/QuantumNous/new-api/common" |
| "github.com/QuantumNous/new-api/logger" |
|
|
| "github.com/gin-gonic/gin" |
| ) |
|
|
| func CloseResponseBodyGracefully(httpResponse *http.Response) { |
| if httpResponse == nil || httpResponse.Body == nil { |
| return |
| } |
| err := httpResponse.Body.Close() |
| if err != nil { |
| common.SysError("failed to close response body: " + err.Error()) |
| } |
| } |
|
|
| func IOCopyBytesGracefully(c *gin.Context, src *http.Response, data []byte) { |
| if c.Writer == nil { |
| return |
| } |
|
|
| body := io.NopCloser(bytes.NewBuffer(data)) |
|
|
| |
| |
| |
| |
| if src != nil { |
| for k, v := range src.Header { |
| |
| if k == "Content-Length" { |
| continue |
| } |
| c.Writer.Header().Set(k, v[0]) |
| } |
| } |
|
|
| |
| c.Writer.Header().Set("Content-Length", fmt.Sprintf("%d", len(data))) |
|
|
| |
| if src != nil { |
| c.Writer.WriteHeader(src.StatusCode) |
| } else { |
| c.Writer.WriteHeader(http.StatusOK) |
| } |
|
|
| _, err := io.Copy(c.Writer, body) |
| if err != nil { |
| logger.LogError(c, fmt.Sprintf("failed to copy response body: %s", err.Error())) |
| } |
| c.Writer.Flush() |
| } |
|
|