Middleware Composition

Middleware Composition Example

Learn how to compose multiple middleware together, create conditional middleware, and build reusable middleware chains.

Running the Example

go run main.go

Server starts on http://localhost:3001

Key Patterns

Chain Pattern

Combine multiple middleware into one:

func Chain(middlewares ...func(*request.Context) error) func(*request.Context) error {
    return func(c *request.Context) error {
        for _, middleware := range middlewares {
            if err := middleware(c); err != nil {
                return err
            }
        }
        return c.Next()
    }
}

// Usage
router.GET("/admin", handler, Chain(AuthMiddleware, AdminMiddleware))

Conditional Middleware

Execute middleware only when condition is met:

func When(condition func(*request.Context) bool, middleware func(*request.Context) error) func(*request.Context) error {
    return func(c *request.Context) error {
        if condition(c) {
            return middleware(c)
        }
        return c.Next()
    }
}

// Usage
router.GET("/api/data", handler, When(func(c *request.Context) bool {
    return strings.HasPrefix(c.R.URL.Path, "/api/")
}, CORSMiddleware))

Unless Pattern

Skip middleware when condition is met:

func Unless(condition func(*request.Context) bool, middleware func(*request.Context) error) func(*request.Context) error {
    return func(c *request.Context) error {
        if !condition(c) {
            return middleware(c)
        }
        return c.Next()
    }
}

// Usage - skip logging for health checks
router.GET("/health", handler, Unless(func(c *request.Context) bool {
    return c.R.URL.Path == "/health"
}, LoggerMiddleware))

Test Endpoints

Topics Covered

Chaining, conditional middleware

Placeholder

This example is being prepared. Check back soon for:


Status: 📝 In Development