storj/internal/pkg/readcloser/lazy.go
Kaloyan Raev 7c8d6f8081
Add error to the return values of Ranger.Range method (#90)
* Add error to the return values of Ranger.Range method

* Addressing code review feedback

* Set Content-Type header only if ctype is not empty
2018-06-18 19:46:49 +03:00

36 lines
690 B
Go

// Copyright (C) 2018 Storj Labs, Inc.
// See LICENSE for copying information.
package readcloser
import "io"
// LazyReadCloser returns an ReadCloser that doesn't initialize the backing
// Reader until the first Read.
func LazyReadCloser(reader func() (io.ReadCloser, error)) io.ReadCloser {
return &lazyReadCloser{fn: reader}
}
type lazyReadCloser struct {
fn func() (io.ReadCloser, error)
r io.ReadCloser
}
func (l *lazyReadCloser) Read(p []byte) (n int, err error) {
if l.r == nil {
l.r, err = l.fn()
if err != nil {
return 0, err
}
l.fn = nil
}
return l.r.Read(p)
}
func (l *lazyReadCloser) Close() error {
if l.r != nil {
return l.r.Close()
}
return nil
}