ここで何かが足りないのですか、それとも 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 によれば、上記の最初のアサーションと同様の 2 つの Cookie を返す必要があります。
いくつかのコメント:
Cookie はすべてコンテナー内にあるため、問題は追加ではなく、GetHeader 関数です。
4、5 などの Cookie を追加しても、この動作は変わりません。最後に追加された Cookie に一致するパスのみが、ベース パスの Cookie を含みます。
パス内のすべての「a」を削除し、「/」、「/0/」、および「/1/」のみを 3 つの Cookie と「 http://test.com/1/list」のパスとして使用すると、動作が変わります。およびアサーション URL の「 http://test.com/0/list 」)。その後、すべてのアサーションが成功します。「a」でも同じ動作が期待できます。
PS: 仕様から関連する部分を追加させてください:
次の条件の少なくとも 1 つが保持される場合、要求パス パスは特定の cookie パスと一致します。
- cookie-path と request-path は同一です。
- cookie-path は request-path のプレフィックスであり、cookie-path の最後の文字は %x2F ("/") です。
- cookie-path は request-path のプレフィックスであり、cookie-path に含まれていない request-path の最初の文字は %x2F ("/") 文字です。
だから私にはこれは明らかにバグです...?