github.com/diamondburned/arikawa/v2@v2.1.0/internal/zlib/flate.go (about) 1 package zlib 2 3 import ( 4 "compress/flate" 5 "compress/zlib" 6 "io" 7 ) 8 9 type Reader interface { 10 io.ReadCloser 11 zlib.Resetter 12 } 13 14 func zlibStreamer(r flate.Reader) (Reader, error) { 15 // verify header 16 h := make([]byte, 2) 17 18 if _, err := io.ReadFull(r, h); err != nil { 19 return nil, err 20 } 21 22 // verify header 23 if err := verifyHeader(h); err != nil { 24 return nil, err 25 } 26 27 return flate.NewReader(r).(Reader), nil 28 } 29 30 // https://golang.org/src/compress/zlib/reader.go#L35 31 const zlibDeflate = 8 32 33 func verifyHeader(scratch []byte) error { 34 h := uint(scratch[0])<<8 | uint(scratch[1]) 35 if (scratch[0]&0x0f != zlibDeflate) || (h%31 != 0) { 36 return zlib.ErrHeader 37 } 38 return nil 39 }