diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs index a2c5d790..05b9e34f 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs @@ -91,17 +91,36 @@ public class ObjectResolver( foreach (var item in collection.Items) yield return item; + // we only limit based on pages here. the consumer of this iterator may + // additionally limit per-item via System.Linq.Async Take() + var pageLimit = 50; + + // some remote software (e.g. fedibird) can get in a state where page.next == page.id + var visitedPages = new HashSet(); + var page = collection.First; while (page != null) { if (page.IsUnresolved) page = await ResolveObject(page, force: true) as ASCollectionPage; + if (page == null) break; if (page.Items != null) foreach (var item in page.Items) yield return item; + if (page.Next?.Id != null) + { + if (visitedPages.Contains(page.Next.Id)) + break; + + visitedPages.Add(page.Next.Id); + } + + if (--pageLimit <= 0) + break; + page = page.Next; } }