diff --git a/middleware/gzip.go b/middleware/gzip.go index 97dcefc..6259a02 100644 --- a/middleware/gzip.go +++ b/middleware/gzip.go @@ -4,10 +4,12 @@ import ( "compress/gzip" "github.com/gin-gonic/gin" "net/http" + "strings" ) func GzipMiddleware() gin.HandlerFunc { return func(c *gin.Context) { + // 1. 处理请求解压 if c.Request.Header.Get("Content-Encoding") == "gzip" { gzReader, err := gzip.NewReader(c.Request.Body) if err != nil { @@ -17,6 +19,39 @@ func GzipMiddleware() gin.HandlerFunc { defer gzReader.Close() c.Request.Body = gzReader } + + // 2. 设置响应压缩支持 + if strings.Contains(c.Request.Header.Get("Accept-Encoding"), "gzip") { + // 创建gzip writer + gzWriter := gzip.NewWriter(c.Writer) + defer gzWriter.Close() + + // 替换原始writer为压缩writer + originalWriter := c.Writer + c.Writer = &gzipResponseWriter{ + ResponseWriter: originalWriter, + gzWriter: gzWriter, + } + + // 设置响应头 + c.Header("Content-Encoding", "gzip") + c.Header("Vary", "Accept-Encoding") + } + c.Next() } } + +// 自定义ResponseWriter实现gzip压缩 +type gzipResponseWriter struct { + gin.ResponseWriter + gzWriter *gzip.Writer +} + +func (w *gzipResponseWriter) Write(data []byte) (int, error) { + return w.gzWriter.Write(data) +} + +func (w *gzipResponseWriter) WriteString(s string) (int, error) { + return w.gzWriter.Write([]byte(s)) +}