static CookieCollection ParseResponse(string value) { var cookies = new CookieCollection(); Cookie cookie = null; string [] pairs = Split(value).ToArray(); for (int i = 0; i < pairs.Length; i++) { string pair = pairs [i].Trim(); if (pair.Length == 0) { continue; } if (pair.StartsWith("version", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Version = Int32.Parse(pair.GetValueInternal("=").Trim('"')); } } else if (pair.StartsWith("expires", StringComparison.InvariantCultureIgnoreCase)) { var buffer = new StringBuilder(pair.GetValueInternal("="), 32); if (i < pairs.Length - 1) { buffer.AppendFormat(", {0}", pairs [++i].Trim()); } DateTime expires; if (!DateTime.TryParseExact(buffer.ToString(), new string [] { "ddd, dd'-'MMM'-'yyyy HH':'mm':'ss 'GMT'", "r" }, CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, out expires)) { expires = DateTime.Now; } if (cookie != null && cookie.Expires == DateTime.MinValue) { cookie.Expires = expires.ToLocalTime(); } } else if (pair.StartsWith("max-age", StringComparison.InvariantCultureIgnoreCase)) { int max = Int32.Parse(pair.GetValueInternal("=").Trim('"')); var expires = DateTime.Now.AddSeconds((double)max); if (cookie != null) { cookie.Expires = expires; } } else if (pair.StartsWith("path", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Path = pair.GetValueInternal("="); } } else if (pair.StartsWith("domain", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Domain = pair.GetValueInternal("="); } } else if (pair.StartsWith("port", StringComparison.InvariantCultureIgnoreCase)) { var port = pair.Equals("port", StringComparison.InvariantCultureIgnoreCase) ? "\"\"" : pair.GetValueInternal("="); if (cookie != null) { cookie.Port = port; } } else if (pair.StartsWith("comment", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Comment = pair.GetValueInternal("=").UrlDecode(); } } else if (pair.StartsWith("commenturl", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.CommentUri = pair.GetValueInternal("=").Trim('"').ToUri(); } } else if (pair.StartsWith("discard", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Discard = true; } } else if (pair.StartsWith("secure", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Secure = true; } } else if (pair.StartsWith("httponly", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.HttpOnly = true; } } else { if (cookie != null) { cookies.Add(cookie); } string name; string val = String.Empty; int pos = pair.IndexOf('='); if (pos == -1) { name = pair; } else if (pos == pair.Length - 1) { name = pair.Substring(0, pos).TrimEnd(' '); } else { name = pair.Substring(0, pos).TrimEnd(' '); val = pair.Substring(pos + 1).TrimStart(' '); } cookie = new Cookie(name, val); } } if (cookie != null) { cookies.Add(cookie); } return(cookies); }
static CookieCollection ParseRequest(string value) { var cookies = new CookieCollection(); Cookie cookie = null; int version = 0; string [] pairs = Split(value).ToArray(); for (int i = 0; i < pairs.Length; i++) { string pair = pairs [i].Trim(); if (pair.Length == 0) { continue; } if (pair.StartsWith("$version", StringComparison.InvariantCultureIgnoreCase)) { version = Int32.Parse(pair.GetValueInternal("=").Trim('"')); } else if (pair.StartsWith("$path", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Path = pair.GetValueInternal("="); } } else if (pair.StartsWith("$domain", StringComparison.InvariantCultureIgnoreCase)) { if (cookie != null) { cookie.Domain = pair.GetValueInternal("="); } } else if (pair.StartsWith("$port", StringComparison.InvariantCultureIgnoreCase)) { var port = pair.Equals("$port", StringComparison.InvariantCultureIgnoreCase) ? "\"\"" : pair.GetValueInternal("="); if (cookie != null) { cookie.Port = port; } } else { if (cookie != null) { cookies.Add(cookie); } string name; string val = String.Empty; int pos = pair.IndexOf('='); if (pos == -1) { name = pair; } else if (pos == pair.Length - 1) { name = pair.Substring(0, pos).TrimEnd(' '); } else { name = pair.Substring(0, pos).TrimEnd(' '); val = pair.Substring(pos + 1).TrimStart(' '); } cookie = new Cookie(name, val); if (version != 0) { cookie.Version = version; } } } if (cookie != null) { cookies.Add(cookie); } return(cookies); }