veylant/internal/middleware/requestid.go
2026-02-23 13:35:04 +01:00

28 lines
796 B
Go

package middleware
import (
"net/http"
"github.com/google/uuid"
)
const headerRequestID = "X-Request-Id"
// RequestID is a middleware that attaches a UUID v7 to every request.
// If the incoming request already carries an X-Request-Id header the value is
// reused; otherwise a new UUID v7 is generated.
// The ID is injected into the request context (accessible via RequestIDFromContext)
// and echoed back in the X-Request-Id response header.
func RequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := r.Header.Get(headerRequestID)
if id == "" {
id = uuid.Must(uuid.NewV7()).String()
}
ctx := withRequestID(r.Context(), id)
w.Header().Set(headerRequestID, id)
next.ServeHTTP(w, r.WithContext(ctx))
})
}