proxy/pkg/utils/reader.go
2023-01-25 14:03:37 +03:00

39 lines
630 B
Go

// Copyright 2022 Listware
package utils
import (
"bytes"
"io"
)
type reusableReader struct {
io.Reader
readBuf *bytes.Buffer
backBuf *bytes.Buffer
}
func ReusableReader(r io.Reader) io.Reader {
readBuf := bytes.Buffer{}
readBuf.ReadFrom(r) // error handling ignored for brevity
backBuf := bytes.Buffer{}
return reusableReader{
io.TeeReader(&readBuf, &backBuf),
&readBuf,
&backBuf,
}
}
func (r reusableReader) Read(p []byte) (int, error) {
n, err := r.Reader.Read(p)
if err == io.EOF {
r.reset()
}
return n, err
}
func (r reusableReader) reset() {
io.Copy(r.readBuf, r.backBuf) // nolint: errcheck
}