<PackageReference Include="System.ClientModel" Version="1.5.1" />

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; } } }