Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add cancellation token to SendNotification* methods #64

Merged
merged 2 commits into from
Feb 27, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions WebPush/WebPushClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using WebPush.Util;

Expand All @@ -26,14 +27,14 @@ public class WebPushClient : IDisposable

public WebPushClient()
{

}

public WebPushClient(HttpClient httpClient)
{
_httpClient = httpClient;
}

public WebPushClient(HttpClientHandler httpClientHandler)
{
_httpClientHandler = httpClientHandler;
Expand Down Expand Up @@ -142,7 +143,7 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,

if (options != null)
{
var validOptionsKeys = new List<string> {"headers", "gcmAPIKey", "vapidDetails", "TTL"};
var validOptionsKeys = new List<string> { "headers", "gcmAPIKey", "vapidDetails", "TTL" };
foreach (var key in options.Keys)
{
if (!validOptionsKeys.Contains(key))
Expand Down Expand Up @@ -181,7 +182,7 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,
}

//at this stage ttl cannot be null.
timeToLive = (int) ttl;
timeToLive = (int)ttl;
}
}

Expand Down Expand Up @@ -258,9 +259,27 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,
/// </param>
public void SendNotification(PushSubscription subscription, string payload = null,
Dictionary<string, object> options = null)
{
SendNotification(subscription, payload, options, CancellationToken.None);
}


/// <summary>
/// To send a push notification call this method with a subscription, optional payload and any options
/// Will exception if unsuccessful
/// </summary>
/// <param name="subscription">The PushSubscription you wish to send the notification to.</param>
/// <param name="payload">The payload you wish to send to the user</param>
/// <param name="options">
/// Options for the GCM API key and vapid keys can be passed in if they are unique for each
/// notification.
/// </param>
/// <param name="cancellationToken">The cancellation token to cancel operation.</param>
public void SendNotification(PushSubscription subscription, string payload,
Dictionary<string, object> options, CancellationToken cancellationToken)
{
var request = GenerateRequestDetails(subscription, payload, options);
var sendAsyncTask = HttpClient.SendAsync(request);
var sendAsyncTask = HttpClient.SendAsync(request, cancellationToken);
sendAsyncTask.Wait();

var response = sendAsyncTask.Result;
Expand All @@ -277,7 +296,7 @@ public void SendNotification(PushSubscription subscription, string payload = nul
/// <param name="vapidDetails">The vapid details for the notification.</param>
public void SendNotification(PushSubscription subscription, string payload, VapidDetails vapidDetails)
{
var options = new Dictionary<string, object> {["vapidDetails"] = vapidDetails};
var options = new Dictionary<string, object> { ["vapidDetails"] = vapidDetails };
SendNotification(subscription, payload, options);
}

Expand All @@ -290,7 +309,7 @@ public void SendNotification(PushSubscription subscription, string payload, Vapi
/// <param name="gcmApiKey">The GCM API key</param>
public void SendNotification(PushSubscription subscription, string payload, string gcmApiKey)
{
var options = new Dictionary<string, object> {["gcmAPIKey"] = gcmApiKey};
var options = new Dictionary<string, object> { ["gcmAPIKey"] = gcmApiKey };
SendNotification(subscription, payload, options);
}

Expand All @@ -304,11 +323,27 @@ public void SendNotification(PushSubscription subscription, string payload, stri
/// Options for the GCM API key and vapid keys can be passed in if they are unique for each
/// notification.
/// </param>
public async Task SendNotificationAsync(PushSubscription subscription, string payload = null,
public Task SendNotificationAsync(PushSubscription subscription, string payload = null,
Dictionary<string, object> options = null)
{
return SendNotificationAsync(subscription, payload, options, CancellationToken.None);
}

/// To send a push notification asynchronous call this method with a subscription, optional payload and any options
/// Will exception if unsuccessful
/// </summary>
/// <param name="subscription">The PushSubscription you wish to send the notification to.</param>
/// <param name="payload">The payload you wish to send to the user</param>
/// <param name="options">
/// Options for the GCM API key and vapid keys can be passed in if they are unique for each
/// notification.
/// </param>
/// <param name="cancellationToken">The cancellation token to cancel operation.</param>
public async Task SendNotificationAsync(PushSubscription subscription, string payload,
Dictionary<string, object> options, CancellationToken cancellationToken)
{
var request = GenerateRequestDetails(subscription, payload, options);
var response = await HttpClient.SendAsync(request);
var response = await HttpClient.SendAsync(request, cancellationToken);

HandleResponse(response, subscription);
}
Expand All @@ -323,7 +358,7 @@ public async Task SendNotificationAsync(PushSubscription subscription, string pa
public async Task SendNotificationAsync(PushSubscription subscription, string payload,
VapidDetails vapidDetails)
{
var options = new Dictionary<string, object> {["vapidDetails"] = vapidDetails};
var options = new Dictionary<string, object> { ["vapidDetails"] = vapidDetails };
await SendNotificationAsync(subscription, payload, options);
}

Expand All @@ -336,7 +371,7 @@ public async Task SendNotificationAsync(PushSubscription subscription, string pa
/// <param name="gcmApiKey">The GCM API key</param>
public async Task SendNotificationAsync(PushSubscription subscription, string payload, string gcmApiKey)
{
var options = new Dictionary<string, object> {["gcmAPIKey"] = gcmApiKey};
var options = new Dictionary<string, object> { ["gcmAPIKey"] = gcmApiKey };
await SendNotificationAsync(subscription, payload, options);
}

Expand All @@ -354,7 +389,7 @@ private static void HandleResponse(HttpResponseMessage response, PushSubscriptio
}

// Error
var message = @"Received unexpected response code: " + (int) response.StatusCode;
var message = @"Received unexpected response code: " + (int)response.StatusCode;
switch (response.StatusCode)
{
case HttpStatusCode.BadRequest:
Expand All @@ -365,7 +400,7 @@ private static void HandleResponse(HttpResponseMessage response, PushSubscriptio
message = "Payload too large";
break;

case (HttpStatusCode) 429:
case (HttpStatusCode)429:
message = "Too many request.";
break;

Expand All @@ -377,7 +412,7 @@ private static void HandleResponse(HttpResponseMessage response, PushSubscriptio

throw new WebPushException(message, response.StatusCode, response.Headers, subscription);
}

public void Dispose()
{
if (_httpClient != null && _isHttpClientInternallyCreated)
Expand Down