@@ -12,12 +12,15 @@ import (
12
12
"sync"
13
13
)
14
14
15
+ const (
16
+ minCompressionLevel = flate .HuffmanOnly
17
+ maxCompressionLevel = flate .BestCompression
18
+ defaultCompressionLevel = 1
19
+ )
20
+
15
21
var (
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 {} {
21
24
return flate .NewReader (nil )
22
25
}}
23
26
)
@@ -34,11 +37,20 @@ func decompressNoContextTakeover(r io.Reader) io.ReadCloser {
34
37
return & flateReadWrapper {fr }
35
38
}
36
39
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 ]
38
46
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 }
42
54
}
43
55
44
56
// 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) {
80
92
type flateWriteWrapper struct {
81
93
fw * flate.Writer
82
94
tw * truncWriter
95
+ p * sync.Pool
83
96
}
84
97
85
98
func (w * flateWriteWrapper ) Write (p []byte ) (int , error ) {
@@ -94,7 +107,7 @@ func (w *flateWriteWrapper) Close() error {
94
107
return errWriteClosed
95
108
}
96
109
err1 := w .fw .Flush ()
97
- flateWriterPool .Put (w .fw )
110
+ w . p .Put (w .fw )
98
111
w .fw = nil
99
112
if w .tw .p != [4 ]byte {0 , 0 , 0xff , 0xff } {
100
113
return errors .New ("websocket: internal error, unexpected bytes at end of flate stream" )
0 commit comments