parseRange parses a Range header string as per RFC 7233. errNoOverlap is returned if none of the ranges overlap.
(s string, size int64)
| 720 | // parseRange parses a Range header string as per RFC 7233. |
| 721 | // errNoOverlap is returned if none of the ranges overlap. |
| 722 | func parseRange(s string, size int64) ([]httpRange, error) { |
| 723 | if s == "" { |
| 724 | return nil, nil // header not present |
| 725 | } |
| 726 | const b = "bytes=" |
| 727 | if !strings.HasPrefix(s, b) { |
| 728 | return nil, errors.New("invalid range") |
| 729 | } |
| 730 | var ranges []httpRange |
| 731 | noOverlap := false |
| 732 | for ra := range strings.SplitSeq(s[len(b):], ",") { |
| 733 | ra = textproto.TrimString(ra) |
| 734 | if ra == "" { |
| 735 | continue |
| 736 | } |
| 737 | before, after, ok := strings.Cut(ra, "-") |
| 738 | if !ok { |
| 739 | return nil, errors.New("invalid range") |
| 740 | } |
| 741 | start, end := textproto.TrimString(before), textproto.TrimString(after) |
| 742 | var r httpRange |
| 743 | if start == "" { |
| 744 | // If no start is specified, end specifies the |
| 745 | // range start relative to the end of the file. |
| 746 | i, err := strconv.ParseInt(end, 10, 64) |
| 747 | if err != nil { |
| 748 | return nil, errors.New("invalid range") |
| 749 | } |
| 750 | if i > size { |
| 751 | i = size |
| 752 | } |
| 753 | r.start = size - i |
| 754 | r.length = size - r.start |
| 755 | } else { |
| 756 | i, err := strconv.ParseInt(start, 10, 64) |
| 757 | if err != nil || i < 0 { |
| 758 | return nil, errors.New("invalid range") |
| 759 | } |
| 760 | if i >= size { |
| 761 | // If the range begins after the size of the content, |
| 762 | // then it does not overlap. |
| 763 | noOverlap = true |
| 764 | continue |
| 765 | } |
| 766 | r.start = i |
| 767 | if end == "" { |
| 768 | // If no end is specified, range extends to end of the file. |
| 769 | r.length = size - r.start |
| 770 | } else { |
| 771 | i, err := strconv.ParseInt(end, 10, 64) |
| 772 | if err != nil || r.start > i { |
| 773 | return nil, errors.New("invalid range") |
| 774 | } |
| 775 | if i >= size { |
| 776 | i = size - 1 |
| 777 | } |
| 778 | r.length = i - r.start + 1 |
| 779 | } |
no outgoing calls
no test coverage detected
searching dependent graphs…