// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { internal class DictionaryStringValuesWrapper : IHeaderDictionary { public DictionaryStringValuesWrapper(IDictionary inner) { Inner = inner; } public readonly IDictionary Inner; private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); private StringValues Convert(string[] item) => item; private string[] Convert(StringValues item) => item; StringValues IHeaderDictionary.this[string key] { get { string[] values; return Inner.TryGetValue(key, out values) ? values : null; } set { Inner[key] = value; } } StringValues IDictionary.this[string key] { get { return Inner[key]; } set { Inner[key] = value; } } int ICollection>.Count => Inner.Count; bool ICollection>.IsReadOnly => Inner.IsReadOnly; ICollection IDictionary.Keys => Inner.Keys; ICollection IDictionary.Values => Inner.Values.Select(Convert).ToList(); void ICollection>.Add(KeyValuePair item) => Inner.Add(Convert(item)); void IDictionary.Add(string key, StringValues value) => Inner.Add(key, value); void ICollection>.Clear() => Inner.Clear(); bool ICollection>.Contains(KeyValuePair item) => Inner.Contains(Convert(item)); bool IDictionary.ContainsKey(string key) => Inner.ContainsKey(key); void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { foreach (var kv in Inner) { array[arrayIndex++] = Convert(kv); } } IEnumerator IEnumerable.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); IEnumerator> IEnumerable>.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); bool ICollection>.Remove(KeyValuePair item) => Inner.Remove(Convert(item)); bool IDictionary.Remove(string key) => Inner.Remove(key); bool IDictionary.TryGetValue(string key, out StringValues value) { string[] temp; if (Inner.TryGetValue(key, out temp)) { value = temp; return true; } value = default(StringValues); return false; } } }