using System; using System.Text; using System.Collections.Generic; using System.Net; using System.Collections; using System.Diagnostics; namespace TestProject1 { public class CookieContainerTest { static void Main() { CookieContainerTest t = new CookieContainerTest(); t.AddTest(); Console.ReadKey(); } public void AddTest() { _AddTest(true); _AddTest(false); } void _AddTest(bool includeUri) { CookieContainer cc = new CookieContainer(); Cookie c1 = new Cookie("c1", ".444.333.222.111.org", "/", ".444.333.222.111.org"); Cookie c2 = new Cookie("c2", "444.333.222.111.org", "/", "444.333.222.111.org"); Cookie c3 = new Cookie("c3", ".333.222.111.org", "/", ".333.222.111.org"); Cookie c4 = new Cookie("c4", "333.222.111.org", "/", "333.222.111.org"); Cookie c5 = new Cookie("c5", ".222.111.org", "/", ".222.111.org"); Cookie c6 = new Cookie("c6", "222.111.org", "/", "222.111.org"); Cookie c7 = new Cookie("c7", ".111.org", "/", ".111.org"); Cookie c8 = new Cookie("c8", "111.org", "/", "111.org"); Uri u = new Uri("Http://444.333.222.111.org"); if (includeUri) { Console.Write("\r\n\r\nTesting Add(Uri, Cookie) method (including uri):\r\n"); cc.Add(u, c1); cc.Add(u, c2); cc.Add(u, c3); cc.Add(u, c4); cc.Add(u, c5); cc.Add(u, c6); cc.Add(u, c7); cc.Add(u, c8); } else { Console.Write("\r\n\r\nTesting Add(Cookie) method (excluding uri):\r\n"); cc.Add(c1); cc.Add(c2); cc.Add(c3); cc.Add(c4); cc.Add(c5); cc.Add(c6); cc.Add(c7); cc.Add(c8); } //Console.Write("\r\nCookieContainer Domain keys:\r\n"); //Console.Write(GetDomainKeys(cc)); //Console.Write("\r\nActual cookies contain in the CookieContainer:\r\n"); //Console.Write(GetAllCookies(cc)); //Console.Write("\r\nCookies retrieved by GetCookies(" + u.AbsoluteUri + ") Method:\r\n"); //Console.Write(GetCookiesColl(cc.GetCookies(u))); //if (!includeUri) { Console.WriteLine("\nBugFix:----------------------------"); BugFix_AddDotCookieDomain(cc); Console.WriteLine("includeUri = " + includeUri + " ================"); //Console.Write("\r\nCookieContainer Domain keys:\r\n"); //Console.Write(GetDomainKeys(cc)); //Console.Write("\r\nActual cookies contain in the CookieContainer:\r\n"); //Console.Write(GetAllCookies(cc)); //Console.Write("\r\nCookies retrieved by GetCookies(" + u.AbsoluteUri + ") Method:\r\n"); //Console.Write(GetCookiesColl(cc.GetCookies(u))); u = new Uri("http://xxxxxx.111.org/"); Console.WriteLine("\nCookies retrieved by GetCookies(" + u.AbsoluteUri + ") Method:"); Console.WriteLine(GetCookiesColl(cc.GetCookies(u))); u = new Uri("http://333.222.111.org/"); Console.WriteLine("\nCookies retrieved by GetCookies(" + u.AbsoluteUri + ") Method:"); Console.WriteLine(GetCookiesColl(cc.GetCookies(u))); } } /// /// CookieContainer "Domain" BugFix /// /// private void BugFix_AddDotCookieDomain(CookieContainer cookieContainer) { Type CookieContainerType = Type.GetType("System.Net.CookieContainer, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); Type PathListType = Type.GetType("System.Net.PathList, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); Hashtable table = (Hashtable)CookieContainerType.InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cookieContainer, new object[] { }); ArrayList keys = new ArrayList(table.Keys); object pathList1; object pathList2; SortedList sortedList1; SortedList sortedList2; ArrayList pathKeys; CookieCollection cookieColl1; CookieCollection cookieColl2; foreach (string key in keys) { string nonDotKey; if (key[0] == '.') { nonDotKey = key.Remove(0, 1); // Dont simply code like this: // table[nonDotKey] = table[key]; // instead code like below: // This codes will copy all cookies in dot domain key into nondot domain key. pathList1 = table[key]; pathList2 = table[nonDotKey]; if (pathList2 == null) { pathList2 = Activator.CreateInstance(PathListType); // Same as PathList pathList = new PathList(); lock (cookieContainer) { table[nonDotKey] = pathList2; } } // merge the PathList, take cookies from table[keyObj] copy into table[nonDotKey] sortedList1 = (SortedList)PathListType.InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList1, new object[] { }); sortedList2 = (SortedList)PathListType.InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList2, new object[] { }); pathKeys = new ArrayList(sortedList1.Keys); foreach (string pathKey in pathKeys) { cookieColl1 = (CookieCollection)sortedList1[pathKey]; cookieColl2 = (CookieCollection)sortedList2[pathKey]; if (cookieColl2 == null) { cookieColl2 = new CookieCollection(); sortedList2[pathKey] = cookieColl2; } foreach (Cookie c in cookieColl1) { lock (cookieColl2) { cookieColl2.Add(c); } } } } } } string GetCookiesColl(CookieCollection ccs) { string cookies = ""; foreach (Cookie c in ccs) { cookies += c.ToString() + "\r\n"; } return cookies; } /// /// Get all cookie contains in the CookieContainer hacked by using reflection. /// /// /// public string GetAllCookies(CookieContainer cc) { string lstCookies = ""; Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); object pathList; foreach (string key in table.Keys) { pathList = table[key]; SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }); foreach (CookieCollection colCookies in lstCookieCol.Values) foreach (Cookie c in colCookies) { lstCookies += c.ToString() + " Domain key: " + key + "\r\n"; } } return lstCookies; } /// /// Get all domain key (in Hashtable table) hacked by using reflection. /// /// /// public string GetDomainKeys(CookieContainer cc) { string lstCookies = ""; Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); object pathList; int count; foreach (string key in table.Keys) { count = 0; pathList = table[key]; SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }); foreach (CookieCollection colCookies in lstCookieCol.Values) count += colCookies.Count; lstCookies += key + " Cookies Count: " + count + "\r\n"; } return lstCookies; } } }