@@ -40,34 +40,34 @@ type WriteFlusher interface {
40
40
}
41
41
42
42
type CompressResponseWriter struct {
43
- Header * BufferedServerHeader
43
+ Header * BufferedServerHeader
44
44
ControllerResponse * Response
45
- OriginalWriter io.Writer
46
- compressWriter WriteFlusher
47
- compressionType string
48
- headersWritten bool
49
- closeNotify chan bool
50
- parentNotify <- chan bool
51
- closed bool
45
+ OriginalWriter io.Writer
46
+ compressWriter WriteFlusher
47
+ compressionType string
48
+ headersWritten bool
49
+ closeNotify chan bool
50
+ parentNotify <- chan bool
51
+ closed bool
52
52
}
53
53
54
54
// CompressFilter does compression of response body in gzip/deflate if
55
55
// `results.compressed=true` in the app.conf
56
56
func CompressFilter (c * Controller , fc []Filter ) {
57
- if c .Response .ServerHeader != nil && Config .BoolDefault ("results.compressed" , false ) {
57
+ if c .Response .ServerHeader != nil && Config .BoolDefault ("results.compressed" , false ) {
58
58
if c .Response .Status != http .StatusNoContent && c .Response .Status != http .StatusNotModified {
59
59
if found , compressType , compressWriter := detectCompressionType (c .Request , c .Response ); found {
60
60
writer := CompressResponseWriter {
61
- ControllerResponse :c .Response ,
62
- OriginalWriter : c .Response .GetWriter (),
63
- compressWriter : compressWriter ,
64
- compressionType : compressType ,
65
- headersWritten : false ,
66
- closeNotify : make (chan bool , 1 ),
67
- closed : false }
68
- // Swap out the header with our own
69
- writer .Header = NewBufferedServerHeader (c .Response .ServerHeader )
70
- c .Response .ServerHeader = writer .Header
61
+ ControllerResponse : c .Response ,
62
+ OriginalWriter : c .Response .GetWriter (),
63
+ compressWriter : compressWriter ,
64
+ compressionType : compressType ,
65
+ headersWritten : false ,
66
+ closeNotify : make (chan bool , 1 ),
67
+ closed : false }
68
+ // Swap out the header with our own
69
+ writer .Header = NewBufferedServerHeader (c .Response .ServerHeader )
70
+ c .Response .ServerHeader = writer .Header
71
71
if w , ok := c .Response .GetWriter ().(http.CloseNotifier ); ok {
72
72
writer .parentNotify = w .CloseNotify ()
73
73
}
@@ -109,7 +109,7 @@ func (c *CompressResponseWriter) prepareHeaders() {
109
109
c .compressionType = ""
110
110
}
111
111
}
112
- c .Header .Release ()
112
+ c .Header .Release ()
113
113
}
114
114
115
115
func (c * CompressResponseWriter ) WriteHeader (status int ) {
@@ -119,14 +119,14 @@ func (c *CompressResponseWriter) WriteHeader(status int) {
119
119
}
120
120
121
121
func (c * CompressResponseWriter ) Close () error {
122
- if ! c .headersWritten {
123
- c .prepareHeaders ()
124
- }
125
- if c .compressionType != "" {
126
- c .Header .Del ("Content-Length" )
122
+ if ! c .headersWritten {
123
+ c .prepareHeaders ()
124
+ }
125
+ if c .compressionType != "" {
126
+ c .Header .Del ("Content-Length" )
127
127
if err := c .compressWriter .Close (); err != nil {
128
- // TODO When writing directly to stream, an error will be generated
129
- ERROR .Println ("Error closing compress writer" ,c .compressionType , err )
128
+ // TODO When writing directly to stream, an error will be generated
129
+ ERROR .Println ("Error closing compress writer" , c .compressionType , err )
130
130
}
131
131
132
132
}
@@ -247,84 +247,84 @@ func detectCompressionType(req *Request, resp *Response) (found bool, compressio
247
247
return
248
248
}
249
249
250
-
251
250
// This class will not send content out until the Released is called, from that point on it will act normally
252
251
// It implements all the ServerHeader
253
252
type BufferedServerHeader struct {
254
- cookieList []string
255
- headerMap map [string ][]string
256
- status int
257
- released bool
258
- original ServerHeader
253
+ cookieList []string
254
+ headerMap map [string ][]string
255
+ status int
256
+ released bool
257
+ original ServerHeader
259
258
}
259
+
260
260
func NewBufferedServerHeader (o ServerHeader ) * BufferedServerHeader {
261
- return & BufferedServerHeader {original :o , headerMap :map [string ][]string {}}
261
+ return & BufferedServerHeader {original : o , headerMap : map [string ][]string {}}
262
262
}
263
263
func (bsh * BufferedServerHeader ) SetCookie (cookie string ) {
264
- if bsh .released {
265
- bsh .original .SetCookie (cookie )
266
- } else {
267
- bsh .cookieList = append (bsh .cookieList ,cookie )
268
- }
264
+ if bsh .released {
265
+ bsh .original .SetCookie (cookie )
266
+ } else {
267
+ bsh .cookieList = append (bsh .cookieList , cookie )
268
+ }
269
269
}
270
270
func (bsh * BufferedServerHeader ) GetCookie (key string ) (value ServerCookie , err error ) {
271
- return bsh .original .GetCookie (key )
271
+ return bsh .original .GetCookie (key )
272
272
}
273
- func (bsh * BufferedServerHeader ) Set (key string , value string ){
274
- if bsh .released {
275
- bsh .original .Set (key ,value )
276
- } else {
277
- bsh .headerMap [key ]= []string {value }
278
- }
273
+ func (bsh * BufferedServerHeader ) Set (key string , value string ) {
274
+ if bsh .released {
275
+ bsh .original .Set (key , value )
276
+ } else {
277
+ bsh .headerMap [key ] = []string {value }
278
+ }
279
279
}
280
280
func (bsh * BufferedServerHeader ) Add (key string , value string ) {
281
- if bsh .released {
282
- bsh .original .Set (key ,value )
283
- } else {
284
- old := []string {}
285
- if v ,found := bsh .headerMap [key ];found {
286
- old = v
287
- }
288
- bsh .headerMap [key ]= append (old ,value )
289
- }
281
+ if bsh .released {
282
+ bsh .original .Set (key , value )
283
+ } else {
284
+ old := []string {}
285
+ if v , found := bsh .headerMap [key ]; found {
286
+ old = v
287
+ }
288
+ bsh .headerMap [key ] = append (old , value )
289
+ }
290
290
291
291
}
292
- func (bsh * BufferedServerHeader ) Del (key string ){
293
- if bsh .released {
294
- bsh .original .Del (key )
295
- } else {
296
- delete (bsh .headerMap ,key )
297
- }
292
+ func (bsh * BufferedServerHeader ) Del (key string ) {
293
+ if bsh .released {
294
+ bsh .original .Del (key )
295
+ } else {
296
+ delete (bsh .headerMap , key )
297
+ }
298
298
299
299
}
300
- func (bsh * BufferedServerHeader ) Get (key string ) (value string ){
301
- if bsh .released {
302
- value = bsh .original .Get (key )
303
- } else {
304
- if v ,found := bsh .headerMap [key ]; found && len (v )> 0 {
305
- value = v [0 ]
306
- } else {
307
- value = bsh .original .Get (key )
308
- }
309
- }
310
- return
300
+ func (bsh * BufferedServerHeader ) Get (key string ) (value string ) {
301
+ if bsh .released {
302
+ value = bsh .original .Get (key )
303
+ } else {
304
+ if v , found := bsh .headerMap [key ]; found && len (v ) > 0 {
305
+ value = v [0 ]
306
+ } else {
307
+ value = bsh .original .Get (key )
308
+ }
309
+ }
310
+ return
311
311
}
312
312
func (bsh * BufferedServerHeader ) SetStatus (statusCode int ) {
313
- if bsh .released {
314
- bsh .original .SetStatus (statusCode )
315
- } else {
316
- bsh .status = statusCode
317
- }
313
+ if bsh .released {
314
+ bsh .original .SetStatus (statusCode )
315
+ } else {
316
+ bsh .status = statusCode
317
+ }
318
318
}
319
319
func (bsh * BufferedServerHeader ) Release () {
320
- bsh .released = true
321
- bsh .original .SetStatus (bsh .status )
322
- for k ,v := range bsh .headerMap {
323
- for _ ,r := range v {
324
- bsh .original .Set (k , r )
325
- }
326
- }
327
- for _ ,c := range bsh .cookieList {
328
- bsh .original .SetCookie (c )
329
- }
320
+ bsh .released = true
321
+ bsh .original .SetStatus (bsh .status )
322
+ for k , v := range bsh .headerMap {
323
+ for _ , r := range v {
324
+ bsh .original .Set (k , r )
325
+ }
326
+ }
327
+ for _ , c := range bsh .cookieList {
328
+ bsh .original .SetCookie (c )
329
+ }
330
330
}
0 commit comments