| package middleware | |
| import ( | |
| "compress/gzip" | |
| "io" | |
| "net/http" | |
| "github.com/andybalholm/brotli" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| func DecompressRequestMiddleware() gin.HandlerFunc { | |
| return func(c *gin.Context) { | |
| if c.Request.Body == nil || c.Request.Method == http.MethodGet { | |
| c.Next() | |
| return | |
| } | |
| switch c.GetHeader("Content-Encoding") { | |
| case "gzip": | |
| gzipReader, err := gzip.NewReader(c.Request.Body) | |
| if err != nil { | |
| c.AbortWithStatus(http.StatusBadRequest) | |
| return | |
| } | |
| defer gzipReader.Close() | |
| // Replace the request body with the decompressed data | |
| c.Request.Body = io.NopCloser(gzipReader) | |
| c.Request.Header.Del("Content-Encoding") | |
| case "br": | |
| reader := brotli.NewReader(c.Request.Body) | |
| c.Request.Body = io.NopCloser(reader) | |
| c.Request.Header.Del("Content-Encoding") | |
| } | |
| // Continue processing the request | |
| c.Next() | |
| } | |
| } | |