<PackageReference Include="System.ClientModel" Version="1.1.0-beta.6" />

ArrayBackedRequestHeaders

using System.ClientModel.Internal; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace System.ClientModel.Primitives { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal class ArrayBackedRequestHeaders : PipelineRequestHeaders { [System.Runtime.CompilerServices.Nullable(0)] private readonly struct IgnoreCaseString : IEquatable<IgnoreCaseString> { private readonly string _value; public IgnoreCaseString(string value) { _value = value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(IgnoreCaseString other) { return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); } [System.Runtime.CompilerServices.NullableContext(2)] public override bool Equals(object obj) { if (obj is IgnoreCaseString) { IgnoreCaseString other = (IgnoreCaseString)obj; return Equals(other); } return false; } public override int GetHashCode() { return _value.GetHashCode(); } public static bool operator ==(IgnoreCaseString left, IgnoreCaseString right) { return left.Equals(right); } public static bool operator !=(IgnoreCaseString left, IgnoreCaseString right) { return !left.Equals(right); } public static implicit operator string(IgnoreCaseString ics) { return ics._value; } } [System.Runtime.CompilerServices.Nullable(new byte[] { 0, 1 })] private ArrayBackedPropertyBag<IgnoreCaseString, object> _headers; public override bool Remove(string name) { return _headers.TryRemove(new IgnoreCaseString(name)); } public override void Set(string name, string value) { _headers.Set(new IgnoreCaseString(name), value); } public override void Add(string name, string value) { Argument.AssertNotNullOrEmpty(name, "name"); Argument.AssertNotNullOrEmpty(value, "value"); if (!_headers.TryAdd(new IgnoreCaseString(name), value, out object existingValue)) { string text = existingValue as string; if (text == null) (existingValue as List<string>)?.Add(value); else _headers.Set(new IgnoreCaseString(name), new List<string> { text, value }); } } public override bool TryGetValue(string name, [System.Runtime.CompilerServices.Nullable(2)] out string value) { Argument.AssertNotNullOrEmpty(name, "name"); if (_headers.TryGetValue(new IgnoreCaseString(name), out object value2)) { value = GetHeaderValueString(name, value2); return true; } value = null; return false; } public override bool TryGetValues(string name, [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 1 })] out IEnumerable<string> values) { Argument.AssertNotNullOrEmpty(name, "name"); if (_headers.TryGetValue(new IgnoreCaseString(name), out object value)) { values = GetHeaderValueEnumerable(name, value); return true; } values = null; return false; } [return: System.Runtime.CompilerServices.Nullable(new byte[] { 1, 0, 1, 1 })] public override IEnumerator<KeyValuePair<string, string>> GetEnumerator() { return GetHeadersStringValues().GetEnumerator(); } internal bool GetNextValue(int index, out string name, [System.Runtime.CompilerServices.Nullable(2)] out object value) { if (index >= _headers.Count) { name = null; value = null; return false; } _headers.GetAt(index, out IgnoreCaseString key, out object value2); name = key; value = value2; return true; } [return: System.Runtime.CompilerServices.Nullable(new byte[] { 1, 0, 1, 1 })] private IEnumerable<KeyValuePair<string, string>> GetHeadersStringValues() { for (int i = 0; i < _headers.Count; i++) { _headers.GetAt(i, out IgnoreCaseString key, out object value); string headerValueString = GetHeaderValueString(key, value); yield return new KeyValuePair<string, string>(key, headerValueString); } } private static string GetHeaderValueString(string name, object value) { string text = value as string; if (text != null) return text; List<string> list = value as List<string>; if (list == null) throw new InvalidOperationException($"""{name}""{value?.GetType()}"); return string.Join(",", list); } private static IEnumerable<string> GetHeaderValueEnumerable(string name, object value) { string text = value as string; if (text != null) return new string[1] { text }; List<string> list = value as List<string>; if (list == null) throw new InvalidOperationException($"""{name}""{value.GetType()}"); return list; } } }