package middleware import ( "net/http" ) // Middleware 中间件接口 type Middleware interface { ServeHTTP(http.ResponseWriter, *http.Request, http.HandlerFunc) } // Chain 中间件链 type Chain struct { middlewares []Middleware } // NewChain 创建新的中间件链 func NewChain(middlewares ...Middleware) *Chain { return &Chain{ middlewares: middlewares, } } // Then 将中间件链应用到处理器 func (c *Chain) Then(h http.Handler) http.Handler { if h == nil { h = http.DefaultServeMux } for i := len(c.middlewares) - 1; i >= 0; i-- { h = c.wrap(h, c.middlewares[i]) } return h } // wrap 包装处理器 func (c *Chain) wrap(h http.Handler, m Middleware) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { m.ServeHTTP(w, r, h.ServeHTTP) }) } // Add 添加中间件 func (c *Chain) Add(middlewares ...Middleware) *Chain { c.middlewares = append(c.middlewares, middlewares...) return c } // Remove 移除中间件 func (c *Chain) Remove(index int) *Chain { if index < 0 || index >= len(c.middlewares) { return c } c.middlewares = append(c.middlewares[:index], c.middlewares[index+1:]...) return c } // Clear 清空中间件链 func (c *Chain) Clear() *Chain { c.middlewares = nil return c }