Skip to content

Commit 88d4fb1

Browse files
committed
#59, #63 Include response content in WebPushException & Improve the error message when the request fails
1 parent 9c9b612 commit 88d4fb1

File tree

3 files changed

+35
-18
lines changed

3 files changed

+35
-18
lines changed

WebPush.Test/WebPushClientTest.cs

+17-6
Original file line numberDiff line numberDiff line change
@@ -138,24 +138,35 @@ public void TestHandlingSuccessHttpCodes(HttpStatusCode status)
138138
[TestMethod]
139139
[DataRow(HttpStatusCode.BadRequest, "Bad Request")]
140140
[DataRow(HttpStatusCode.RequestEntityTooLarge, "Payload too large")]
141-
[DataRow((HttpStatusCode)429, "Too many request.")]
141+
[DataRow((HttpStatusCode)429, "Too many request")]
142142
[DataRow(HttpStatusCode.NotFound, "Subscription no longer valid")]
143143
[DataRow(HttpStatusCode.Gone, "Subscription no longer valid")]
144144
[DataRow(HttpStatusCode.InternalServerError, "Received unexpected response code: 500")]
145145
public void TestHandlingFailureHttpCodes(HttpStatusCode status, string expectedMessage)
146146
{
147147
var actual = Assert.ThrowsException<WebPushException>(() => TestSendNotification(status));
148-
149148
Assert.AreEqual(expectedMessage, actual.Message);
150149
}
151150

152-
private void TestSendNotification(HttpStatusCode status)
151+
[TestMethod]
152+
[DataRow(HttpStatusCode.BadRequest, "authorization key missing", "Bad Request. Details: authorization key missing")]
153+
[DataRow(HttpStatusCode.RequestEntityTooLarge, "max size is 512", "Payload too large. Details: max size is 512")]
154+
[DataRow((HttpStatusCode)429, "the api is limited", "Too many request. Details: the api is limited")]
155+
[DataRow(HttpStatusCode.NotFound, "", "Subscription no longer valid")]
156+
[DataRow(HttpStatusCode.Gone, "", "Subscription no longer valid")]
157+
[DataRow(HttpStatusCode.InternalServerError, "internal error", "Received unexpected response code: 500. Details: internal error")]
158+
public void TestHandlingFailureMessages(HttpStatusCode status, string response, string expectedMessage)
153159
{
154-
var subscription = new PushSubscription(TestFcmEndpoint, TestPublicKey, TestPrivateKey); ;
155-
httpMessageHandlerMock.When(TestFcmEndpoint).Respond(status);
160+
var actual = Assert.ThrowsException<WebPushException>(() => TestSendNotification(status, response));
161+
Assert.AreEqual(expectedMessage, actual.Message);
162+
}
156163

164+
private void TestSendNotification(HttpStatusCode status, string response=null)
165+
{
166+
var subscription = new PushSubscription(TestFcmEndpoint, TestPublicKey, TestPrivateKey);
167+
var httpContent = response == null ? null : new StringContent(response);
168+
httpMessageHandlerMock.When(TestFcmEndpoint).Respond(new HttpResponseMessage { StatusCode = status, Content = httpContent });
157169
client.SetVapidDetails(TestSubject, TestPublicKey, TestPrivateKey);
158-
159170
client.SendNotification(subscription, "123");
160171
}
161172
}

WebPush/Model/WebPushException.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
using System;
22
using System.Net;
3+
using System.Net.Http;
34
using System.Net.Http.Headers;
45

56
namespace WebPush
67
{
78
public class WebPushException : Exception
89
{
9-
public WebPushException(string message, HttpStatusCode statusCode, HttpResponseHeaders headers,
10-
PushSubscription pushSubscription) : base(message)
10+
public WebPushException(string message, PushSubscription pushSubscription, HttpResponseMessage responseMessage) : base(message)
1111
{
12-
StatusCode = statusCode;
13-
Headers = headers;
1412
PushSubscription = pushSubscription;
13+
HttpResponseMessage = responseMessage;
1514
}
1615

17-
public HttpStatusCode StatusCode { get; set; }
18-
public HttpResponseHeaders Headers { get; set; }
16+
public HttpStatusCode StatusCode => HttpResponseMessage.StatusCode;
17+
18+
public HttpResponseHeaders Headers => HttpResponseMessage.Headers;
1919
public PushSubscription PushSubscription { get; set; }
20+
public HttpResponseMessage HttpResponseMessage { get; set; }
2021
}
2122
}

WebPush/WebPushClient.cs

+11-6
Original file line numberDiff line numberDiff line change
@@ -359,28 +359,33 @@ private static void HandleResponse(HttpResponseMessage response, PushSubscriptio
359359
}
360360

361361
// Error
362-
var message = @"Received unexpected response code: " + (int)response.StatusCode;
362+
var responseCodeMessage = @"Received unexpected response code: " + (int)response.StatusCode;
363363
switch (response.StatusCode)
364364
{
365365
case HttpStatusCode.BadRequest:
366-
message = "Bad Request";
366+
responseCodeMessage = "Bad Request";
367367
break;
368368

369369
case HttpStatusCode.RequestEntityTooLarge:
370-
message = "Payload too large";
370+
responseCodeMessage = "Payload too large";
371371
break;
372372

373373
case (HttpStatusCode)429:
374-
message = "Too many request.";
374+
responseCodeMessage = "Too many request";
375375
break;
376376

377377
case HttpStatusCode.NotFound:
378378
case HttpStatusCode.Gone:
379-
message = "Subscription no longer valid";
379+
responseCodeMessage = "Subscription no longer valid";
380380
break;
381381
}
382382

383-
throw new WebPushException(message, response.StatusCode, response.Headers, subscription);
383+
var details = response.Content?.ReadAsStringAsync().GetAwaiter().GetResult();
384+
var message = string.IsNullOrEmpty(details)
385+
? responseCodeMessage
386+
: $"{responseCodeMessage}. Details: {details}";
387+
388+
throw new WebPushException(message, subscription, response);
384389
}
385390

386391
public void Dispose()

0 commit comments

Comments
 (0)