1
1
package middleware
2
2
3
3
import (
4
- "bytes"
5
4
"compress/gzip"
6
5
"io"
7
- "io/ioutil"
8
6
"net/http"
9
7
"sync"
10
8
@@ -43,26 +41,7 @@ type DefaultGzipDecompressPool struct {
43
41
}
44
42
45
43
func (d * DefaultGzipDecompressPool ) gzipDecompressPool () sync.Pool {
46
- return sync.Pool {
47
- New : func () interface {} {
48
- // create with an empty reader (but with GZIP header)
49
- w , err := gzip .NewWriterLevel (ioutil .Discard , gzip .BestSpeed )
50
- if err != nil {
51
- return err
52
- }
53
-
54
- b := new (bytes.Buffer )
55
- w .Reset (b )
56
- w .Flush ()
57
- w .Close ()
58
-
59
- r , err := gzip .NewReader (bytes .NewReader (b .Bytes ()))
60
- if err != nil {
61
- return err
62
- }
63
- return r
64
- },
65
- }
44
+ return sync.Pool {New : func () interface {} { return new (gzip.Reader ) }}
66
45
}
67
46
68
47
//Decompress decompresses request body based if content encoding type is set to "gzip" with default config
@@ -82,6 +61,7 @@ func DecompressWithConfig(config DecompressConfig) echo.MiddlewareFunc {
82
61
83
62
return func (next echo.HandlerFunc ) echo.HandlerFunc {
84
63
pool := config .GzipDecompressPool .gzipDecompressPool ()
64
+
85
65
return func (c echo.Context ) error {
86
66
if config .Skipper (c ) {
87
67
return next (c )
@@ -93,13 +73,13 @@ func DecompressWithConfig(config DecompressConfig) echo.MiddlewareFunc {
93
73
94
74
i := pool .Get ()
95
75
gr , ok := i .(* gzip.Reader )
96
- if ! ok {
76
+ if ! ok || gr == nil {
97
77
return echo .NewHTTPError (http .StatusInternalServerError , i .(error ).Error ())
98
78
}
99
79
defer pool .Put (gr )
100
- defer gr .Close ()
101
80
102
81
b := c .Request ().Body
82
+ defer b .Close ()
103
83
104
84
if err := gr .Reset (b ); err != nil {
105
85
if err == io .EOF { //ignore if body is empty
@@ -108,11 +88,12 @@ func DecompressWithConfig(config DecompressConfig) echo.MiddlewareFunc {
108
88
return err
109
89
}
110
90
111
- defer b .Close ()
91
+ // only Close gzip reader if it was set to a proper gzip source otherwise it will panic on close.
92
+ defer gr .Close ()
93
+
112
94
c .Request ().Body = gr
113
95
114
96
return next (c )
115
97
}
116
-
117
98
}
118
99
}
0 commit comments