patterngoModeratepending
Go HTTP middleware chain pattern
Viewed 0 times
middlewarehttp handlerchainloggingauthentication
Problem
Need to compose reusable HTTP middleware for logging, authentication, rate limiting, etc.
Solution
Standard middleware pattern in Go:
Middleware order matters: first in Chain = outermost (runs first on request, last on response).
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.