@@ -23,6 +23,7 @@ import (
23
23
"net"
24
24
"net/http"
25
25
"strings"
26
+ "sync"
26
27
27
28
"github.com/klauspost/compress/gzip"
28
29
"gopkg.in/macaron.v1"
@@ -42,6 +43,32 @@ type nopCloser struct {
42
43
43
44
func (nopCloser ) Close () error { return nil }
44
45
46
+ type WriterPool struct {
47
+ pool sync.Pool
48
+ }
49
+
50
+ func NewWriterPool () * WriterPool {
51
+ return & WriterPool {pool : sync.Pool {
52
+ New : func () interface {} { return nil },
53
+ }}
54
+ }
55
+
56
+ func (wp * WriterPool ) Get (rw macaron.ResponseWriter ) * gzip.Writer {
57
+ ret := wp .pool .Get ()
58
+ if ret == nil {
59
+ ret = gzip .NewWriter (rw )
60
+ } else {
61
+ ret .(* gzip.Writer ).Reset (rw )
62
+ }
63
+ return ret .(* gzip.Writer )
64
+ }
65
+
66
+ func (wp * WriterPool ) Put (w * gzip.Writer ) {
67
+ wp .pool .Put (w )
68
+ }
69
+
70
+ var writerPool WriterPool
71
+
45
72
/*
46
73
Gzip middleware inspired by https://github.com/go-macaron/gzip
47
74
@@ -97,7 +124,7 @@ func (grw *gzipResponseWriter) setup() {
97
124
headers := grw .Header ()
98
125
headers .Set (_HEADER_CONTENT_ENCODING , "gzip" )
99
126
headers .Set (_HEADER_VARY , _HEADER_ACCEPT_ENCODING )
100
- grw .w = gzip . NewWriter (grw .ResponseWriter )
127
+ grw .w = writerPool . Get (grw .ResponseWriter )
101
128
}
102
129
}
103
130
@@ -107,6 +134,12 @@ func (grw *gzipResponseWriter) close() {
107
134
return
108
135
}
109
136
grw .w .Close ()
137
+
138
+ if poolWriter , ok := grw .w .(* gzip.Writer ); ok {
139
+ writerPool .Put (poolWriter )
140
+ }
141
+
142
+ grw .w = nil
110
143
}
111
144
112
145
func (grw * gzipResponseWriter ) Write (p []byte ) (int , error ) {
0 commit comments