feat: 代理调试版本

This commit is contained in:
tbphp
2025-07-11 14:01:54 +08:00
parent 395d48c3e7
commit 6ffbb7e9a1
13 changed files with 568 additions and 255 deletions

View File

@@ -34,6 +34,8 @@ var (
ErrTaskInProgress = &APIError{HTTPStatus: http.StatusConflict, Code: "TASK_IN_PROGRESS", Message: "A task is already in progress"}
ErrBadGateway = &APIError{HTTPStatus: http.StatusBadGateway, Code: "BAD_GATEWAY", Message: "Upstream service error"}
ErrNoActiveKeys = &APIError{HTTPStatus: http.StatusServiceUnavailable, Code: "NO_ACTIVE_KEYS", Message: "No active API keys available for this group"}
ErrMaxRetriesExceeded = &APIError{HTTPStatus: http.StatusBadGateway, Code: "MAX_RETRIES_EXCEEDED", Message: "Request failed after maximum retries"}
ErrNoKeysAvailable = &APIError{HTTPStatus: http.StatusServiceUnavailable, Code: "NO_KEYS_AVAILABLE", Message: "No API keys available to process the request"}
)
// NewAPIError creates a new APIError with a custom message.
@@ -45,6 +47,15 @@ func NewAPIError(base *APIError, message string) *APIError {
}
}
// NewAPIErrorWithUpstream creates a new APIError specifically for wrapping raw upstream errors.
func NewAPIErrorWithUpstream(statusCode int, code string, upstreamMessage string) *APIError {
return &APIError{
HTTPStatus: statusCode,
Code: code,
Message: upstreamMessage,
}
}
// ParseDBError intelligently converts a GORM error into a standard APIError.
func ParseDBError(err error) *APIError {
if err == nil {

View File

@@ -0,0 +1,31 @@
package errors
import (
"strings"
)
// ignorableErrorSubstrings contains a list of substrings that indicate an error
// can be safely ignored. These typically occur when a client disconnects prematurely.
var ignorableErrorSubstrings = []string{
"context canceled",
"connection reset by peer",
"broken pipe",
"use of closed network connection",
"request canceled",
}
// IsIgnorableError checks if the given error is a common, non-critical error
// that can occur when a client disconnects. This is used to prevent logging
// unnecessary errors and to avoid marking keys as failed for client-side issues.
func IsIgnorableError(err error) bool {
if err == nil {
return false
}
errStr := err.Error()
for _, sub := range ignorableErrorSubstrings {
if strings.Contains(errStr, sub) {
return true
}
}
return false
}