5

我在这里遗漏了什么还是 CookieContainer 中的错误?

我将 3 个 cookie 添加到容器中,然后为 2 个 url 调用 GetCookieHeader 函数:

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/1/list ”的路径时,行为会发生变化和断言网址中的“ http://test.com/0/list ”)。然后所有断言都会成功 - 我希望“a”具有相同的行为!

PS:让我从规范中添加相关部分:

如果至少满足以下条件之一,则请求路径路径匹配给定的 cookie 路径:

- cookie-path 和 request-path 是相同的。

- cookie-path 是 request-path 的前缀,cookie-path 的最后一个字符是 %x2F ("/")。

- cookie-path 是 request-path 的前缀,不包含在 cookie-path 中的 request-path 的第一个字符是 %x2F ("/") 字符。

所以对我来说这显然是一个错误......?

4

1 回答 1

2

我相信我找到了问题所在。在第 700-730 行附近的函数 InternalGetCookies(Uri) 的 System.Net.CookieContainer 类中,对路径进行了迭代。找到第一个路径后,添加这些 cookie,然后中断迭代,仅添加“/”的值!

换句话说:您只能从第一个匹配路径和“/”中获取 cookie。对我来说,这是一个明显的不当行为,因此是一个错误 - 或者我不理解我上面提到的 RFC。

于 2014-11-18T22:46:13.137 回答