From 7429bc8d9b0edd76da1d004f0e503846d88dbbb2 Mon Sep 17 00:00:00 2001 From: Howard Wu Date: Tue, 1 Sep 2026 14:45:55 +1200 Subject: [PATCH 1/2] fix: attachments < 512 bytes caused mime type detection failed --- pkg/rclonefs/base.go | 5 +++-- pkg/restfulresolver/context.go | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/rclonefs/base.go b/pkg/rclonefs/base.go index 00b51af7..eb12877b 100644 --- a/pkg/rclonefs/base.go +++ b/pkg/rclonefs/base.go @@ -84,7 +84,8 @@ func (r *BaseRcloneDisk) PutMultipart( fileHeader := make([]byte, 512) - if _, err := f.Read(fileHeader); err != nil { + n, err := io.ReadFull(f, fileHeader) + if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF { return nil, err } @@ -93,7 +94,7 @@ func (r *BaseRcloneDisk) PutMultipart( } dst := "" - fileType := http.DetectContentType(fileHeader) + fileType := http.DetectContentType(fileHeader[:n]) if !r.IsAllowedMime(strings.ToLower(fileType)) { return nil, errors.New("file type is not allowed") diff --git a/pkg/restfulresolver/context.go b/pkg/restfulresolver/context.go index b205bf8a..c24fe02f 100644 --- a/pkg/restfulresolver/context.go +++ b/pkg/restfulresolver/context.go @@ -2,6 +2,7 @@ package restfulresolver import ( "fmt" + "io" "net/http" "strconv" "strings" @@ -282,7 +283,8 @@ func (c *Context) Files() ([]*fs.File, error) { m := make([]byte, 512) - if _, err := f.Read(m); err != nil { + n, err := io.ReadFull(f, m) + if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF { return nil, err } @@ -293,7 +295,7 @@ func (c *Context) Files() ([]*fs.File, error) { files = append(files, &fs.File{ Name: fileHeader.Filename, Size: uint64(fileHeader.Size), - Type: http.DetectContentType(m), + Type: http.DetectContentType(m[:n]), Reader: f, }) } From a8d833d1f55314e24fb9dd397d019771fd163640 Mon Sep 17 00:00:00 2001 From: Howard Wu Date: Tue, 1 Sep 2026 14:56:32 +1200 Subject: [PATCH 2/2] fix: linter check --- pkg/rclonefs/base.go | 2 +- pkg/restfulresolver/context.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/rclonefs/base.go b/pkg/rclonefs/base.go index eb12877b..6713d9d5 100644 --- a/pkg/rclonefs/base.go +++ b/pkg/rclonefs/base.go @@ -85,7 +85,7 @@ func (r *BaseRcloneDisk) PutMultipart( fileHeader := make([]byte, 512) n, err := io.ReadFull(f, fileHeader) - if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF { + if err != nil && !errors.Is(err, io.ErrUnexpectedEOF) && !errors.Is(err, io.EOF) { return nil, err } diff --git a/pkg/restfulresolver/context.go b/pkg/restfulresolver/context.go index c24fe02f..f2a731fc 100644 --- a/pkg/restfulresolver/context.go +++ b/pkg/restfulresolver/context.go @@ -1,6 +1,7 @@ package restfulresolver import ( + "errors" "fmt" "io" "net/http" @@ -284,7 +285,7 @@ func (c *Context) Files() ([]*fs.File, error) { m := make([]byte, 512) n, err := io.ReadFull(f, m) - if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF { + if err != nil && !errors.Is(err, io.ErrUnexpectedEOF) && !errors.Is(err, io.EOF) { return nil, err }