mirror of
https://github.com/amir20/dozzle.git
synced 2025-12-24 06:28:42 +01:00
50 lines
877 B
Go
50 lines
877 B
Go
package docker
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
type logReader struct {
|
|
readerCloser io.ReadCloser
|
|
tty bool
|
|
lastHeader []byte
|
|
buffer bytes.Buffer
|
|
}
|
|
|
|
func newLogReader(reader io.ReadCloser, tty bool) io.ReadCloser {
|
|
return &logReader{
|
|
reader,
|
|
tty,
|
|
make([]byte, 8),
|
|
bytes.Buffer{},
|
|
}
|
|
}
|
|
|
|
func (r *logReader) Read(p []byte) (n int, err error) {
|
|
if r.tty {
|
|
return r.readerCloser.Read(p)
|
|
} else {
|
|
if r.buffer.Len() > 0 {
|
|
return r.buffer.Read(p)
|
|
} else {
|
|
r.buffer.Reset()
|
|
_, err := r.readerCloser.Read(r.lastHeader)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
count := binary.BigEndian.Uint32(r.lastHeader[4:])
|
|
_, err = io.CopyN(&r.buffer, r.readerCloser, int64(count))
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return r.buffer.Read(p)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (r *logReader) Close() error {
|
|
return r.readerCloser.Close()
|
|
}
|