feat: 优化代理服务
This commit is contained in:
63
internal/proxy/request_helpers.go
Normal file
63
internal/proxy/request_helpers.go
Normal file
@@ -0,0 +1,63 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user