in flexzlib/reader.go [128:160]
func (z *Reader) Reset(r io.Reader, dict []byte) error {
z.SwapReader(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 = flexflate.NewReaderDict(z.r, dict)
} else {
z.decompressor = flexflate.NewReader(z.r)
}
} else {
z.decompressor.(flexflate.Resetter).Reset(z.r, dict)
}
z.digest = adler32.New()
return nil
}