You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.2 KiB
177 lines
4.2 KiB
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;
|
|
}
|
|
}
|
|
}
|