func (z *reader) Reset(r io.Reader, dict []byte) error { *z = reader{decompressor: z.decompressor} if fr, ok := r.(flate.Reader); ok { z.r = fr } else { z.r = bufio.NewReader(r) } // Read the header (RFC 1950 section 2.2.). _, z.err = io.ReadFull(z.r, z.scratch[0:2]) if z.err != nil { if z.err == io.EOF { z.err = io.ErrUnexpectedEOF } return z.err } h := uint(z.scratch[0])<<8 | uint(z.scratch[1]) if (z.scratch[0]&0x0f != zlibDeflate) || (h%31 != 0) { z.err = ErrHeader return z.err } haveDict := z.scratch[1]&0x20 != 0 if haveDict { _, z.err = io.ReadFull(z.r, z.scratch[0:4]) if z.err != nil { if z.err == io.EOF { z.err = io.ErrUnexpectedEOF } return z.err } checksum := uint32(z.scratch[0])<<24 | uint32(z.scratch[1])<<16 | uint32(z.scratch[2])<<8 | uint32(z.scratch[3]) if checksum != adler32.Checksum(dict) { z.err = ErrDictionary return z.err } } if z.decompressor == nil { if haveDict { z.decompressor = flate.NewReaderDict(z.r, dict) } else { z.decompressor = flate.NewReader(z.r) } } else { z.decompressor.(flate.Resetter).Reset(z.r, dict) } z.digest = adler32.New() return nil }
func (z *reader) Reset(r io.Reader, dict []byte) error { if fr, ok := r.(flate.Reader); ok { z.r = fr } else { z.r = bufio.NewReader(r) } _, err := io.ReadFull(z.r, z.scratch[0:2]) if err != nil { return err } h := uint(z.scratch[0])<<8 | uint(z.scratch[1]) if (z.scratch[0]&0x0f != zlibDeflate) || (h%31 != 0) { return ErrHeader } haveDict := z.scratch[1]&0x20 != 0 if haveDict { _, err = io.ReadFull(z.r, z.scratch[0:4]) if err != nil { return err } checksum := uint32(z.scratch[0])<<24 | uint32(z.scratch[1])<<16 | uint32(z.scratch[2])<<8 | uint32(z.scratch[3]) if checksum != adler32.Checksum(dict) { return ErrDictionary } } if z.decompressor == nil { if haveDict { z.decompressor = flate.NewReaderDict(z.r, dict) } else { z.decompressor = flate.NewReader(z.r) } } else { z.decompressor.(flate.Resetter).Reset(z.r, dict) } z.digest = adler32.New() return nil }