diff --git a/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs b/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs index 7972ed739492bd..e1fb0408173e97 100644 --- a/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs +++ b/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs @@ -83,6 +83,7 @@ public void Add(System.Uri uri, System.Net.Cookie cookie) { } public void Add(System.Uri uri, System.Net.CookieCollection cookies) { } public string GetCookieHeader(System.Uri uri) { throw null; } public System.Net.CookieCollection GetCookies(System.Uri uri) { throw null; } + public System.Net.CookieCollection GetAllCookies() { throw null; } public void SetCookies(System.Uri uri, string cookieHeader) { } } public partial class CookieException : System.FormatException, System.Runtime.Serialization.ISerializable diff --git a/src/libraries/System.Net.Primitives/src/System/Net/CookieContainer.cs b/src/libraries/System.Net.Primitives/src/System/Net/CookieContainer.cs index bfb96612faba0a..b64ff6f6f16da9 100644 --- a/src/libraries/System.Net.Primitives/src/System/Net/CookieContainer.cs +++ b/src/libraries/System.Net.Primitives/src/System/Net/CookieContainer.cs @@ -787,6 +787,32 @@ public CookieCollection GetCookies(Uri uri) return InternalGetCookies(uri) ?? new CookieCollection(); } + /// Gets a that contains all of the instances in the container. + /// A that contains all of the instances in the container. + public CookieCollection GetAllCookies() + { + var result = new CookieCollection(); + + lock (m_domainTable.SyncRoot) + { + IDictionaryEnumerator lists = m_domainTable.GetEnumerator(); + while (lists.MoveNext()) + { + PathList list = (PathList)lists.Value!; + lock (list.SyncRoot) + { + IDictionaryEnumerator collections = list.List.GetEnumerator(); + while (collections.MoveNext()) + { + result.Add((CookieCollection)collections.Value!); + } + } + } + } + + return result; + } + internal CookieCollection? InternalGetCookies(Uri uri) { if (m_count == 0) diff --git a/src/libraries/System.Net.Primitives/tests/FunctionalTests/CookieTest/CookieContainerTest.cs b/src/libraries/System.Net.Primitives/tests/FunctionalTests/CookieTest/CookieContainerTest.cs index ca5086386b14e4..9f5333c1c3d73e 100644 --- a/src/libraries/System.Net.Primitives/tests/FunctionalTests/CookieTest/CookieContainerTest.cs +++ b/src/libraries/System.Net.Primitives/tests/FunctionalTests/CookieTest/CookieContainerTest.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Linq; using Xunit; namespace System.Net.Primitives.Functional.Tests @@ -124,5 +125,37 @@ public void GetCookies_AddCookieVersion1WithExplicitDomain_CookieReturnedForDoma cookies = container.GetCookies(uri); Assert.Equal(0, cookies.Count); } + + [Fact] + public void GetAllCookies_Empty_ReturnsEmptyCollection() + { + var container = new CookieContainer(); + Assert.NotNull(container.GetAllCookies()); + Assert.NotSame(container.GetAllCookies(), container.GetAllCookies()); + Assert.Empty(container.GetAllCookies()); + } + + [Fact] + public void GetAllCookies_NonEmpty_AllCookiesReturned() + { + var container = new CookieContainer(); + container.PerDomainCapacity = 100; + container.Capacity = 100; + + Cookie[] cookies = Enumerable.Range(0, 100).Select(i => new Cookie($"name{i}", $"value{i}")).ToArray(); + + Uri[] uris = new[] { new Uri("https://dot.net"), new Uri("https://source.dot.net"), new Uri("https://microsoft.com") }; + for (int i = 0; i < cookies.Length; i++) + { + container.Add(uris[i % uris.Length], cookies[i]); + } + + CookieCollection actual = container.GetAllCookies(); + Assert.Equal(cookies.Length, actual.Count); + + Assert.Equal( + cookies.Select(c => c.Name + "=" + c.Value).ToHashSet(), + actual.Select(c => c.Name + "=" + c.Value).ToHashSet()); + } } }