in oss/downloader.go [529:581]
func (d *downloaderDelegate) downloadChunk(chunk downloaderChunk, hash hash.Hash64) (downloadedChunk, error) {
// Get the next byte range of data
var request GetObjectRequest
copyRequest(&request, d.request)
getFn := func(ctx context.Context, httpRange HTTPRange) (output *ReaderRangeGetOutput, err error) {
// update range
request.Range = nil
rangeStr := httpRange.FormatHTTPRange()
request.RangeBehavior = nil
if rangeStr != nil {
request.Range = rangeStr
request.RangeBehavior = Ptr("standard")
}
result, err := d.client.GetObject(ctx, &request, d.options.ClientOptions...)
if err != nil {
return nil, err
}
return &ReaderRangeGetOutput{
Body: result.Body,
ETag: result.ETag,
ContentLength: result.ContentLength,
ContentRange: result.ContentRange,
}, nil
}
reader, _ := NewRangeReader(d.context, getFn, &HTTPRange{chunk.start, chunk.size}, d.etag)
defer reader.Close()
var (
r io.Reader = reader
crc64 uint64 = 0
)
if hash != nil {
hash.Reset()
r = io.TeeReader(reader, hash)
}
n, err := io.Copy(&chunk, r)
d.incrWritten(n)
if hash != nil {
crc64 = hash.Sum64()
}
return downloadedChunk{
start: chunk.start,
size: n,
crc64: crc64,
}, err
}