diff options
Diffstat (limited to 'Emby.Dlna/Server/Headers.cs')
| -rw-r--r-- | Emby.Dlna/Server/Headers.cs | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/Emby.Dlna/Server/Headers.cs b/Emby.Dlna/Server/Headers.cs new file mode 100644 index 0000000000..1e63771c2b --- /dev/null +++ b/Emby.Dlna/Server/Headers.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace MediaBrowser.Dlna.Server +{ + public class Headers : IDictionary<string, string> + { + private readonly bool _asIs = false; + private readonly Dictionary<string, string> _dict = new Dictionary<string, string>(); + private readonly static Regex Validator = new Regex(@"^[a-z\d][a-z\d_.-]+$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public Headers(bool asIs) + { + _asIs = asIs; + } + + public Headers() + : this(asIs: false) + { + } + + public int Count + { + get + { + return _dict.Count; + } + } + public string HeaderBlock + { + get + { + var hb = new StringBuilder(); + foreach (var h in this) + { + hb.AppendFormat("{0}: {1}\r\n", h.Key, h.Value); + } + return hb.ToString(); + } + } + public Stream HeaderStream + { + get + { + return new MemoryStream(Encoding.ASCII.GetBytes(HeaderBlock)); + } + } + public bool IsReadOnly + { + get + { + return false; + } + } + public ICollection<string> Keys + { + get + { + return _dict.Keys; + } + } + public ICollection<string> Values + { + get + { + return _dict.Values; + } + } + + + public string this[string key] + { + get + { + return _dict[Normalize(key)]; + } + set + { + _dict[Normalize(key)] = value; + } + } + + + private string Normalize(string header) + { + if (!_asIs) + { + header = header.ToLower(); + } + header = header.Trim(); + if (!Validator.IsMatch(header)) + { + throw new ArgumentException("Invalid header: " + header); + } + return header; + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dict.GetEnumerator(); + } + + public void Add(KeyValuePair<string, string> item) + { + Add(item.Key, item.Value); + } + + public void Add(string key, string value) + { + _dict.Add(Normalize(key), value); + } + + public void Clear() + { + _dict.Clear(); + } + + public bool Contains(KeyValuePair<string, string> item) + { + var p = new KeyValuePair<string, string>(Normalize(item.Key), item.Value); + return _dict.Contains(p); + } + + public bool ContainsKey(string key) + { + return _dict.ContainsKey(Normalize(key)); + } + + public void CopyTo(KeyValuePair<string, string>[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public IEnumerator<KeyValuePair<string, string>> GetEnumerator() + { + return _dict.GetEnumerator(); + } + + public bool Remove(string key) + { + return _dict.Remove(Normalize(key)); + } + + public bool Remove(KeyValuePair<string, string> item) + { + return Remove(item.Key); + } + + public override string ToString() + { + return string.Format("({0})", string.Join(", ", (from x in _dict + select string.Format("{0}={1}", x.Key, x.Value)))); + } + + public bool TryGetValue(string key, out string value) + { + return _dict.TryGetValue(Normalize(key), out value); + } + + public string GetValueOrDefault(string key, string defaultValue) + { + string val; + + if (TryGetValue(key, out val)) + { + return val; + } + + return defaultValue; + } + } +} |
