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;
}
}
}