/
mw_copy_body.go
51 lines (42 loc) · 1.06 KB
/
mw_copy_body.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package middleware
import (
"bytes"
"compress/gzip"
"io"
"io/ioutil"
"net/http"
"github.com/gin-gonic/gin"
"github.com/ops-cn/go-devops/common/config"
"github.com/ops-cn/go-devops/common/ginplus"
)
// CopyBodyMiddleware Copy body
func CopyBodyMiddleware(skippers ...SkipperFunc) gin.HandlerFunc {
var maxMemory int64 = 64 << 20 // 64 MB
if v := config.C.HTTP.MaxContentLength; v > 0 {
maxMemory = v
}
return func(c *gin.Context) {
if SkipHandler(c, skippers...) || c.Request.Body == nil {
c.Next()
return
}
var requestBody []byte
isGzip := false
safe := &io.LimitedReader{R: c.Request.Body, N: maxMemory}
if c.GetHeader("Content-Encoding") == "gzip" {
reader, err := gzip.NewReader(safe)
if err == nil {
isGzip = true
requestBody, _ = ioutil.ReadAll(reader)
}
}
if !isGzip {
requestBody, _ = ioutil.ReadAll(safe)
}
c.Request.Body.Close()
bf := bytes.NewBuffer(requestBody)
c.Request.Body = http.MaxBytesReader(c.Writer, ioutil.NopCloser(bf), maxMemory)
c.Set(ginplus.ReqBodyKey, requestBody)
c.Next()
}
}