我是不是遗漏了什么,或者这是 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);
问题是最后一个断言抛出异常,因为返回的 header 仅为“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 “在断言 URL 中)。然后所有断言都会成功 - 我希望“a”有相同的行为!
PS:让我添加规范中的相关部分:
如果至少满足以下条件之一,则请求路径路径匹配给定的 cookie 路径:
- cookie 路径和请求路径相同。
- cookie-path 是 request-path 的前缀,cookie-path 的最后一个字符是 %x2F ("/")。
- cookie-path 是请求路径的前缀,不包含在 cookie-path 中的请求路径的第一个字符是 %x2F ("/") 字符。
所以对我来说这显然是一个错误......?
最佳答案
我相信我找到了问题所在。在函数 InternalGetCookies(Uri) 的 System.Net.CookieContainer 类中,第 700-730 行附近有一个路径迭代。找到第一个路径后,添加这些 cookie,然后中断迭代,仅添加“/”的值!
换句话说:您只能从第一个匹配路径和“/”中获取cookie。对我来说,这是一个明显的不当行为,因此是一个错误 - 或者我不理解上面提到的 RFC。
关于c# - 严重的 CookieContainer 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27003836/