Skip to content

Commit fd83c6a

Browse files
committed
Add cancellationtoken support
1 parent 74bbe1e commit fd83c6a

File tree

2 files changed

+103
-68
lines changed

2 files changed

+103
-68
lines changed

SimpleFeedReader/FeedReader.cs

Lines changed: 22 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace SimpleFeedReader;
1717
/// When true, the <see cref="FeedReader"/> will throw on errors, when false the <see cref="FeedReader"/> will
1818
/// suppress exceptions and return empty results.
1919
/// </param>
20-
public class FeedReader(IFeedItemNormalizer defaultFeedItemNormalizer, bool throwOnError)
20+
public class FeedReader(IFeedItemNormalizer defaultFeedItemNormalizer, bool throwOnError) : IFeedReader
2121
{
2222
private static readonly HttpClient _httpclient = new();
2323

@@ -58,62 +58,31 @@ public FeedReader(bool throwOnError)
5858
public FeedReader(IFeedItemNormalizer defaultFeedItemNormalizer)
5959
: this(defaultFeedItemNormalizer, false) { }
6060

61-
/// <summary>
62-
/// Retrieves the specified feeds.
63-
/// </summary>
64-
/// <param name="uris">The uri's of the feeds to retrieve.</param>
65-
/// <returns>
66-
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
67-
/// </returns>
68-
/// <remarks>This is a convenience method.</remarks>
69-
public Task<IEnumerable<FeedItem>> RetrieveFeedsAsync(IEnumerable<string> uris)
70-
=> RetrieveFeedsAsync(uris, DefaultNormalizer);
61+
/// <inheritdoc/>
62+
public Task<IEnumerable<FeedItem>> RetrieveFeedsAsync(IEnumerable<string> uris, CancellationToken cancellationToken = default)
63+
=> RetrieveFeedsAsync(uris, DefaultNormalizer, cancellationToken);
7164

72-
/// <summary>
73-
/// Retrieves the specified feeds.
74-
/// </summary>
75-
/// <param name="uris">The uri's of the feeds to retrieve.</param>
76-
/// <param name="normalizer">
77-
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="FeedItem"/>s.
78-
/// </param>
79-
/// <returns>
80-
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
81-
/// </returns>
82-
/// <remarks>This is a convenience method.</remarks>
83-
public async Task<IEnumerable<FeedItem>> RetrieveFeedsAsync(IEnumerable<string> uris, IFeedItemNormalizer normalizer)
65+
66+
/// <inheritdoc/>
67+
public async Task<IEnumerable<FeedItem>> RetrieveFeedsAsync(IEnumerable<string> uris, IFeedItemNormalizer normalizer, CancellationToken cancellationToken = default)
8468
{
85-
var tasks = uris.Select(uri => RetrieveFeedAsync(uri, normalizer));
69+
var tasks = uris.Select(uri => RetrieveFeedAsync(uri, normalizer, cancellationToken));
8670
await Task.WhenAll(tasks);
8771

8872
return tasks.SelectMany(tasks => tasks.Result);
8973
}
9074

91-
/// <summary>
92-
/// Retrieves the specified feed.
93-
/// </summary>
94-
/// <param name="uri">The uri of the feed to retrieve.</param>
95-
/// <returns>
96-
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
97-
/// </returns>
98-
public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri)
99-
=> RetrieveFeedAsync(uri, DefaultNormalizer);
75+
/// <inheritdoc/>
76+
public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri, CancellationToken cancellationToken = default)
77+
=> RetrieveFeedAsync(uri, DefaultNormalizer, cancellationToken);
10078

101-
/// <summary>
102-
/// Retrieves the specified feed.
103-
/// </summary>
104-
/// <param name="uri">The uri of the feed to retrieve.</param>
105-
/// <param name="normalizer">
106-
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="FeedItem"/>s.
107-
/// </param>
108-
/// <returns>
109-
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
110-
/// </returns>
111-
public async Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri, IFeedItemNormalizer normalizer)
79+
/// <inheritdoc/>
80+
public async Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri, IFeedItemNormalizer normalizer, CancellationToken cancellationToken = default)
11281
{
11382
try
11483
{
115-
using var reader = await GetXmlReaderAsync(uri);
116-
return await RetrieveFeedAsync(reader, normalizer);
84+
using var reader = await GetXmlReaderAsync(uri, cancellationToken);
85+
return await RetrieveFeedAsync(reader, normalizer, cancellationToken);
11786
}
11887
catch
11988
{
@@ -125,27 +94,12 @@ public async Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri, IFeedItem
12594
return [];
12695
}
12796

128-
/// <summary>
129-
/// Retrieves the specified feed.
130-
/// </summary>
131-
/// <param name="xmlReader">The <see cref="XmlReader"/> to use to read the items from.</param>
132-
/// <returns>
133-
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
134-
/// </returns>
135-
public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader) =>
136-
RetrieveFeedAsync(xmlReader, DefaultNormalizer);
97+
/// <inheritdoc/>
98+
public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader, CancellationToken cancellationToken = default) =>
99+
RetrieveFeedAsync(xmlReader, DefaultNormalizer, cancellationToken);
137100

