package requestid import ( "context" "crypto/rand" "encoding/hex" "net/http" ) type contextKey struct{} func Middleware(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 = newID() } w.Header().Set("X-Request-Id", requestID) next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), contextKey{}, requestID))) }) } func FromContext(ctx context.Context) string { requestID, _ := ctx.Value(contextKey{}).(string) return requestID } func newID() string { var buf [16]byte if _, err := rand.Read(buf[:]); err != nil { return "req-fallback" } return hex.EncodeToString(buf[:]) }