// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . //go:build plus package oss import ( rangeutils "github.com/TeaOSLab/EdgeNode/internal/utils/ranges" "strconv" "strings" ) func httpRequestParseRangeHeader(rangeValue string) (result []rangeutils.Range, ok bool) { // 参考RFC:https://tools.ietf.org/html/rfc7233 index := strings.Index(rangeValue, "=") if index == -1 { return } unit := rangeValue[:index] if unit != "bytes" { return } var rangeSetString = rangeValue[index+1:] if len(rangeSetString) == 0 { ok = true return } var pieces = strings.Split(rangeSetString, ", ") for _, piece := range pieces { index = strings.Index(piece, "-") if index == -1 { return } first := piece[:index] firstInt := int64(-1) var err error last := piece[index+1:] var lastInt = int64(-1) if len(first) > 0 { firstInt, err = strconv.ParseInt(first, 10, 64) if err != nil { return } if len(last) > 0 { lastInt, err = strconv.ParseInt(last, 10, 64) if err != nil { return } if lastInt < firstInt { return } } } else { if len(last) == 0 { return } lastInt, err = strconv.ParseInt(last, 10, 64) if err != nil { return } lastInt = -lastInt } result = append(result, [2]int64{firstInt, lastInt}) } ok = true return }