Blame vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go
|
Packit Service |
4d2de5 |
package request
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
import (
|
|
Packit Service |
4d2de5 |
"io"
|
|
Packit Service |
4d2de5 |
"sync"
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
"github.com/aws/aws-sdk-go/internal/sdkio"
|
|
Packit Service |
4d2de5 |
)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// offsetReader is a thread-safe io.ReadCloser to prevent racing
|
|
Packit Service |
4d2de5 |
// with retrying requests
|
|
Packit Service |
4d2de5 |
type offsetReader struct {
|
|
Packit Service |
4d2de5 |
buf io.ReadSeeker
|
|
Packit Service |
4d2de5 |
lock sync.Mutex
|
|
Packit Service |
4d2de5 |
closed bool
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func newOffsetReader(buf io.ReadSeeker, offset int64) (*offsetReader, error) {
|
|
Packit Service |
4d2de5 |
reader := &offsetReader{}
|
|
Packit Service |
4d2de5 |
_, err := buf.Seek(offset, sdkio.SeekStart)
|
|
Packit Service |
4d2de5 |
if err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
reader.buf = buf
|
|
Packit Service |
4d2de5 |
return reader, nil
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// Close will close the instance of the offset reader's access to
|
|
Packit Service |
4d2de5 |
// the underlying io.ReadSeeker.
|
|
Packit Service |
4d2de5 |
func (o *offsetReader) Close() error {
|
|
Packit Service |
4d2de5 |
o.lock.Lock()
|
|
Packit Service |
4d2de5 |
defer o.lock.Unlock()
|
|
Packit Service |
4d2de5 |
o.closed = true
|
|
Packit Service |
4d2de5 |
return nil
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// Read is a thread-safe read of the underlying io.ReadSeeker
|
|
Packit Service |
4d2de5 |
func (o *offsetReader) Read(p []byte) (int, error) {
|
|
Packit Service |
4d2de5 |
o.lock.Lock()
|
|
Packit Service |
4d2de5 |
defer o.lock.Unlock()
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
if o.closed {
|
|
Packit Service |
4d2de5 |
return 0, io.EOF
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return o.buf.Read(p)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// Seek is a thread-safe seeking operation.
|
|
Packit Service |
4d2de5 |
func (o *offsetReader) Seek(offset int64, whence int) (int64, error) {
|
|
Packit Service |
4d2de5 |
o.lock.Lock()
|
|
Packit Service |
4d2de5 |
defer o.lock.Unlock()
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return o.buf.Seek(offset, whence)
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// CloseAndCopy will return a new offsetReader with a copy of the old buffer
|
|
Packit Service |
4d2de5 |
// and close the old buffer.
|
|
Packit Service |
4d2de5 |
func (o *offsetReader) CloseAndCopy(offset int64) (*offsetReader, error) {
|
|
Packit Service |
4d2de5 |
if err := o.Close(); err != nil {
|
|
Packit Service |
4d2de5 |
return nil, err
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
return newOffsetReader(o.buf, offset)
|
|
Packit Service |
4d2de5 |
}
|