From 0199896d9a3dcebbcd8b63d7e6801150331a7bfd Mon Sep 17 00:00:00 2001 From: CaIon <1808837298@qq.com> Date: Tue, 17 Jun 2025 22:40:41 +0800 Subject: [PATCH] fix(relay): improve error handling for unsupported MIME types by sanitizing URLs --- relay/channel/gemini/relay-gemini.go | 5 ++++- service/error.go | 16 ++++++++++------ service/file_decoder.go | 4 ++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/relay/channel/gemini/relay-gemini.go b/relay/channel/gemini/relay-gemini.go index 5418d063..43ebf999 100644 --- a/relay/channel/gemini/relay-gemini.go +++ b/relay/channel/gemini/relay-gemini.go @@ -324,7 +324,10 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest, info *relaycommon // 校验 MimeType 是否在 Gemini 支持的白名单中 if _, ok := geminiSupportedMimeTypes[strings.ToLower(fileData.MimeType)]; !ok { - return nil, fmt.Errorf("MIME type '%s' from URL '%s' is not supported by Gemini. Supported types are: %v", fileData.MimeType, part.GetImageMedia().Url, getSupportedMimeTypesList()) + url := part.GetImageMedia().Url + url = strings.TrimPrefix(url, "http://") + url = strings.TrimPrefix(url, "https://") + return nil, fmt.Errorf("MIME type '%s' from URL '%s' is not supported by Gemini. Supported types are: %v", fileData.MimeType, url, getSupportedMimeTypesList()) } parts = append(parts, GeminiPart{ diff --git a/service/error.go b/service/error.go index 1bf5992b..25bb55b5 100644 --- a/service/error.go +++ b/service/error.go @@ -29,9 +29,11 @@ func MidjourneyErrorWithStatusCodeWrapper(code int, desc string, statusCode int) func OpenAIErrorWrapper(err error, code string, statusCode int) *dto.OpenAIErrorWithStatusCode { text := err.Error() lowerText := strings.ToLower(text) - if strings.Contains(lowerText, "post") || strings.Contains(lowerText, "dial") || strings.Contains(lowerText, "http") { - common.SysLog(fmt.Sprintf("error: %s", text)) - text = "请求上游地址失败" + if !strings.HasPrefix(lowerText, "get file base64 from url") { + if strings.Contains(lowerText, "post") || strings.Contains(lowerText, "dial") || strings.Contains(lowerText, "http") { + common.SysLog(fmt.Sprintf("error: %s", text)) + text = "请求上游地址失败" + } } openAIError := dto.OpenAIError{ Message: text, @@ -53,9 +55,11 @@ func OpenAIErrorWrapperLocal(err error, code string, statusCode int) *dto.OpenAI func ClaudeErrorWrapper(err error, code string, statusCode int) *dto.ClaudeErrorWithStatusCode { text := err.Error() lowerText := strings.ToLower(text) - if strings.Contains(lowerText, "post") || strings.Contains(lowerText, "dial") || strings.Contains(lowerText, "http") { - common.SysLog(fmt.Sprintf("error: %s", text)) - text = "请求上游地址失败" + if !strings.HasPrefix(lowerText, "get file base64 from url") { + if strings.Contains(lowerText, "post") || strings.Contains(lowerText, "dial") || strings.Contains(lowerText, "http") { + common.SysLog(fmt.Sprintf("error: %s", text)) + text = "请求上游地址失败" + } } claudeError := dto.ClaudeError{ Message: text, diff --git a/service/file_decoder.go b/service/file_decoder.go index ac6c63d6..c1d4fb0c 100644 --- a/service/file_decoder.go +++ b/service/file_decoder.go @@ -33,6 +33,10 @@ func GetFileBase64FromUrl(url string) (*dto.LocalFileData, error) { base64Data := base64.StdEncoding.EncodeToString(fileBytes) mimeType := resp.Header.Get("Content-Type") + if len(strings.Split(mimeType, ";")) > 1 { + // If Content-Type has parameters, take the first part + mimeType = strings.Split(mimeType, ";")[0] + } if mimeType == "application/octet-stream" { if common.DebugEnabled { println("MIME type is application/octet-stream, trying to guess from URL or filename")