]> Cypherpunks repositories - gostls13.git/commitdiff
compress/gzip: add Reset method to Reader
authorRobert Daniel Kortschak <dan.kortschak@adelaide.edu.au>
Thu, 17 Apr 2014 02:43:44 +0000 (22:43 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 17 Apr 2014 02:43:44 +0000 (22:43 -0400)
Fixes #6364.

LGTM=rsc
R=golang-codereviews, bradfitz, rsc, gobot
CC=golang-codereviews
https://golang.org/cl/13512052

src/pkg/compress/gzip/gunzip.go
src/pkg/compress/gzip/gunzip_test.go

index 1fb9b0964ce33399f768da7435f7db0cfc29eb62..d18269cfd169f5d535dcf86e8cd81ebb3712bd1a 100644 (file)
@@ -89,6 +89,17 @@ func NewReader(r io.Reader) (*Reader, error) {
        return z, nil
 }
 
+// Reset discards the Reader z's state and makes it equivalent to the
+// result of its original state from NewReader, but reading from r instead.
+// This permits reusing a Reader rather than allocating a new one.
+func (z *Reader) Reset(r io.Reader) error {
+       z.r = makeReader(r)
+       z.digest.Reset()
+       z.size = 0
+       z.err = nil
+       return z.readHeader(true)
+}
+
 // GZIP (RFC 1952) is little-endian, unlike ZLIB (RFC 1950).
 func get4(p []byte) uint32 {
        return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
index 561537373770fdb5713aa151dba523ba008dca36..1d5d8d9cc52c1e048c134c74d290e5cf8f53ba5a 100644 (file)
@@ -303,6 +303,26 @@ func TestDecompressor(t *testing.T) {
                if s != tt.raw {
                        t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
                }
+
+               // Test Reader Reset.
+               in = bytes.NewReader(tt.gzip)
+               err = gzip.Reset(in)
+               if err != nil {
+                       t.Errorf("%s: Reset: %s", tt.name, err)
+                       continue
+               }
+               if tt.name != gzip.Name {
+                       t.Errorf("%s: got name %s", tt.name, gzip.Name)
+               }
+               b.Reset()
+               n, err = io.Copy(b, gzip)
+               if err != tt.err {
+                       t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err)
+               }
+               s = b.String()
+               if s != tt.raw {
+                       t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
+               }
        }
 }