aboutsummaryrefslogtreecommitdiff
path: root/internal/compress/zlib/reader.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-05 18:07:04 +0800
committerGravatar Runxi Yu2026-03-05 18:38:33 +0800
commitc8f00194c617796e2b83f715b4d2ece80a34a716 (patch)
tree52837aea0f3056611275ebc91d84860d65de3561 /internal/compress/zlib/reader.go
parentinternal/compress/flate: Add InputConsumed (diff)
signatureNo signature
internal/compress/zlib: Use flate's compression consumed counter
Diffstat (limited to 'internal/compress/zlib/reader.go')
-rw-r--r--internal/compress/zlib/reader.go38
1 files changed, 9 insertions, 29 deletions
diff --git a/internal/compress/zlib/reader.go b/internal/compress/zlib/reader.go
index 2d009887..75ef864c 100644
--- a/internal/compress/zlib/reader.go
+++ b/internal/compress/zlib/reader.go
@@ -71,36 +71,14 @@ var readerPool = sync.Pool{
type Reader struct {
r flate.Reader
decompressor io.ReadCloser
+ progress flate.InputProgress
digest hash.Hash32
- counter *countingFlateReader
+ headerRead uint64
+ trailerRead uint64
err error
scratch [4]byte
}
-// countingFlateReader wraps flate input and tracks consumed bytes.
-type countingFlateReader struct {
- inner flate.Reader
- read uint64
-}
-
-// Read implements io.Reader.
-func (reader *countingFlateReader) Read(dst []byte) (int, error) {
- n, err := reader.inner.Read(dst)
- reader.read += uint64(n)
-
- return n, err
-}
-
-// ReadByte implements io.ByteReader.
-func (reader *countingFlateReader) ReadByte() (byte, error) {
- b, err := reader.inner.ReadByte()
- if err == nil {
- reader.read++
- }
-
- return b, err
-}
-
// NewReader creates a new ReadCloser.
// Reads from the returned ReadCloser read and decompress data from r.
// If r does not implement [io.ByteReader], the decompressor may read more
@@ -152,7 +130,8 @@ func (z *Reader) Read(p []byte) (int, error) {
}
// Finished file; check checksum.
- _, err = io.ReadFull(z.r, z.scratch[0:4])
+ readN, err := io.ReadFull(z.r, z.scratch[0:4])
+ z.trailerRead += uint64(readN)
if err != nil {
if errors.Is(err, io.EOF) {
err = io.ErrUnexpectedEOF
@@ -178,11 +157,12 @@ func (z *Reader) Read(p []byte) (int, error) {
// This count includes the zlib header, deflate payload, and zlib checksum
// trailer bytes read by the reader.
func (z *Reader) InputConsumed() uint64 {
- if z.counter == nil {
- return 0
+ out := z.headerRead + z.trailerRead
+ if z.progress != nil {
+ out += uint64(z.progress.InputConsumed())
}
- return z.counter.read
+ return out
}
// Close does not close the wrapped [io.Reader] originally passed to [NewReader].