我在这里遗漏了什么,或者这是CookieContainer中的错误?
我正在向容器中添加3个Cookie,然后我将GetCookieHeader函数调用为2个网址:
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路径和请求路径完全相同。
- cookie路径是请求路径的前缀,cookie路径的最后一个字符是%x2F(“/").
- cookie-path是请求路径的前缀,而cookie路径中未包含的请求路径的第一个字符是%x2F(“/”)字符。 / em>的
所以对我来说这显然是一个错误......?
答案 0 :(得分:2)
我相信我发现了这个问题。在第700-730行的函数InternalGetCookies(Uri)中的System.Net.CookieContainer类中,对路径进行了迭代。找到第一个路径后,会添加这些cookie,然后中断迭代,只有" /"的值。另外还有!
换句话说:您只能从第一个匹配路径获取Cookie,而从#34; /"获取Cookie。对我来说,这是一个明显的不当行为,因此也是一个错误 - 或者我不理解上面提到的RFC。