Files
gpt-load/internal/proxy/request_helpers.go
2025-07-11 17:11:00 +08:00

64 lines
1.7 KiB
Go

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
}