github.com/pivotal-cf/go-pivnet/v6@v6.0.2/download/ranger.go (about) 1 package download 2 3 import ( 4 "errors" 5 "fmt" 6 "net/http" 7 ) 8 9 type Range struct { 10 Lower int64 11 Upper int64 12 HTTPHeader http.Header 13 } 14 15 func NewRange(lower int64, upper int64, httpHeader http.Header) (Range){ 16 return Range { 17 lower, 18 upper, 19 httpHeader, 20 } 21 } 22 23 type Ranger struct { 24 numHunks int 25 } 26 27 func NewRanger(hunks int) Ranger { 28 return Ranger{ 29 numHunks: hunks, 30 } 31 } 32 33 func (r Ranger) BuildRange(contentLength int64) ([]Range, error) { 34 var ranges []Range 35 36 if contentLength == 0 { 37 return ranges, errors.New("content length cannot be zero") 38 } 39 40 hunkSize := contentLength / int64(r.numHunks) 41 if hunkSize == 0 { 42 hunkSize = 2 43 } 44 45 iterations := (contentLength / hunkSize) 46 remainder := contentLength % int64(hunkSize) 47 48 for i := int64(0); i < int64(iterations); i++ { 49 lowerByte := i * hunkSize 50 upperByte := ((i + 1) * hunkSize) - 1 51 if i == int64(iterations-1) { 52 upperByte += remainder 53 } 54 formattedBytes := fmt.Sprintf("bytes=%d-%d", lowerByte, upperByte) 55 ranges = append(ranges, Range{ 56 Lower: lowerByte, 57 Upper: upperByte, 58 HTTPHeader: http.Header{"Range": []string{formattedBytes}}, 59 }) 60 } 61 62 return ranges, nil 63 }