Zdravím,
mám problém s HttpWebRequstem a cookies. Jedná se o prográmek, který by se měl přihlásit na určetou stránku, aby následně mohl dále pracovat na serveru. Pro tyto účely se používají cookies, které je potřeba vygenerovat, což samo o sboě není problém.
Problém spočívá v tom, že na samotné stránce je skript v JS, který generuje cookies pomocí poněkud zajímavá funkce.
function randomCookie() {
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split('');
var str = '';
var date = new Date(); date.setTime(date.getTime()+(28*24*60*60*1000)); var expires = "; expires="+date.toGMTString();
for (var i = 0; i<45; i++) {
str += chars[Math.floor(Math.random() * chars.length)]; str+=expires; str += "path=/"
} return str; }
if (document.cookie) {} else {document.cookie=randomCookie(); }
Když jsem tuto funkci vyvolal, tak mi vrátila následující hodnotu
k; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/m; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/W; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/H; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/M; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/a; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/m; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/3; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/s; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/4; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/z; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/V; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/R; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/d; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/A; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/i; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/r; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/9; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/D; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/q; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/J; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/c; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/6; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/T; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/d; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/9; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/M; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/X; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/b; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/h; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/0; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/X; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/8; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/8; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/K; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/v; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/B; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/2; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/B; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/g; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/f; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/y; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/I; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/c; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/J; expires=Wed, 18 Jul 2012 14:30:56 UTCpath=/
Když jsem se podíval v prohlížeči na obsah cookies pro danou stránku, tak mi to napsalo, že existuje pouze jedna cookies a ta má název o délce jednoho písmena.
Zkoušel jsem už snad všechno, ale nepodařilo se mi to rozchodit, momentálně program vypadá takto ...
Proměnné v dané funkci.
ErrorResult vracime = null;
HttpWebRequest request = null;
System.IO.Stream reqStream = null;
HttpWebResponse response = null;
System.IO.StreamReader sr = null;
string[] generatorChars = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "T", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
Random gener = new Random();
Cookie SusenkaProFormular = null;
Proměnná pro celou třídu
CookieCollection DozaSeSusenkama = null;
Zdrojový kód funkce, který by měl vygenerovat cookies a odeslat data na server. Kontroloval jsem to i přes wireshark a všechno odesílá v pořádku.
DozaSeSusenkama = new CookieCollection();
for (int i = 0; i < 45; i++)
{
SusenkaProFormular = new Cookie();
SusenkaProFormular.Name = generatorChars[gener.Next(0, generatorChars.Length - 1)];
SusenkaProFormular.Value = SusenkaProFormular.Name;
SusenkaProFormular.Path = login_user;
SusenkaProFormular.Domain = address_ip;
SusenkaProFormular.Expires = DateTime.Now.AddDays(28);
SusenkaProFormular.HttpOnly = false;
DozaSeSusenkama.Add(SusenkaProFormular);
SusenkaProFormular = null;
}
// Deklarace telegramu
// sopas_username=Maintenance&sopas_password=Inspector
string data = "sopas_username=" + Name + "&sopas_password=" + Password;
byte[] data_bytes = System.Text.Encoding.ASCII.GetBytes(data);
// Nastavení requestu
request = (HttpWebRequest)HttpWebRequest.Create("http://" + address_ip + ":" + port.ToString() + login_user);
request.AllowWriteStreamBuffering = false;
request.Method = "POST";
request.KeepAlive = true;
request.Timeout = 3000;
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(DozaSeSusenkama);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data_bytes.Length;
request.ServicePoint.Expect100Continue = false;
reqStream = request.GetRequestStream();
reqStream.Write(data_bytes, 0, data_bytes.Length);
reqStream.Flush();
reqStream.Close();
reqStream.Dispose();
// Příjem odpovědi
response = (HttpWebResponse)request.GetResponse();
Trace.WriteLine("Cookies count = " + response.Cookies.Count);
Když se tam pokusím přihlásit přes IE, tak to jde ... ;-)