File: Logging\HeaderReader.cs
Web Access
Project: src\src\Libraries\Microsoft.AspNetCore.Diagnostics.Middleware\Microsoft.AspNetCore.Diagnostics.Middleware.csproj (Microsoft.AspNetCore.Diagnostics.Middleware)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#if NET8_0_OR_GREATER
 
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Compliance.Classification;
using Microsoft.Extensions.Compliance.Redaction;
 
namespace Microsoft.AspNetCore.Diagnostics.Logging;
 
internal sealed class HeaderReader
{
    private readonly IRedactorProvider _redactorProvider;
    private readonly KeyValuePair<string, DataClassification>[] _headers;
    private readonly string[] _normalizedHeaders;
 
    public HeaderReader(IDictionary<string, DataClassification> headersToLog, IRedactorProvider redactorProvider, string prefix)
    {
        _redactorProvider = redactorProvider;
 
        _headers = headersToLog.Count == 0 ? [] : headersToLog.ToArray();
        _normalizedHeaders = HeaderNormalizer.PrepareNormalizedHeaderNames(_headers, prefix);
    }
 
    public void Read(IHeaderDictionary headers, IList<KeyValuePair<string, object?>> logContext)
    {
        if (headers.Count == 0)
        {
            return;
        }
 
        for (int i = 0; i < _headers.Length; i++)
        {
            var header = _headers[i];
 
            if (headers.TryGetValue(header.Key, out var headerValue))
            {
                var provider = _redactorProvider.GetRedactor(header.Value);
                var redacted = provider.Redact(headerValue.ToString());
                logContext.Add(new(_normalizedHeaders[i], redacted));
            }
        }
    }
}
#endif