MCPcopy
hub / github.com/containerd/containerd / parseRange

Function parseRange

core/remotes/docker/fetcher_test.go:722–788  ·  view source on GitHub ↗

parseRange parses a Range header string as per RFC 7233. errNoOverlap is returned if none of the ranges overlap.

(s string, size int64)

Source from the content-addressed store, hash-verified

720// parseRange parses a Range header string as per RFC 7233.
721// errNoOverlap is returned if none of the ranges overlap.
722func 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 }

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…