33package websocket
44
55import (
6- "compress/flate"
6+ "strconv"
7+
8+ "github.com/klauspost/compress/flate"
9+
710 "io"
811 "sync"
912)
@@ -53,12 +56,18 @@ func (m CompressionMode) opts() *compressionOptions {
5356 return & compressionOptions {
5457 clientNoContextTakeover : m == CompressionNoContextTakeover ,
5558 serverNoContextTakeover : m == CompressionNoContextTakeover ,
59+
60+ serverMaxWindowBits : 0 ,
61+ clientMaxWindowBits : 0 ,
5662 }
5763}
5864
5965type compressionOptions struct {
6066 clientNoContextTakeover bool
6167 serverNoContextTakeover bool
68+
69+ serverMaxWindowBits int
70+ clientMaxWindowBits int
6271}
6372
6473func (copts * compressionOptions ) String () string {
@@ -69,6 +78,11 @@ func (copts *compressionOptions) String() string {
6978 if copts .serverNoContextTakeover {
7079 s += "; server_no_context_takeover"
7180 }
81+
82+ if copts .clientMaxWindowBits != 0 {
83+ s += "; client_max_window_bits=" + strconv .Itoa (copts .clientMaxWindowBits )
84+ }
85+
7286 return s
7387}
7488
@@ -147,20 +161,24 @@ func putFlateReader(fr io.Reader) {
147161 flateReaderPool .Put (fr )
148162}
149163
150- var flateWriterPool sync.Pool
164+ var flateWriterPool [ 16 ] sync.Pool
151165
152- func getFlateWriter (w io.Writer ) * flate.Writer {
153- fw , ok := flateWriterPool .Get ().(* flate.Writer )
166+ func getFlateWriter (w io.Writer , bits int ) * flate.Writer {
167+ fw , ok := flateWriterPool [ bits ] .Get ().(* flate.Writer )
154168 if ! ok {
155- fw , _ = flate .NewWriter (w , flate .BestSpeed )
169+ if bits == 0 {
170+ fw , _ = flate .NewWriter (w , flate .BestCompression )
171+ } else {
172+ fw , _ = flate .NewWriterWindow (w , 1 << bits )
173+ }
156174 return fw
157175 }
158176 fw .Reset (w )
159177 return fw
160178}
161179
162- func putFlateWriter (w * flate.Writer ) {
163- flateWriterPool .Put (w )
180+ func putFlateWriter (w * flate.Writer , bits int ) {
181+ flateWriterPool [ bits ] .Put (w )
164182}
165183
166184type slidingWindow struct {
0 commit comments