gzip.go 874 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package middleware
  2. import (
  3. "compress/gzip"
  4. "github.com/andybalholm/brotli"
  5. "github.com/gin-gonic/gin"
  6. "io"
  7. "net/http"
  8. )
  9. func DecompressRequestMiddleware() gin.HandlerFunc {
  10. return func(c *gin.Context) {
  11. if c.Request.Body == nil || c.Request.Method == http.MethodGet {
  12. c.Next()
  13. return
  14. }
  15. switch c.GetHeader("Content-Encoding") {
  16. case "gzip":
  17. gzipReader, err := gzip.NewReader(c.Request.Body)
  18. if err != nil {
  19. c.AbortWithStatus(http.StatusBadRequest)
  20. return
  21. }
  22. defer gzipReader.Close()
  23. // Replace the request body with the decompressed data
  24. c.Request.Body = io.NopCloser(gzipReader)
  25. c.Request.Header.Del("Content-Encoding")
  26. case "br":
  27. reader := brotli.NewReader(c.Request.Body)
  28. c.Request.Body = io.NopCloser(reader)
  29. c.Request.Header.Del("Content-Encoding")
  30. }
  31. // Continue processing the request
  32. c.Next()
  33. }
  34. }