You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package middleware
|
|
|
|
import (
|
|
ctxpkg "github.com/noahlann/nnet/pkg/context"
|
|
routerpkg "github.com/noahlann/nnet/pkg/router"
|
|
)
|
|
|
|
// Chain 中间件链
|
|
type Chain struct {
|
|
middlewares []routerpkg.Handler
|
|
}
|
|
|
|
// NewChain 创建中间件链
|
|
func NewChain(middlewares ...routerpkg.Handler) *Chain {
|
|
return &Chain{
|
|
middlewares: middlewares,
|
|
}
|
|
}
|
|
|
|
// Then 执行中间件链
|
|
func (c *Chain) Then(handler routerpkg.Handler) routerpkg.Handler {
|
|
if len(c.middlewares) == 0 {
|
|
return handler
|
|
}
|
|
|
|
// 从后往前包装
|
|
h := handler
|
|
for i := len(c.middlewares) - 1; i >= 0; i-- {
|
|
middleware := c.middlewares[i]
|
|
h = c.wrapHandler(middleware, h)
|
|
}
|
|
return h
|
|
}
|
|
|
|
// wrapHandler 包装处理器
|
|
func (c *Chain) wrapHandler(middleware, handler routerpkg.Handler) routerpkg.Handler {
|
|
return func(ctx ctxpkg.Context) error {
|
|
// 执行中间件
|
|
if err := middleware(ctx); err != nil {
|
|
return err
|
|
}
|
|
// 执行下一个处理器
|
|
return handler(ctx)
|
|
}
|
|
}
|
|
|
|
// Append 添加中间件
|
|
func (c *Chain) Append(middleware ...routerpkg.Handler) {
|
|
c.middlewares = append(c.middlewares, middleware...)
|
|
}
|
|
|
|
// Prepend 前置添加中间件
|
|
func (c *Chain) Prepend(middleware ...routerpkg.Handler) {
|
|
c.middlewares = append(middleware, c.middlewares...)
|
|
}
|
|
|