Przecinek w cookie

0

Witam,

Piszę bota, którego zadaniem jest interakcja z pewną stroną.
Używam Visual C# 2008 Express Edition.
System: Windows XP

W czym problem.
Muszę stworzyć i ustawić cookie następującej postaci: "Name=Value1, Value2, Value3..." itd.
Kod który tworzy i ustawia cookie

Cookie c = new Cookie();
c.Name = "Name";
c.Value = "1, 2, 3, 4, 5, 6, 7";
c.Domain = "domain";
mCookies.Add(c);

Oczywiście taki kod powoduje wyrzucenie wyjątku:
CookieException was unhandled.
The 'Name'='1, 2, 3, 4, 5, 6, 7' part of the cookie is invalid.

Zmiana wersji cookie z 0 na 1 daje taki sam rezultat.
Ręczne ustawienie cookie w nagłówku nie powoduje co prawda wyrzucenia wyjątku, lecz cookie jest rozbity na kilka linii tej postaci:

2=""
3=""
...
Name="1"

Co wskazuje na traktowanie przecinka jako ogranicznika.
Kolejna próba w postaci użycia HttpUtility.UrlEncode() pozwala przesłać cookie lecz przecinek zamieniany jest na symbol %d2 bodajże, co nie wchodzi niestety w grę.

Czy istnieje jakieś rozwiązanie aby przesłać cookie w pożądanej postaci ?
Używając Fiddlera ewidentnie widać, że Firefox radzi sobie z tym zadaniem bez problemu, czyli musi być jakieś rozwiązanie.

Będę wdzięczny za pomoc.

1

U mnie działa bez problemu 0_o

        public Form1()
        {
            InitializeComponent();
            Cookie c = new Cookie();
            c.Name = "Name";
            c.Value = "1, 2, 3, 4, 5, 6, 7";
            c.Domain = "domain";
        }

Ta sama wersja VS, win7.

0

Dzięki za odpowiedź.

To dziwne w takim razie.
Czy mógłbyś sprawdzić czy działa zarówno w wersji 0 jak i 1 ?
Gdybyś jeszcze miał Fiddlera i mógł zobaczyć czy cookie jest w prawidłowym formacie to już stawiam piwo :)

Rozbijam się nad tym cały dzień i na prawdę szlag zaczyna mnie już trafiać.

Ps. Właśnie zauważyłem, że w Twoim kodzie brak wywołania metody Add(cookie) klasy CookieContainer.
To zmienia postać rzeczy bo właśnie ta metoda rzuca wyjątkiem.

Z góry dziękuję.

1

Hmm... http://msdn.microsoft.com/en-us/library/00y90f4c.aspx - The following characters are reserved and cannot be used for this property: semicolon (średnik), comma(no właśnie... przecinek). Nie wiem co z tym zrobić :/ Skoro mówisz że fiddler 'widzi' średniki w cookies to już sam nie wiem.

EDIT: Z google na razie wycisnąłem coś takiego: http://www.mail-archive.com/[email protected]/msg03938.html
Najlepszy kawałek:

> > Yes, it is, and it is absolutely correct in doing
> > so. Comma is a
> > reserved character intended to be used as a header
> > element delimiter.
> > Cookie attribute values that contain reserved
> > characters such as comma
> > must be enclosed with quotation marks. 

(rozumiesz angielski? bo nie wiem czy tłumaczyć zdania? ;)

> > Cookie attribute values that contain reserved

characters such as comma
must be enclosed with quotation marks.

to znaczy -> Ciasteczka zawierające zarezerwowane znaki jak przecinek muszą być zamknięte w "quotation marks" - czyli się da. Czyżby quotation marks = cudzysłowy?

EDIT2: tak, chyba o to chodzi :D

c.Value = "\"1, 2, 3, 4, 5, 6, 7\""; - tak zadziałało u mnie [green]

0

Witam MSM,

Nie dopisałem, że i tego rozwiązania próbowałem. Tak jak piszesz, ustawienie cookie w takim formacie nie powoduje wyrzucenia wyjątku. Niestety, Fiddler pokazuje go jako: name = "value1, value2.." wraz z cudzysłowami.

Przeanalizowałem kod javascript i okazuje się, że Cookie tworzony jest jak poniżej:

function setCookie(name,wert,lebenInSekunden){
	var myTime = new Date();
	myTime.setTime(myTime.getTime()+lebenInSekunden*1000);
	var verfallszeit = myTime.toGMTString();
	//alert(verfallszeit);
	var cookiestring = name + "=" + wert;
	//alert(cookiestring);
	cookiestring += (verfallszeit)?"; expires=" + verfallszeit : "";
	document.cookie = cookiestring;

Wg https://developer.mozilla.org/en/DOM/document.cookie The cookie value string can use encodeURIComponent() to ensure that the string does not contain any commas, semicolons, or whitespace (which are disallowed in cookie values).

Wynika z tego iż wartość cookie jest "surowa". W żadnym innym miejscu string zawierający wartość cookie nie jest kodowany.

W innym miejscu:

a = document.cookie;
do
				{
	
					cookiename1 = a.substring(0,a.search('='));
					cookiewert1 = a.substring(a.search('=')+1,a.search(';'));
				
					a = a.substring(a.search(';')+1,a.length);
					
					count++;
					if(a.length == tmplength)
						break;
					
					tmplength = a.length;

				}while(cookiename1 != ' someName');

                                if(cookiewert1 != '')
				{
					var splitstring = cookiewert1.split(",");
...

Ewidentnie widać, że brak dekodowania a wartość cookie dzielona na substringi wg przecinka.
Na prawdę nie rozumiem.

1

Niestety, Fiddler pokazuje go jako: name = "value1, value2.." wraz z cudzysłowami.
A cudzysłowy są dla ciebie niedopuszczalne? Jesteś pewien że firefox przepuszcza takie cookie bez cudzysłowów?

Jeśli dwa razy tak... To chyba moja wiedza się tutaj kończy :/. Spróbuj może zapytać w dziale webmastering, tam siedzą eksperci od takich spraw...

0

Podepne sie pod temat ,bo nikt tutaj -> http://4programmers.net/Forum/viewtopic.php?id=157468 nie był w stanie mi pomóc. Jak mam zapisać znaki "[" i "]" w postdata(stringu ktory ma zostac przeslany metoda POST) ? Zapisuje to jako %5B i %5D ,ale cos mi nie dziala i nie wiem czy to czasem nie jest tego wina.

1

Jedyne co mogę zrobić to zapytać google (bo dzięki forumowiczom jestem w tym coraz lepszy :D), a tym razem wyrocznia milczy :/

Naprawdę, nie jestem ekspertem od sieci i inni w tym dziale pewnie też nie. Lamson - zadaj to pytanie lepiej w dziale webmastering, są tam tacy co pozjadali zęby na takich sprawach, masz tam znacznie większą szansą na odpowiedź :]

0

spoko :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1