func TestWithCompressorDeflateConcrete(t *testing.T) { testWithCompressorConcrete(t, httputil.CompressDeflate, func(r io.Reader) string { fr := flate.NewReader(r) defer fr.Close() var un = make([]byte, 1024) fr.Read(un) return string(un) }) }
func init() { registerEncoder(FormatFlate, "kp", func(w io.Writer, lvl int) io.WriteCloser { zw, err := flate.NewWriter(w, lvl) if err != nil { panic(err) } return zw }) registerDecoder(FormatFlate, "kp", func(r io.Reader) io.ReadCloser { return flate.NewReader(r) }) }
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 }
func (z *Reader) readHeader(save bool) error { _, err := io.ReadFull(z.r, z.buf[0:10]) if err != nil { return err } if z.buf[0] != gzipID1 || z.buf[1] != gzipID2 || z.buf[2] != gzipDeflate { return ErrHeader } z.flg = z.buf[3] if save { z.ModTime = time.Unix(int64(get4(z.buf[4:8])), 0) // z.buf[8] is xfl, ignored z.OS = z.buf[9] } z.digest.Reset() z.digest.Write(z.buf[0:10]) if z.flg&flagExtra != 0 { n, err := z.read2() if err != nil { return err } data := make([]byte, n) if _, err = io.ReadFull(z.r, data); err != nil { return err } if save { z.Extra = data } } var s string if z.flg&flagName != 0 { if s, err = z.readString(); err != nil { return err } if save { z.Name = s } } if z.flg&flagComment != 0 { if s, err = z.readString(); err != nil { return err } if save { z.Comment = s } } if z.flg&flagHdrCrc != 0 { n, err := z.read2() if err != nil { return err } sum := z.digest.Sum32() & 0xFFFF if n != sum { return ErrHeader } } z.digest.Reset() if z.decompressor == nil { z.decompressor = flate.NewReader(z.r) } else { z.decompressor.(flate.Resetter).Reset(z.r, nil) } return nil }
// readHeader reads the GZIP header according to section 2.3.1. // This method does not set z.err. func (z *Reader) readHeader() (hdr Header, err error) { if _, err = io.ReadFull(z.r, z.buf[:10]); err != nil { // RFC 1952, section 2.2, says the following: // A gzip file consists of a series of "members" (compressed data sets). // // Other than this, the specification does not clarify whether a // "series" is defined as "one or more" or "zero or more". To err on the // side of caution, Go interprets this to mean "zero or more". // Thus, it is okay to return io.EOF here. return hdr, err } if z.buf[0] != gzipID1 || z.buf[1] != gzipID2 || z.buf[2] != gzipDeflate { return hdr, ErrHeader } flg := z.buf[3] hdr.ModTime = time.Unix(int64(le.Uint32(z.buf[4:8])), 0) // z.buf[8] is XFL and is currently ignored. hdr.OS = z.buf[9] z.digest = crc32.ChecksumIEEE(z.buf[:10]) if flg&flagExtra != 0 { if _, err = io.ReadFull(z.r, z.buf[:2]); err != nil { return hdr, noEOF(err) } z.digest = crc32.Update(z.digest, crc32.IEEETable, z.buf[:2]) data := make([]byte, le.Uint16(z.buf[:2])) if _, err = io.ReadFull(z.r, data); err != nil { return hdr, noEOF(err) } z.digest = crc32.Update(z.digest, crc32.IEEETable, data) hdr.Extra = data } var s string if flg&flagName != 0 { if s, err = z.readString(); err != nil { return hdr, err } hdr.Name = s } if flg&flagComment != 0 { if s, err = z.readString(); err != nil { return hdr, err } hdr.Comment = s } if flg&flagHdrCrc != 0 { if _, err = io.ReadFull(z.r, z.buf[:2]); err != nil { return hdr, noEOF(err) } digest := le.Uint16(z.buf[:2]) if digest != uint16(z.digest) { return hdr, ErrHeader } } z.digest = 0 if z.decompressor == nil { z.decompressor = flate.NewReader(z.r) } else { z.decompressor.(flate.Resetter).Reset(z.r, nil) } return hdr, nil }