1
- // Copyright 2016 The Gorilla WebSocket Authors. All rights reserved.
1
+ // Copyright 2017 The Gorilla WebSocket Authors. All rights reserved.
2
2
// Use of this source code is governed by a BSD-style
3
3
// license that can be found in the LICENSE file.
4
4
@@ -9,6 +9,11 @@ import (
9
9
"errors"
10
10
"io"
11
11
"strings"
12
+ "sync"
13
+ )
14
+
15
+ var (
16
+ flateWriterPool = sync.Pool {}
12
17
)
13
18
14
19
func decompressNoContextTakeover (r io.Reader ) io.Reader {
@@ -17,13 +22,20 @@ func decompressNoContextTakeover(r io.Reader) io.Reader {
17
22
"\x00 \x00 \xff \xff " +
18
23
// Add final block to squelch unexpected EOF error from flate reader.
19
24
"\x01 \x00 \x00 \xff \xff "
20
-
21
25
return flate .NewReader (io .MultiReader (r , strings .NewReader (tail )))
22
26
}
23
27
24
28
func compressNoContextTakeover (w io.WriteCloser ) (io.WriteCloser , error ) {
25
29
tw := & truncWriter {w : w }
26
- fw , err := flate .NewWriter (tw , 3 )
30
+ i := flateWriterPool .Get ()
31
+ var fw * flate.Writer
32
+ var err error
33
+ if i == nil {
34
+ fw , err = flate .NewWriter (tw , 3 )
35
+ } else {
36
+ fw = i .(* flate.Writer )
37
+ fw .Reset (tw )
38
+ }
27
39
return & flateWrapper {fw : fw , tw : tw }, err
28
40
}
29
41
@@ -69,11 +81,19 @@ type flateWrapper struct {
69
81
}
70
82
71
83
func (w * flateWrapper ) Write (p []byte ) (int , error ) {
84
+ if w .fw == nil {
85
+ return 0 , errWriteClosed
86
+ }
72
87
return w .fw .Write (p )
73
88
}
74
89
75
90
func (w * flateWrapper ) Close () error {
91
+ if w .fw == nil {
92
+ return errWriteClosed
93
+ }
76
94
err1 := w .fw .Flush ()
95
+ flateWriterPool .Put (w .fw )
96
+ w .fw = nil
77
97
if w .tw .p != [4 ]byte {0 , 0 , 0xff , 0xff } {
78
98
return errors .New ("websocket: internal error, unexpected bytes at end of flate stream" )
79
99
}
0 commit comments