1- // Copyright 2016 The Gorilla WebSocket Authors. All rights reserved.
1+ // Copyright 2017 The Gorilla WebSocket Authors. All rights reserved.
22// Use of this source code is governed by a BSD-style
33// license that can be found in the LICENSE file.
44
@@ -9,6 +9,11 @@ import (
99 "errors"
1010 "io"
1111 "strings"
12+ "sync"
13+ )
14+
15+ var (
16+ flateWriterPool = sync.Pool {}
1217)
1318
1419func decompressNoContextTakeover (r io.Reader ) io.Reader {
@@ -17,13 +22,20 @@ func decompressNoContextTakeover(r io.Reader) io.Reader {
1722 "\x00 \x00 \xff \xff " +
1823 // Add final block to squelch unexpected EOF error from flate reader.
1924 "\x01 \x00 \x00 \xff \xff "
20-
2125 return flate .NewReader (io .MultiReader (r , strings .NewReader (tail )))
2226}
2327
2428func compressNoContextTakeover (w io.WriteCloser ) (io.WriteCloser , error ) {
2529 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+ }
2739 return & flateWrapper {fw : fw , tw : tw }, err
2840}
2941
@@ -69,11 +81,19 @@ type flateWrapper struct {
6981}
7082
7183func (w * flateWrapper ) Write (p []byte ) (int , error ) {
84+ if w .fw == nil {
85+ return 0 , errWriteClosed
86+ }
7287 return w .fw .Write (p )
7388}
7489
7590func (w * flateWrapper ) Close () error {
91+ if w .fw == nil {
92+ return errWriteClosed
93+ }
7694 err1 := w .fw .Flush ()
95+ flateWriterPool .Put (w .fw )
96+ w .fw = nil
7797 if w .tw .p != [4 ]byte {0 , 0 , 0xff , 0xff } {
7898 return errors .New ("websocket: internal error, unexpected bytes at end of flate stream" )
7999 }
0 commit comments