mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-03-01 08:13:40 +00:00
44 lines
688 B
Go
44 lines
688 B
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
// Interface guards
|
|
var (
|
|
_ io.Reader = (*rewindReader)(nil)
|
|
)
|
|
|
|
type rewindReader struct {
|
|
io.Reader
|
|
rr bytes.Reader
|
|
}
|
|
|
|
func RewindReader(r io.Reader, buf []byte) io.Reader {
|
|
if len(buf) == 0 {
|
|
return r
|
|
}
|
|
|
|
return &rewindReader{
|
|
Reader: r,
|
|
rr: *bytes.NewReader(buf),
|
|
}
|
|
}
|
|
|
|
// Read implements io.Reader
|
|
// Read is ...
|
|
func (c *rewindReader) Read(b []byte) (int, error) {
|
|
if c.rr.Size() == 0 {
|
|
return c.Reader.Read(b)
|
|
}
|
|
n, err := c.rr.Read(b)
|
|
if errors.Is(err, io.EOF) || c.rr.Len() == 0 {
|
|
c.rr.Reset([]byte{})
|
|
n2, err := c.Reader.Read(b[n:]) // read the rest if possible
|
|
return n + n2, err
|
|
}
|
|
return n, err
|
|
}
|