diff --git a/pkg/rclonefs/base.go b/pkg/rclonefs/base.go index 00b51af7..6713d9d5 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 && !errors.Is(err, io.ErrUnexpectedEOF) && !errors.Is(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..f2a731fc 100644 --- a/pkg/restfulresolver/context.go +++ b/pkg/restfulresolver/context.go @@ -1,7 +1,9 @@ package restfulresolver import ( + "errors" "fmt" + "io" "net/http" "strconv" "strings" @@ -282,7 +284,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 && !errors.Is(err, io.ErrUnexpectedEOF) && !errors.Is(err, io.EOF) { return nil, err } @@ -293,7 +296,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, }) }