package zlib import ( "compress/flate" "compress/zlib" "io" ) type Reader interface { io.ReadCloser zlib.Resetter } func zlibStreamer(r flate.Reader) (Reader, error) { // verify header h := make([]byte, 2) if _, err := io.ReadFull(r, h); err != nil { return nil, err } // verify header if err := verifyHeader(h); err != nil { return nil, err } return flate.NewReader(r).(Reader), nil } // https://golang.org/src/compress/zlib/reader.go#L35 const zlibDeflate = 8 func verifyHeader(scratch []byte) error { h := uint(scratch[0])<<8 | uint(scratch[1]) if (scratch[0]&0x0f != zlibDeflate) || (h%31 != 0) { return zlib.ErrHeader } return nil }