6
6
using System . Runtime . CompilerServices ;
7
7
using System . Threading ;
8
8
using System . Threading . Tasks ;
9
+ using WebPush . Model ;
9
10
using WebPush . Util ;
10
11
11
12
[ assembly: InternalsVisibleTo ( "WebPush.Test" ) ]
@@ -202,7 +203,7 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,
202
203
@"Unable to send a message with payload to this subscription since it doesn't have the required encryption key" ) ;
203
204
}
204
205
205
- var encryptedPayload = Encryptor . Encrypt ( subscription . P256DH , subscription . Auth , payload ) ;
206
+ var encryptedPayload = EncryptPayload ( subscription , payload ) ;
206
207
207
208
request . Content = new ByteArrayContent ( encryptedPayload . Payload ) ;
208
209
request . Content . Headers . ContentType = new MediaTypeHeaderValue ( "application/octet-stream" ) ;
@@ -243,7 +244,8 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,
243
244
{
244
245
cryptoKeyHeader += @";" + vapidHeaders [ "Crypto-Key" ] ;
245
246
}
246
- } else if ( isFcm && ! string . IsNullOrEmpty ( currentGcmApiKey ) )
247
+ }
248
+ else if ( isFcm && ! string . IsNullOrEmpty ( currentGcmApiKey ) )
247
249
{
248
250
request . Headers . TryAddWithoutValidation ( "Authorization" , "key=" + currentGcmApiKey ) ;
249
251
}
@@ -252,6 +254,23 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,
252
254
return request ;
253
255
}
254
256
257
+ private static EncryptionResult EncryptPayload ( PushSubscription subscription , string payload )
258
+ {
259
+ try
260
+ {
261
+ return Encryptor . Encrypt ( subscription . P256DH , subscription . Auth , payload ) ;
262
+ }
263
+ catch ( Exception ex )
264
+ {
265
+ if ( ex is FormatException || ex is ArgumentException )
266
+ {
267
+ throw new InvalidEncryptionDetailsException ( "Unable to encrypt the payload with the encryption key of this subscription." , subscription ) ;
268
+ }
269
+
270
+ throw ;
271
+ }
272
+ }
273
+
255
274
/// <summary>
256
275
/// To send a push notification call this method with a subscription, optional payload and any options
257
276
/// Will exception if unsuccessful
@@ -265,11 +284,8 @@ public HttpRequestMessage GenerateRequestDetails(PushSubscription subscription,
265
284
public void SendNotification ( PushSubscription subscription , string payload = null ,
266
285
Dictionary < string , object > options = null )
267
286
{
268
- var request = GenerateRequestDetails ( subscription , payload , options ) ;
269
- var response = HttpClient . SendAsync ( request ) . Result ;
270
- HandleResponse ( response , subscription ) ;
287
+ SendNotificationAsync ( subscription , payload , options ) . GetAwaiter ( ) . GetResult ( ) ;
271
288
}
272
-
273
289
274
290
/// <summary>
275
291
/// To send a push notification call this method with a subscription, optional payload and any options
@@ -296,7 +312,7 @@ public void SendNotification(PushSubscription subscription, string payload, stri
296
312
var options = new Dictionary < string , object > { [ "gcmAPIKey" ] = gcmApiKey } ;
297
313
SendNotification ( subscription , payload , options ) ;
298
314
}
299
-
315
+
300
316
301
317
/// <summary>
302
318
/// To send a push notification asynchronous call this method with a subscription, optional payload and any options
@@ -310,7 +326,7 @@ public void SendNotification(PushSubscription subscription, string payload, stri
310
326
/// </param>
311
327
/// <param name="cancellationToken">The cancellation token to cancel operation.</param>
312
328
public async Task SendNotificationAsync ( PushSubscription subscription , string payload = null ,
313
- Dictionary < string , object > options = null , CancellationToken cancellationToken = default )
329
+ Dictionary < string , object > options = null , CancellationToken cancellationToken = default )
314
330
{
315
331
var request = GenerateRequestDetails ( subscription , payload , options ) ;
316
332
var response = await HttpClient . SendAsync ( request , cancellationToken ) ;
@@ -327,7 +343,7 @@ public async Task SendNotificationAsync(PushSubscription subscription, string pa
327
343
/// <param name="vapidDetails">The vapid details for the notification.</param>
328
344
/// <param name="cancellationToken"></param>
329
345
public async Task SendNotificationAsync ( PushSubscription subscription , string payload ,
330
- VapidDetails vapidDetails , CancellationToken cancellationToken = default )
346
+ VapidDetails vapidDetails , CancellationToken cancellationToken = default )
331
347
{
332
348
var options = new Dictionary < string , object > { [ "vapidDetails" ] = vapidDetails } ;
333
349
await SendNotificationAsync ( subscription , payload , options , cancellationToken ) ;
@@ -341,7 +357,7 @@ public async Task SendNotificationAsync(PushSubscription subscription, string pa
341
357
/// <param name="payload">The payload you wish to send to the user</param>
342
358
/// <param name="gcmApiKey">The GCM API key</param>
343
359
/// <param name="cancellationToken"></param>
344
- public async Task SendNotificationAsync ( PushSubscription subscription , string payload , string gcmApiKey , CancellationToken cancellationToken = default )
360
+ public async Task SendNotificationAsync ( PushSubscription subscription , string payload , string gcmApiKey , CancellationToken cancellationToken = default )
345
361
{
346
362
var options = new Dictionary < string , object > { [ "gcmAPIKey" ] = gcmApiKey } ;
347
363
await SendNotificationAsync ( subscription , payload , options , cancellationToken ) ;
0 commit comments