Серьезная ошибка CookieContainer?

Мне что-то здесь не хватает или это ошибка в CookieContainer?

Я добавляю 3 файла cookie в контейнер, а затем вызываю функцию GetCookieHeader для 2 URL-адресов:

CookieContainer cc = new CookieContainer();

cc.Add(new Cookie("Cookie1", "1", "/a", "test.com"));
cc.Add(new Cookie("Cookie2", "2", "/a/0/", "test.com"));
cc.Add(new Cookie("Cookie3", "3", "/a/1/", "test.com"));

var result1 = cc.GetCookieHeader(new Uri("http://test.com/a/1/list"));
Assert.AreEqual("Cookie3=3; Cookie1=1", result1);

var result2 = cc.GetCookieHeader(new Uri("http://test.com/a/0/list"));
Assert.AreEqual("Cookie2=2; Cookie1=1", result2);

Проблема заключается в последнем утверждении, которое вызывает исключение, поскольку возвращаемый заголовок имеет значение «Cookie2 = 2». Я не вижу причин, по которым cookie1 cookie здесь опущен - согласно RFC6265 он должен возвращать два cookie, аналогичные первому утверждению выше, не так ли?

Пара замечаний:

  • Все файлы cookie находятся в контейнере, поэтому проблема не в добавлении, а в функции GetHeader.

  • Это поведение остается неизменным при добавлении 4, 5 и т. Д. Файлов cookie: только путь, соответствующий последнему добавленному файлу cookie, будет включать файл cookie для базового пути!

  • Поведение меняется при удалении всех «a» в путях и использовании только «/», «/ 0 /» и «/ 1 /» в качестве путей для 3 файлов cookie и «" и "http://test.com/0/list" в URL-адресах утверждений). Тогда все утверждения будут успешными - я ожидал бы того же поведения с «а»!

PS: позвольте мне добавить соответствующую часть из спецификации:

Путь запроса соответствует заданному пути cookie, если выполняется хотя бы одно из следующих условий:

- Путь к файлу cookie и путь запроса идентичны.

- Путь к файлу cookie является префиксом пути запроса, а последний символ пути к файлу cookie -% x2F ("/").

- Путь к файлу cookie является префиксом пути запроса, а первым символом пути запроса, не включенным в путь куки, является символ% x2F ("/").

Так для меня это явно ошибка ...?


person srudin    schedule 18.11.2014    source источник
comment
Я рекомендую вам упростить тест, удалив ненужные вещи. Трудно понять, что вы имеете в виду.   -  person usr    schedule 18.11.2014
comment
Я попытался разделить код еще на несколько строк, чтобы сделать его более читабельным. Но в нем нет ничего лишнего, поэтому я не могу ничего удалить.   -  person srudin    schedule 19.11.2014
comment
Сократите URL-адреса и имена. Удалите файл cookie JSESSIONID. На данный момент читатели должны найти 1-битную разницу между URL-адресами ...   -  person usr    schedule 19.11.2014
comment
Хорошо, я попытался сузить его и упростил пример, но, как вы можете видеть, пути - это часть проблемы, и первый отсутствующий файл cookie является самой проблемой.   -  person srudin    schedule 19.11.2014
comment
возможный дубликат обработки путей CookieContainer (Кто съел мой файл cookie?) - короче: да, это ошибка.   -  person Jeroen Mostert    schedule 19.11.2014


Ответы (1)


Я считаю, что нашел проблему. В классе System.Net.CookieContainer в функции InternalGetCookies (Uri) в строках 700-730 выполняется итерация по путям. После нахождения первого пути эти файлы cookie добавляются, а затем итерация прерывается, и дополнительно добавляются только значения для "/"!

Другими словами: вы получаете файлы cookie только из первого совпадающего пути и из "/". Для меня это явное неправильное поведение и, следовательно, ошибка - или я не понимаю RFC, о котором упоминал выше.

person srudin    schedule 18.11.2014
comment
Спасибо, Jeroen - не нашел этот пост. Да, скорее всего, будет так же. Поэтому я закрою это. - person srudin; 19.11.2014