diff --git a/Usenet/Nntp/Parsers/ArticleResponseParser.cs b/Usenet/Nntp/Parsers/ArticleResponseParser.cs index 3f538e9..ab3e3bc 100644 --- a/Usenet/Nntp/Parsers/ArticleResponseParser.cs +++ b/Usenet/Nntp/Parsers/ArticleResponseParser.cs @@ -69,7 +69,10 @@ public NntpArticleResponse Parse(int code, string message, IEnumerable d return new NntpArticleResponse(code, message, true, new NntpArticle(number, messageId, null, null, null)); } - using (IEnumerator enumerator = dataBlock.GetEnumerator()) + // Materialize lines to avoid returning a body tied to a disposed enumerator + var lines = dataBlock?.ToList(); + + using (IEnumerator enumerator = (lines ?? Enumerable.Empty()).GetEnumerator()) { // get headers if requested MultiValueDictionary headers = (requestType & ArticleRequestType.Head) == ArticleRequestType.Head @@ -83,15 +86,8 @@ public NntpArticleResponse Parse(int code, string message, IEnumerable d // get body if requested IEnumerable bodyLines = (requestType & ArticleRequestType.Body) == ArticleRequestType.Body - ? EnumerateBodyLines(enumerator) - : new string[0]; - - if (dataBlock is ICollection) - { - // no need to keep enumerator if input is not a stream - // memoize the body lines - bodyLines = bodyLines.ToList(); - } + ? EnumerateBodyLines(enumerator).ToList() + : new List(0); return new NntpArticleResponse( code, message, true,