package readers import ( "io" "github.com/rclone/rclone/fs" ) // LimitedReadCloser adds io.Closer to io.LimitedReader. Create one with NewLimitedReadCloser type LimitedReadCloser struct { *io.LimitedReader io.Closer } // Close closes the underlying io.Closer. The error, if any, will be ignored if data is read completely func (lrc *LimitedReadCloser) Close() error { err := lrc.Closer.Close() if err != nil && lrc.N == 0 { fs.Debugf(nil, "ignoring close error because we already got all the data") err = nil } return err } // NewLimitedReadCloser returns a LimitedReadCloser wrapping rc to // limit it to reading limit bytes. If limit < 0 then it does not // wrap rc, it just returns it. func NewLimitedReadCloser(rc io.ReadCloser, limit int64) (lrc io.ReadCloser) { if limit < 0 { return rc } return &LimitedReadCloser{ LimitedReader: &io.LimitedReader{R: rc, N: limit}, Closer: rc, } }