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  }