fix: convert byte range to start and length

This commit is contained in:
Ben McClelland
2023-06-06 13:47:06 -07:00
parent 20b6c1c266
commit 6b16dd76bd
2 changed files with 38 additions and 30 deletions

View File

@@ -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
}

View File

@@ -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
}