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