package proxy import ( "bytes" "compress/gzip" "encoding/json" app_errors "gpt-load/internal/errors" "gpt-load/internal/models" "io" "net/http" "github.com/sirupsen/logrus" ) func (ps *ProxyServer) applyParamOverrides(bodyBytes []byte, group *models.Group) ([]byte, error) { if len(group.ParamOverrides) == 0 || len(bodyBytes) == 0 { return bodyBytes, nil } var requestData map[string]any if err := json.Unmarshal(bodyBytes, &requestData); err != nil { logrus.Warnf("failed to unmarshal request body for param override, passing through: %v", err) return bodyBytes, nil } for key, value := range group.ParamOverrides { requestData[key] = value } return json.Marshal(requestData) } // logUpstreamError provides a centralized way to log errors from upstream interactions. func logUpstreamError(context string, err error) { if err == nil { return } if app_errors.IsIgnorableError(err) { logrus.Debugf("Ignorable upstream error in %s: %v", context, err) } else { logrus.Errorf("Upstream error in %s: %v", context, err) } } // handleGzipCompression checks for gzip encoding and decompresses the body if necessary. func handleGzipCompression(resp *http.Response, bodyBytes []byte) []byte { if resp.Header.Get("Content-Encoding") == "gzip" { reader, gzipErr := gzip.NewReader(bytes.NewReader(bodyBytes)) if gzipErr != nil { logrus.Warnf("Failed to create gzip reader for error body: %v", gzipErr) return bodyBytes } defer reader.Close() decompressedBody, readAllErr := io.ReadAll(reader) if readAllErr != nil { logrus.Warnf("Failed to decompress gzip error body: %v", readAllErr) return bodyBytes } return decompressedBody } return bodyBytes }