Skip to content

Filter/Middleware

HTTP request filtering for cross-cutting concerns.

Define Filter

type AuthFilter struct {
    core.IFilter
}

func (f *AuthFilter) Init(ctx *core.Context) error {
    return nil
}

func (f *AuthFilter) Handle(fc web.FilterChain, req *web.Request) (any, error) {
    // Pre-processing
    token := req.GetHeader("Authorization")
    if token == "" {
        return nil, errors.New("unauthorized")
    }

    // Call next handler
    result, err := fc.Next()

    // Post-processing (optional)
    return result, err
}

Register Filter

builder.Filter(&AuthFilter{})
builder.Filter(&cors.Filter{})

Route Metadata (WithMeta)

Declare metadata per route:

func RequireAuth() web.MetaOption {
    return web.WithValue("require_auth", true)
}

builder.Get("/profile", handler).WithMeta(RequireAuth())

Read metadata in filter:

func (f *AuthFilter) Handle(fc web.FilterChain, req *web.Request) (any, error) {
    if req.HasMeta(RequireAuth()) {
        // check auth
    }
    return fc.Next()
}

Built-in Filters

Filter Description
cors.Filter CORS support
rate_limit.Filter Rate limiting

Gin Middleware Compatibility

type GzipFilter struct {
    handler gin.HandlerFunc
}

func (f *GzipFilter) Handle(fc web.FilterChain, req *web.Request) (any, error) {
    f.handler(req.GinContext())
    return fc.Next()
}