Files
goproxy/internal/middleware/chain.go
DarkiT 7efc72b362 增加:
1.  监控指标收集
2.  中间件机制
3.  配置热更新
4.  优雅关闭
5.  插件系统
6.  API文档
7.  认证授权系统
8.  请求/响应压缩优化
2025-03-13 22:58:39 +08:00

64 lines
1.2 KiB
Go

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
}