From 6b16dd76bdc74e026731f3aee81b793703580dea Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Tue, 6 Jun 2023 13:47:06 -0700 Subject: [PATCH] fix: convert byte range to start and length --- backend/common.go | 37 +++++++++++++++++++++++++++++++++++++ backend/posix/posix.go | 31 +------------------------------ 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/backend/common.go b/backend/common.go index 63873be..af18ad4 100644 --- a/backend/common.go +++ b/backend/common.go @@ -15,6 +15,10 @@ package backend import ( + "errors" + "io/fs" + "strconv" + "strings" "time" "github.com/aws/aws-sdk-go-v2/service/s3/types" @@ -41,3 +45,36 @@ func GetStringPtr(s string) *string { func GetTimePtr(t time.Time) *time.Time { return &t } + +func ParseRange(file fs.FileInfo, acceptRange string) (int64, int64, error) { + if acceptRange == "" { + return 0, file.Size(), nil + } + + rangeKv := strings.Split(acceptRange, "=") + + if len(rangeKv) < 2 { + return 0, 0, errors.New("invalid range parameter") + } + + bRange := strings.Split(rangeKv[1], "-") + if len(bRange) < 2 { + return 0, 0, errors.New("invalid range parameter") + } + + startOffset, err := strconv.ParseInt(bRange[0], 10, 64) + if err != nil { + return 0, 0, errors.New("invalid range parameter") + } + + endOffset, err := strconv.ParseInt(bRange[1], 10, 64) + if err != nil { + return 0, 0, errors.New("invalid range parameter") + } + + if endOffset < startOffset { + return 0, 0, errors.New("invalid range parameter") + } + + return int64(startOffset), int64(endOffset - startOffset + 1), nil +} diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 9b3885f..22105e7 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -871,7 +871,7 @@ func (p *Posix) GetObject(bucket, object, acceptRange string, writer io.Writer) return nil, fmt.Errorf("stat object: %w", err) } - startOffset, length, err := parseRange(fi, acceptRange) + startOffset, length, err := backend.ParseRange(fi, acceptRange) if err != nil { return nil, err } @@ -1147,32 +1147,3 @@ func isNoAttr(err error) bool { } return false } - -func parseRange(file fs.FileInfo, acceptRange string) (int64, int64, error) { - if acceptRange == "" { - return 0, file.Size(), nil - } - - bRangeSl := strings.Split(acceptRange, "=") - - if len(bRangeSl) < 2 { - return 0, 0, errors.New("invalid range parameter") - } - - bRange := strings.Split(bRangeSl[1], "-") - if len(bRange) < 2 { - return 0, 0, errors.New("invalid range parameter") - } - - startOffset, err := strconv.ParseInt(bRange[0], 10, 64) - if err != nil { - return 0, 0, errors.New("invalid range parameter") - } - - length, err := strconv.ParseInt(bRange[1], 10, 64) - if err != nil { - return 0, 0, errors.New("invalid range parameter") - } - - return int64(startOffset), int64(length), nil -}