64 lines
1.7 KiB
Go
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
|
|
}
|