我是在这里遗漏了什么,还是CookieContainer中的一个bug?
我将向容器中添加3个cookie,然后调用两个urls的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,类似于上面的第一个断言,不是吗?
以下是几点意见:
PS:让我从规范中添加相关部分:
如果至少有下列条件之一,请求路径匹配给定的cookie路径:
-cookie路径和请求路径相同。
- cookie-path是请求路径的前缀,cookie路径的最后一个字符是%x2F ("/")。
- cookie-path是请求路径的前缀,请求路径中没有包含的第一个字符是%x2F ("/")字符。
所以对我来说这显然是个窃听器?
发布于 2014-11-18 22:46:13
我想我找到问题了。在函数System.Net.CookieContainer类InternalGetCookies(Uri)中,在第700-730行周围有一个路径的迭代。在找到第一个路径之后,这些cookie就会被添加,然后迭代就会中断,并且只会添加"/“的值!
换句话说:您只能从第一个匹配路径和从"/“获得cookie。对我来说,这是一个明显的错误行为,因此是一个错误--或者我不理解我上面提到的RFC。
https://stackoverflow.com/questions/27003836
复制相似问题