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  }