Files
influx-cli/pkg/gzip/pipe.go

48 lines
879 B
Go

package gzip
import (
"compress/gzip"
"io"
)
var _ io.ReadCloser = (*gzipPipe)(nil)
type gzipPipe struct {
underlying io.ReadCloser
pipeOut io.ReadCloser
}
// NewGzipPipe returns an io.ReadCloser that wraps an input data stream,
// applying gzip compression to the underlying data on Read and closing the
// underlying data on Close.
func NewGzipPipe(in io.ReadCloser) *gzipPipe {
pr, pw := io.Pipe()
gw := gzip.NewWriter(pw)
go func() {
_, err := io.Copy(gw, in)
gw.Close()
if err != nil {
pw.CloseWithError(err)
} else {
pw.Close()
}
}()
return &gzipPipe{underlying: in, pipeOut: pr}
}
func (gzp gzipPipe) Read(p []byte) (int, error) {
return gzp.pipeOut.Read(p)
}
func (gzp gzipPipe) Close() error {
if err := gzp.pipeOut.Close(); err != nil {
return err
}
if err := gzp.underlying.Close(); err != nil {
return err
}
return nil
}