35 lines
642 B
Go
35 lines
642 B
Go
package utils
|
|
|
|
import "io"
|
|
|
|
// Edited from https://github.com/jig/teereadcloser
|
|
// Under the Mozilla Public License 2.0
|
|
|
|
func TeeReadCloser(r io.ReadCloser, w io.Writer, onClose func() error) io.ReadCloser {
|
|
return &teeReaderCloser{r, w, onClose}
|
|
}
|
|
|
|
type teeReaderCloser struct {
|
|
r io.ReadCloser
|
|
w io.Writer
|
|
onClose func() error
|
|
}
|
|
|
|
func (t *teeReaderCloser) Read(p []byte) (n int, err error) {
|
|
n, err = t.r.Read(p)
|
|
if n > 0 {
|
|
if n, err := t.w.Write(p[:n]); err != nil {
|
|
return n, err
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (t *teeReaderCloser) Close() error {
|
|
err := t.r.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return t.onClose()
|
|
}
|