Когда путь не указан, я предполагал, что файл cookie будет отправлен обратно на любую страницу в этом домене, но, похоже, он будет отправлен только на эту страницу.Теперь я предполагаю, что это правильно, поскольку это соответствует.
Да, это правильно.Если домен или путь не указан, он берется из текущего URI.
ОК, давайте посмотрим на CookieContainer.Рассматриваемый метод InternalGetCookies (Uri) .Вот интересная часть:
while (enumerator2.MoveNext())
{
DictionaryEntry dictionaryEntry = (DictionaryEntry)enumerator2.get_Current();
string text2 = (string)dictionaryEntry.get_Key();
if (!uri.AbsolutePath.StartsWith(CookieParser.CheckQuoted(text2)))
{
if (flag2)
{
break;
}
else
{
continue;
}
}
flag2 = true;
CookieCollection cookieCollection2 = (CookieCollection)dictionaryEntry.get_Value();
cookieCollection2.TimeStamp(CookieCollection.Stamp.Set);
this.MergeUpdateCollections(cookieCollection, cookieCollection2, port, flag, i < 0);
if (!(text2 == "/"))
{
continue;
}
flag3 = true;
continue;
}
enumerator2
вот (отсортированный) список путей файлов cookie.Он отсортирован таким образом, что более конкретные пути (например, /directory/subdirectory/
) идут раньше, чем менее конкретные (например, /directory/
), а в противном случае - в лексикографическом порядке (/directory/page1
идет до /directory/page2
).
Код фактически выполняет следующее: он перебирает этот список путей файлов cookie, пока не найдет первый путь, который является префиксом для запрошенного пути URI.Затем он добавляет файлы cookie по этому пути к выводу и устанавливает flag2
в true
, что означает «ОК, я наконец-то нашел место в списке, которое фактически относится к запрошенному URI».После этого первый встреченный путь, который НЕ является префиксом для запрошенного пути URI, считается концом связанных путей, поэтому код прекращает поиск файлов cookie, выполняя break
.
Очевидно, этокакая-то оптимизация для предотвращения сканирования всего списка, и она, очевидно, работает, если ни один из путей не ведет к конкретной странице.Теперь для вашего случая список путей выглядит следующим образом:
/some/path/page1.html
/some/path/page2.html
/some/path/
Вы можете проверить это с помощью отладчика, посмотрев на ((System.Net.PathList)(cookieJar.m_domainTable["www.somedomain.com"])).m_list
в окне просмотра
Итак, для 'page1.html 'URI, код разбивается на элемент page2.html
, не имея возможности обработать также элемент /some/path/
.
В заключение: это, очевидно, еще одна ошибка в CookieContainer.Я полагаю, что об этом следует сообщать при подключении.
PS: Слишком много ошибок в одном классе.Я только надеюсь, что парень из MS, который написал тесты для этого класса, уже уволен.