diff --git a/util/readers/cancel_closer.go b/util/readers/cancel_closer.go index 36c9680b..f2f16332 100644 --- a/util/readers/cancel_closer.go +++ b/util/readers/cancel_closer.go @@ -2,24 +2,40 @@ package readers import "io" +type CancellableCloser interface { + io.ReadCloser +} + type CancelCloser struct { io.ReadCloser - r io.ReadCloser cancel func() } -func NewCancelCloser(r io.ReadCloser, cancel func()) *CancelCloser { - return &CancelCloser{ - r: r, - cancel: cancel, - } +type CancelSeekCloser struct { + io.ReadSeekCloser + cancel func() } -func (c *CancelCloser) Read(p []byte) (int, error) { - return c.r.Read(p) +func NewCancelCloser(r io.ReadCloser, cancel func()) CancellableCloser { + if rsc, ok := r.(io.ReadSeekCloser); ok { + return &CancelSeekCloser{ + ReadSeekCloser: rsc, + cancel: cancel, + } + } else { + return &CancelCloser{ + ReadCloser: r, + cancel: cancel, + } + } } func (c *CancelCloser) Close() error { c.cancel() - return c.r.Close() + return c.ReadCloser.Close() +} + +func (c *CancelSeekCloser) Close() error { + c.cancel() + return c.ReadSeekCloser.Close() }