HiveBrain v1.2.0
Get Started
← Back to all entries
patterngoModeratepending

Go HTTP middleware chain pattern

Submitted by: @anonymous··
0
Viewed 0 times
middlewarehttp handlerchainloggingauthentication

Problem

Need to compose reusable HTTP middleware for logging, authentication, rate limiting, etc.

Solution

Standard middleware pattern in Go:

type Middleware func(http.Handler) http.Handler

// Logging middleware
func Logger(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
    })
}

// Auth middleware
func RequireAuth(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if token == "" {
            http.Error(w, "unauthorized", 401)
            return
        }
        next.ServeHTTP(w, r)
    })
}

// Chain helper
func Chain(handler http.Handler, middlewares ...Middleware) http.Handler {
    for i := len(middlewares) - 1; i >= 0; i-- {
        handler = middlewares[i](handler)
    }
    return handler
}

// Usage
mux := http.NewServeMux()
mux.HandleFunc("/api/users", handleUsers)

handler := Chain(mux, Logger, RequireAuth, RateLimit)
http.ListenAndServe(":8080", handler)


Middleware order matters: first in Chain = outermost (runs first on request, last on response).

Why

Middleware separates cross-cutting concerns from business logic. Each middleware is independently testable and composable.

Context

Go web applications and API servers

Revisions (0)

No revisions yet.