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,9 +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
- SendNotification ( subscription , payload , options ) ;
287
+ SendNotificationAsync ( subscription , payload , options ) . GetAwaiter ( ) . GetResult ( ) ;
269
288
}
270
-
271
289
272
290
/// <summary>
273
291
/// To send a push notification call this method with a subscription, optional payload and any options
@@ -294,7 +312,7 @@ public void SendNotification(PushSubscription subscription, string payload, stri
294
312
var options = new Dictionary < string , object > { [ "gcmAPIKey" ] = gcmApiKey } ;
295
313
SendNotification ( subscription , payload , options ) ;
296
314
}
297
-
315
+
298
316
299
317
/// <summary>
300
318
/// To send a push notification asynchronous call this method with a subscription, optional payload and any options
@@ -308,7 +326,7 @@ public void SendNotification(PushSubscription subscription, string payload, stri
308
326
/// </param>
309
327
/// <param name="cancellationToken">The cancellation token to cancel operation.</param>
310
328
public async Task SendNotificationAsync ( PushSubscription subscription , string payload = null ,
311
- Dictionary < string , object > options = null , CancellationToken cancellationToken = default )
329
+ Dictionary < string , object > options = null , CancellationToken cancellationToken = default )
312
330
{
313
331
var request = GenerateRequestDetails ( subscription , payload , options ) ;
314
332
var response = await HttpClient . SendAsync ( request , cancellationToken ) ;
@@ -325,7 +343,7 @@ public async Task SendNotificationAsync(PushSubscription subscription, string pa
325
343
/// <param name="vapidDetails">The vapid details for the notification.</param>
326
344
/// <param name="cancellationToken"></param>
327
345
public async Task SendNotificationAsync ( PushSubscription subscription , string payload ,
328
- VapidDetails vapidDetails , CancellationToken cancellationToken = default )
346
+ VapidDetails vapidDetails , CancellationToken cancellationToken = default )
329
347
{
330
348
var options = new Dictionary < string , object > { [ "vapidDetails" ] = vapidDetails } ;
331
349
await SendNotificationAsync ( subscription , payload , options , cancellationToken ) ;
@@ -339,7 +357,7 @@ public async Task SendNotificationAsync(PushSubscription subscription, string pa
339
357
/// <param name="payload">The payload you wish to send to the user</param>
340
358
/// <param name="gcmApiKey">The GCM API key</param>
341
359
/// <param name="cancellationToken"></param>
342
- 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 )
343
361
{
344
362
var options = new Dictionary < string , object > { [ "gcmAPIKey" ] = gcmApiKey } ;
345
363
await SendNotificationAsync ( subscription , payload , options , cancellationToken ) ;
0 commit comments