package middleware import ( "compress/gzip" "io" "strings" "sync" "github.com/gin-gonic/gin" ) var gzipPool = sync.Pool{ New: func() any { w, _ := gzip.NewWriterLevel(io.Discard, gzip.DefaultCompression) return w }, } type gzipWriter struct { gin.ResponseWriter writer *gzip.Writer } func (g *gzipWriter) Write(data []byte) (int, error) { return g.writer.Write(data) } func Compression() gin.HandlerFunc { return func(c *gin.Context) { if !strings.Contains(c.Request.Header.Get("Accept-Encoding"), "gzip") { c.Next() return } // Skip compression for small responses or streaming if c.Request.Method == "HEAD" || c.Request.URL.Path == "/api/v1/health/liveness" { c.Next() return } gz := gzipPool.Get().(*gzip.Writer) defer gzipPool.Put(gz) gz.Reset(c.Writer) defer gz.Close() c.Header("Content-Encoding", "gzip") c.Header("Vary", "Accept-Encoding") c.Writer = &gzipWriter{ResponseWriter: c.Writer, writer: gz} c.Next() } }