Blame vendor/github.com/Azure/azure-pipeline-go/pipeline/progress.go

Packit 63bb0d
package pipeline
Packit 63bb0d
Packit 63bb0d
import "io"
Packit 63bb0d
Packit 63bb0d
// ********** The following is common between the request body AND the response body.
Packit 63bb0d
Packit 63bb0d
// ProgressReceiver defines the signature of a callback function invoked as progress is reported.
Packit 63bb0d
type ProgressReceiver func(bytesTransferred int64)
Packit 63bb0d
Packit 63bb0d
// ********** The following are specific to the request body (a ReadSeekCloser)
Packit 63bb0d
Packit 63bb0d
// This struct is used when sending a body to the network
Packit 63bb0d
type requestBodyProgress struct {
Packit 63bb0d
	requestBody io.ReadSeeker // Seeking is required to support retries
Packit 63bb0d
	pr          ProgressReceiver
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// NewRequestBodyProgress adds progress reporting to an HTTP request's body stream.
Packit 63bb0d
func NewRequestBodyProgress(requestBody io.ReadSeeker, pr ProgressReceiver) io.ReadSeeker {
Packit 63bb0d
	if pr == nil {
Packit 63bb0d
		panic("pr must not be nil")
Packit 63bb0d
	}
Packit 63bb0d
	return &requestBodyProgress{requestBody: requestBody, pr: pr}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Read reads a block of data from an inner stream and reports progress
Packit 63bb0d
func (rbp *requestBodyProgress) Read(p []byte) (n int, err error) {
Packit 63bb0d
	n, err = rbp.requestBody.Read(p)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	// Invokes the user's callback method to report progress
Packit 63bb0d
	position, err := rbp.requestBody.Seek(0, io.SeekCurrent)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		panic(err)
Packit 63bb0d
	}
Packit 63bb0d
	rbp.pr(position)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (rbp *requestBodyProgress) Seek(offset int64, whence int) (offsetFromStart int64, err error) {
Packit 63bb0d
	return rbp.requestBody.Seek(offset, whence)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// requestBodyProgress supports Close but the underlying stream may not; if it does, Close will close it.
Packit 63bb0d
func (rbp *requestBodyProgress) Close() error {
Packit 63bb0d
	if c, ok := rbp.requestBody.(io.Closer); ok {
Packit 63bb0d
		return c.Close()
Packit 63bb0d
	}
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// ********** The following are specific to the response body (a ReadCloser)
Packit 63bb0d
Packit 63bb0d
// This struct is used when sending a body to the network
Packit 63bb0d
type responseBodyProgress struct {
Packit 63bb0d
	responseBody io.ReadCloser
Packit 63bb0d
	pr           ProgressReceiver
Packit 63bb0d
	offset       int64
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// NewResponseBodyProgress adds progress reporting to an HTTP response's body stream.
Packit 63bb0d
func NewResponseBodyProgress(responseBody io.ReadCloser, pr ProgressReceiver) io.ReadCloser {
Packit 63bb0d
	if pr == nil {
Packit 63bb0d
		panic("pr must not be nil")
Packit 63bb0d
	}
Packit 63bb0d
	return &responseBodyProgress{responseBody: responseBody, pr: pr, offset: 0}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Read reads a block of data from an inner stream and reports progress
Packit 63bb0d
func (rbp *responseBodyProgress) Read(p []byte) (n int, err error) {
Packit 63bb0d
	n, err = rbp.responseBody.Read(p)
Packit 63bb0d
	rbp.offset += int64(n)
Packit 63bb0d
Packit 63bb0d
	// Invokes the user's callback method to report progress
Packit 63bb0d
	rbp.pr(rbp.offset)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (rbp *responseBodyProgress) Close() error {
Packit 63bb0d
	return rbp.responseBody.Close()
Packit 63bb0d
}