@@ -12,12 +12,15 @@ import (
1212 "sync"
1313)
1414
15+ const (
16+ minCompressionLevel = flate .HuffmanOnly
17+ maxCompressionLevel = flate .BestCompression
18+ defaultCompressionLevel = 1
19+ )
20+
1521var (
16- flateWriterPool = sync.Pool {New : func () interface {} {
17- fw , _ := flate .NewWriter (nil , 3 )
18- return fw
19- }}
20- flateReaderPool = sync.Pool {New : func () interface {} {
22+ flateWriterPools [maxCompressionLevel - minCompressionLevel ]sync.Pool
23+ flateReaderPool = sync.Pool {New : func () interface {} {
2124 return flate .NewReader (nil )
2225 }}
2326)
@@ -34,11 +37,20 @@ func decompressNoContextTakeover(r io.Reader) io.ReadCloser {
3437 return & flateReadWrapper {fr }
3538}
3639
37- func compressNoContextTakeover (w io.WriteCloser ) io.WriteCloser {
40+ func isValidCompressionLevel (level int ) bool {
41+ return minCompressionLevel <= level && level <= maxCompressionLevel
42+ }
43+
44+ func compressNoContextTakeover (w io.WriteCloser , level int ) io.WriteCloser {
45+ p := & flateWriterPools [level - minCompressionLevel ]
3846 tw := & truncWriter {w : w }
39- fw , _ := flateWriterPool .Get ().(* flate.Writer )
40- fw .Reset (tw )
41- return & flateWriteWrapper {fw : fw , tw : tw }
47+ fw , _ := p .Get ().(* flate.Writer )
48+ if fw == nil {
49+ fw , _ = flate .NewWriter (tw , level )
50+ } else {
51+ fw .Reset (tw )
52+ }
53+ return & flateWriteWrapper {fw : fw , tw : tw , p : p }
4254}
4355
4456// truncWriter is an io.Writer that writes all but the last four bytes of the
@@ -80,6 +92,7 @@ func (w *truncWriter) Write(p []byte) (int, error) {
8092type flateWriteWrapper struct {
8193 fw * flate.Writer
8294 tw * truncWriter
95+ p * sync.Pool
8396}
8497
8598func (w * flateWriteWrapper ) Write (p []byte ) (int , error ) {
@@ -94,7 +107,7 @@ func (w *flateWriteWrapper) Close() error {
94107 return errWriteClosed
95108 }
96109 err1 := w .fw .Flush ()
97- flateWriterPool .Put (w .fw )
110+ w . p .Put (w .fw )
98111 w .fw = nil
99112 if w .tw .p != [4 ]byte {0 , 0 , 0xff , 0xff } {
100113 return errors .New ("websocket: internal error, unexpected bytes at end of flate stream" )
0 commit comments