using System; using System.Collections.Generic; namespace BestHTTP.Authentication { /// /// Stores and manages already received digest infos. /// public static class DigestStore { private static Dictionary Digests = new Dictionary(); private static object Locker = new object(); /// /// Array of algorithms that the plugin supports. It's in the order of priority(first has the highest priority). /// private static string[] SupportedAlgorithms = new string[] { "digest", "basic" }; public static Digest Get(Uri uri) { lock (Locker) { Digest digest = null; if (Digests.TryGetValue(uri.Host, out digest)) if (!digest.IsUriProtected(uri)) return null; return digest; } } /// /// It will retrive or create a new Digest for the given Uri. /// /// /// public static Digest GetOrCreate(Uri uri) { lock (Locker) { Digest digest = null; if (!Digests.TryGetValue(uri.Host, out digest)) Digests.Add(uri.Host, digest = new Digest(uri)); return digest; } } public static void Remove(Uri uri) { lock(Locker) Digests.Remove(uri.Host); } public static string FindBest(List authHeaders) { if (authHeaders == null || authHeaders.Count == 0) return string.Empty; List headers = new List(authHeaders.Count); for (int i = 0; i < authHeaders.Count; ++i) headers.Add(authHeaders[i].ToLower()); for (int i = 0; i < SupportedAlgorithms.Length; ++i) { int idx = headers.FindIndex((header) => header.StartsWith(SupportedAlgorithms[i])); if (idx != -1) return authHeaders[idx]; } return string.Empty; } } }