138-
/// <summary>
139-
/// Retrieves the specified feed.
140-
/// </summary>
141-
/// <param name="xmlReader">The <see cref="XmlReader"/> to use to read the items from.</param>
142-
/// <param name="normalizer">
143-
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="FeedItem"/>s.
144-
/// </param>
145-
/// <returns>
146-
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
147-
/// </returns>
148-
public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader, IFeedItemNormalizer normalizer)
101+
/// <inheritdoc/>
102+
public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader, IFeedItemNormalizer normalizer, CancellationToken cancellationToken = default)
149103
{
150104
if (xmlReader == null)
151105
{
@@ -172,11 +126,11 @@ public Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader, IFeedI
172126
return Task.FromResult(Enumerable.Empty<FeedItem>());
173127
}
174128

175-
private static async Task<XmlReader> GetXmlReaderAsync(string uri)
129+
private static async Task<XmlReader> GetXmlReaderAsync(string uri, CancellationToken cancellationToken = default)
176130
{
177131
if (Uri.IsWellFormedUriString(uri, UriKind.Absolute))
178132
{
179-
var response = await _httpclient.GetAsync(uri);
133+
var response = await _httpclient.GetAsync(uri, cancellationToken);
180134
response.EnsureSuccessStatusCode();
181135
var stream = await response.Content.ReadAsStreamAsync();
182136
return XmlReader.Create(stream);

SimpleFeedReader/IFeedReader.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System.Xml;
2+
3+
namespace SimpleFeedReader;
4+
5+
/// <summary>
6+
///
7+
/// </summary>
8+
public interface IFeedReader
9+
{
10+
/// <summary>
11+
/// Retrieves the specified feed.
12+
/// </summary>
13+
/// <param name="uri">The uri of the feed to retrieve.</param>
14+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
15+
/// <returns>
16+
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
17+
/// </returns>
18+
Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri, CancellationToken cancellationToken = default);
19+
20+
/// <summary>
21+
/// Retrieves the specified feed.
22+
/// </summary>
23+
/// <param name="uri">The uri of the feed to retrieve.</param>
24+
/// <param name="normalizer">
25+
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="FeedItem"/>s.
26+
/// </param>
27+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
28+
/// <returns>
29+
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
30+
/// </returns>
31+
Task<IEnumerable<FeedItem>> RetrieveFeedAsync(string uri, IFeedItemNormalizer normalizer, CancellationToken cancellationToken = default);
32+
33+
34+
/// <summary>
35+
/// Retrieves the specified feed.
36+
/// </summary>
37+
/// <param name="xmlReader">The <see cref="XmlReader"/> to use to read the items from.</param>
38+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
39+
/// <returns>
40+
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
41+
/// </returns>
42+
Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader, CancellationToken cancellationToken = default);
43+
44+
/// <summary>
45+
/// Retrieves the specified feed.
46+
/// </summary>
47+
/// <param name="xmlReader">The <see cref="XmlReader"/> to use to read the items from.</param>
48+
/// <param name="normalizer">
49+
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="FeedItem"/>s.
50+
/// </param>
51+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
52+
/// <returns>
53+
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
54+
/// </returns>
55+
Task<IEnumerable<FeedItem>> RetrieveFeedAsync(XmlReader xmlReader, IFeedItemNormalizer normalizer, CancellationToken cancellationToken = default);
56+
57+
/// <summary>
58+
/// Retrieves the specified feeds.
59+
/// </summary>
60+
/// <param name="uris">The uri's of the feeds to retrieve.</param>
61+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
62+
/// <returns>
63+
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
64+
/// </returns>
65+
/// <remarks>This is a convenience method.</remarks>
66+
Task<IEnumerable<FeedItem>> RetrieveFeedsAsync(IEnumerable<string> uris, CancellationToken cancellationToken = default);
67+
68+
/// <summary>
69+
/// Retrieves the specified feeds.
70+
/// </summary>
71+
/// <param name="uris">The uri's of the feeds to retrieve.</param>
72+
/// <param name="normalizer">
73+
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="FeedItem"/>s.
74+
/// </param>
75+
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
76+
/// <returns>
77+
/// Returns a task that resolves to an <see cref="IEnumerable{FeedItem}"/> of retrieved <see cref="FeedItem"/>s.
78+
/// </returns>
79+
/// <remarks>This is a convenience method.</remarks>
80+
Task<IEnumerable<FeedItem>> RetrieveFeedsAsync(IEnumerable<string> uris, IFeedItemNormalizer normalizer, CancellationToken cancellationToken = default);
81+
}

0 commit comments

Comments
 (0)