using AspNetCore.Extensions.Options; using Microsoft.CorrelationVector; using Microsoft.Extensions.Options; using System.Core.Extensions; namespace AspNetCore.Extensions.Middleware; public sealed class CorrelationVectorMiddleware : IMiddleware { private readonly CorrelationVectorOptions options; public CorrelationVectorMiddleware() : this(Microsoft.Extensions.Options.Options.Create(new())) { } public CorrelationVectorMiddleware(IOptions options) { this.options = options.ThrowIfNull().Value.ThrowIfNull(); } public Task InvokeAsync(HttpContext context, RequestDelegate next) { var cv = new CorrelationVector(); if (context.Items.TryGetValue(this.options.Header, out var correlationVectorVal) && correlationVectorVal is string correlationVectorStr) { cv = CorrelationVector.Parse(correlationVectorStr); cv.Increment(); } context.SetCorrelationVector(cv); return next(context); } }