MCPcopy
hub / github.com/fish2018/pansou / GzipMiddleware

Function GzipMiddleware

util/compression.go:35–81  ·  view source on GitHub ↗

GzipMiddleware 返回一个Gin中间件,用于压缩HTTP响应

()

Source from the content-addressed store, hash-verified

33
34// GzipMiddleware 返回一个Gin中间件,用于压缩HTTP响应
35func GzipMiddleware() gin.HandlerFunc {
36 return func(c *gin.Context) {
37 // 如果未启用压缩,直接跳过
38 if !config.AppConfig.EnableCompression {
39 c.Next()
40 return
41 }
42
43 // 检查客户端是否支持gzip
44 if !strings.Contains(c.Request.Header.Get("Accept-Encoding"), "gzip") {
45 c.Next()
46 return
47 }
48
49 // 创建一个缓冲响应写入器
50 buffer := &bytes.Buffer{}
51 blw := &bodyLogWriter{body: buffer, ResponseWriter: c.Writer}
52 c.Writer = blw
53
54 // 处理请求
55 c.Next()
56
57 // 获取响应内容
58 responseData := buffer.Bytes()
59
60 // 如果响应大小小于最小压缩大小,直接返回原始内容
61 if len(responseData) < config.AppConfig.MinSizeToCompress {
62 c.Writer.Write(responseData)
63 return
64 }
65
66 // 设置gzip响应头
67 c.Header("Content-Encoding", "gzip")
68 c.Header("Vary", "Accept-Encoding")
69
70 // 创建gzip写入器
71 gz, err := gzip.NewWriterLevel(c.Writer, gzip.BestSpeed)
72 if err != nil {
73 c.Writer.Write(responseData)
74 return
75 }
76 defer gz.Close()
77
78 // 写入压缩内容
79 gz.Write(responseData)
80 }
81}
82
83// bodyLogWriter 是一个用于记录响应体的写入器
84type bodyLogWriter struct {

Callers 1

SetupRouterFunction · 0.92

Calls 3

GetMethod · 0.45
WriteMethod · 0.45
CloseMethod · 0.45

Tested by

no test coverage detected