package readers import ( "compress/gzip" "io" ) // gzipReader wraps a *gzip.Reader so it closes the underlying stream // which the gzip library doesn't. type gzipReader struct { *gzip.Reader in io.ReadCloser } // NewGzipReader returns an io.ReadCloser which will read the stream // and close it when Close is called. // // Unfortunately gz.Reader does not close the underlying stream so we // can't use that directly. func NewGzipReader(in io.ReadCloser) (io.ReadCloser, error) { zr, err := gzip.NewReader(in) if err != nil { return nil, err } return &gzipReader{ Reader: zr, in: in, }, nil } // Close the underlying stream and the gzip reader func (gz *gzipReader) Close() error { zrErr := gz.Reader.Close() inErr := gz.in.Close() if inErr != nil { return inErr } if zrErr != nil { return zrErr } return nil }