package middleware import ( "context" "crypto/rand" "encoding/hex" "net/http" ) type requestIDKey struct{} func RequestID(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { requestID := r.Header.Get("X-Request-ID") if requestID == "" { requestID = newRequestID() } w.Header().Set("X-Request-ID", requestID) ctx := context.WithValue(r.Context(), requestIDKey{}, requestID) next.ServeHTTP(w, r.WithContext(ctx)) }) } func RequestIDFromContext(ctx context.Context) string { if value, ok := ctx.Value(requestIDKey{}).(string); ok { return value } return "" } func newRequestID() string { var data [16]byte if _, err := rand.Read(data[:]); err != nil { return "request-id-unavailable" } return hex.EncodeToString(data[:]) }