func ParseByteRanges(byteRange []byte, contentLength int) (startPos, endPos []int, err error) {
if !bytes.HasPrefix(b, bytestr.StrBytes) {
return startPos, endPos, fmt.Errorf("unsupported range units: %q. Expecting %q", byteRange, bytestr.StrBytes)
b = b[len(bytestr.StrBytes):]
if len(b) == 0 || b[0] != '=' {
return startPos, endPos, fmt.Errorf("missing byte range in %q", byteRange)
for _, ra := range bytes.Split(b, bytesconv.S2b(",")) {
n = bytes.IndexByte(ra, '-')
return startPos, endPos, fmt.Errorf("missing the end position of byte range in %q", byteRange)
v, err = bytesconv.ParseUint(ra[n+1:])
return startPos, endPos, err
startPos = append(startPos, sta)
endPos = append(endPos, contentLength-1)
if sta, err = bytesconv.ParseUint(ra[:n]); err != nil {
return startPos, endPos, err
if sta >= contentLength {
return startPos, endPos, fmt.Errorf("the start position of byte range cannot exceed %d. byte range %q", contentLength-1, byteRange)
startPos = append(startPos, sta)
endPos = append(endPos, contentLength-1)
if end, err = bytesconv.ParseUint(ra); err != nil {
return startPos, endPos, err
if end >= contentLength {
return startPos, endPos, fmt.Errorf("the start position of byte range cannot exceed the end position. byte range %q", byteRange)
startPos = append(startPos, sta)
endPos = append(endPos, end)
return startPos, endPos, nil