PipelineMessageSanitizer
                    class PipelineMessageSanitizer
                
                using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
namespace System.ClientModel.Internal
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal class PipelineMessageSanitizer
    {
        private const string LogAllValue = "*";
        private readonly bool _logAllHeaders;
        private readonly bool _logFullQueries;
        private readonly string _redactedPlaceholder;
        [System.Runtime.CompilerServices.Nullable(2)]
        [ThreadStatic]
        private static StringBuilder s_cachedStringBuilder;
        private const int MaxCachedStringBuilderCapacity = 1024;
        internal readonly HashSet<string> _allowedQueryParameters;
        internal readonly HashSet<string> _allowedHeaders;
        public PipelineMessageSanitizer(HashSet<string> allowedQueryParameters, HashSet<string> allowedHeaders, string redactedPlaceholder = "REDACTED")
        {
            _logAllHeaders = allowedHeaders.Contains("*");
            _logFullQueries = allowedQueryParameters.Contains("*");
            _allowedQueryParameters = allowedQueryParameters;
            _redactedPlaceholder = redactedPlaceholder;
            _allowedHeaders = allowedHeaders;
        }
        public string SanitizeHeader(string name, string value)
        {
            if (_logAllHeaders || _allowedHeaders.Contains(name))
                return value;
            return _redactedPlaceholder;
        }
        public bool ShouldSanitizeHeaderValue(string name)
        {
            if (_logAllHeaders || _allowedHeaders.Contains(name))
                return false;
            return true;
        }
        public string SanitizeUrl(string url)
        {
            if (_logFullQueries)
                return url;
            int num = url.IndexOf('?');
            if (num == -1)
                return url;
            StringBuilder stringBuilder = null;
            int num2 = num + 1;
            ReadOnlySpan<char> span = url.AsSpan(num + 1);
            while (span.Length > 0) {
                int num3 = span.IndexOf('&');
                int num4 = span.IndexOf('=');
                bool flag = false;
                if ((num3 == -1 && num4 == -1) || (num3 != -1 && (num4 == -1 || num4 > num3))) {
                    num4 = num3;
                    flag = true;
                }
                if (num4 == -1)
                    num4 = span.Length;
                num3 = ((num3 != -1) ? (num3 + 1) : span.Length);
                ReadOnlySpan<char> span2 = span.Slice(0, num4);
                bool flag2 = false;
                foreach (string allowedQueryParameter in _allowedQueryParameters) {
                    if (MemoryExtensions.Equals(span2, allowedQueryParameter.AsSpan(), StringComparison.OrdinalIgnoreCase)) {
                        flag2 = true;
                        break;
                    }
                }
                int num5 = num3;
                int length = num4;
                if (flag2 | flag) {
                    if (stringBuilder == null)
                        num2 += num5;
                    else
                        <SanitizeUrl>g__AppendReadOnlySpan|11_0(stringBuilder, span.Slice(0, num5));
                } else {
                    if (stringBuilder == null)
                        stringBuilder = RentStringBuilder(url.Length).Append(url, 0, num2);
                    <SanitizeUrl>g__AppendReadOnlySpan|11_0(stringBuilder, span.Slice(0, length)).Append('=').Append(_redactedPlaceholder);
                    if (span[num3 - 1] == '&')
                        stringBuilder.Append('&');
                }
                span = span.Slice(num5);
            }
            if (stringBuilder != null)
                return ToStringAndReturnStringBuilder(stringBuilder);
            return url;
        }
        private static StringBuilder RentStringBuilder(int capacity)
        {
            if (capacity <= 1024) {
                StringBuilder stringBuilder = s_cachedStringBuilder;
                if (stringBuilder != null && stringBuilder.Capacity >= capacity) {
                    s_cachedStringBuilder = null;
                    return stringBuilder;
                }
            }
            return new StringBuilder(capacity);
        }
        private static string ToStringAndReturnStringBuilder(StringBuilder builder)
        {
            string result = builder.ToString();
            if (builder.Capacity <= 1024)
                s_cachedStringBuilder = builder.Clear();
            return result;
        }
    }
}