See More

using System; using System.Collections.Generic; using System.Net; using System.Text; using uhttpsharp.Headers; namespace uhttpsharp { public interface IHttpContext { IHttpRequest Request { get; } IHttpResponse Response { get; set; } ICookiesStorage Cookies { get; } dynamic State { get; } EndPoint RemoteEndPoint { get; } } public interface ICookiesStorage : IHttpHeaders { void Upsert(string key, string value); void Remove(string key); bool Touched { get; } string ToCookieData(); } public class CookiesStorage : ICookiesStorage { private static readonly string[] CookieSeparators = { "; ", "=" }; private readonly Dictionary _values; private bool _touched; public bool Touched { get { return _touched; } } public string ToCookieData() { StringBuilder builder = new StringBuilder(); foreach (var kvp in _values) { builder.AppendFormat("Set-Cookie: {0}={1}{2}", kvp.Key, kvp.Value, Environment.NewLine); } return builder.ToString(); } public CookiesStorage(string cookie) { var keyValues = cookie.Split(CookieSeparators, StringSplitOptions.RemoveEmptyEntries); _values = new Dictionary(StringComparer.InvariantCultureIgnoreCase); for (int i = 0; i < keyValues.Length; i += 2) { var key = keyValues[i]; var value = keyValues[i + 1]; _values[key] = value; } } public void Upsert(string key, string value) { _values[key] = value; _touched = true; } public void Remove(string key) { if (_values.Remove(key)) { _touched = true; } } public IEnumerator> GetEnumerator() { return _values.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public string GetByName(string name) { return _values[name]; } public bool TryGetByName(string name, out string value) { return _values.TryGetValue(name, out value); } } }