Skip to content

Commit 5c4d635

Browse files
inikulshinIlya Nikulshin
andauthored
UnexpectedHttpStatusCodeException: more verbose message (#333)
* UnexpectedHttpStatusCodeException: more verbose message * Fix * FromHttpResponseMessageAsync * Fix --------- Co-authored-by: Ilya Nikulshin <[email protected]>
1 parent 109778f commit 5c4d635

File tree

4 files changed

+61
-26
lines changed

4 files changed

+61
-26
lines changed

Source/EasyNetQ.Management.Client.ApprovalTests/EasyNetQ.Management.Client.approved.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,13 +425,13 @@ namespace EasyNetQ.Management.Client
425425
public class UnexpectedHttpStatusCodeException : System.Exception
426426
{
427427
public UnexpectedHttpStatusCodeException() { }
428-
public UnexpectedHttpStatusCodeException(System.Net.Http.HttpResponseMessage response) { }
429-
public UnexpectedHttpStatusCodeException(System.Net.HttpStatusCode statusCode) { }
430428
public UnexpectedHttpStatusCodeException(string message) { }
431429
protected UnexpectedHttpStatusCodeException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { }
432430
public UnexpectedHttpStatusCodeException(string message, System.Exception inner) { }
431+
protected UnexpectedHttpStatusCodeException(string message, System.Net.HttpStatusCode statusCode) { }
433432
public System.Net.HttpStatusCode StatusCode { get; }
434433
public int StatusCodeNumber { get; }
434+
public static System.Threading.Tasks.Task<EasyNetQ.Management.Client.UnexpectedHttpStatusCodeException> FromHttpResponseMessageAsync(System.Net.Http.HttpResponseMessage response, System.Threading.CancellationToken cancellationToken = default) { }
435435
}
436436
}
437437
namespace EasyNetQ.Management.Client.Model
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System.Net;
2+
using System.Threading;
23

34
namespace EasyNetQ.Management.Client.Internals;
45

56
internal static class HttpResponseMessageExtensions
67
{
7-
public static void EnsureExpectedStatusCode(this HttpResponseMessage response, Func<HttpStatusCode, bool> isExpected)
8+
public static async Task EnsureExpectedStatusCodeAsync(this HttpResponseMessage response, Func<HttpStatusCode, bool> isExpected, CancellationToken cancellationToken = default)
89
{
910
if (!isExpected(response.StatusCode))
10-
throw new UnexpectedHttpStatusCodeException(response);
11+
throw await UnexpectedHttpStatusCodeException.FromHttpResponseMessageAsync(response, cancellationToken).ConfigureAwait(false);
1112
}
1213
}

Source/EasyNetQ.Management.Client/ManagementClient.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public async Task<bool> CheckAsync(
182182
if (response.StatusCode == HttpStatusCode.ServiceUnavailable)
183183
return false;
184184

185-
throw new UnexpectedHttpStatusCodeException(response);
185+
throw await UnexpectedHttpStatusCodeException.FromHttpResponseMessageAsync(response, cancellationToken).ConfigureAwait(false);
186186
}
187187

188188
public async Task<TResult> GetAsync<TResult>(
@@ -194,7 +194,7 @@ public async Task<TResult> GetAsync<TResult>(
194194
using var request = CreateRequest(HttpMethod.Get, path, queryParameters);
195195
using var response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
196196

197-
response.EnsureExpectedStatusCode(statusCode => statusCode == HttpStatusCode.OK);
197+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode == HttpStatusCode.OK, cancellationToken).ConfigureAwait(false);
198198

199199
try
200200
{
@@ -217,7 +217,7 @@ public async Task<TResult> PostAsync<TItem, TResult>(
217217
using var request = CreateRequest(HttpMethod.Post, path, null, requestContent);
218218
using var response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
219219

220-
response.EnsureExpectedStatusCode(statusCode => statusCode is HttpStatusCode.OK or HttpStatusCode.Created or HttpStatusCode.NoContent);
220+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode is HttpStatusCode.OK or HttpStatusCode.Created or HttpStatusCode.NoContent, cancellationToken).ConfigureAwait(false);
221221

222222
try
223223
{
@@ -240,7 +240,7 @@ public async Task PostAsync<TItem>(
240240
using var request = CreateRequest(HttpMethod.Post, path, null, requestContent);
241241
using var response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
242242

243-
response.EnsureExpectedStatusCode(statusCode => statusCode is HttpStatusCode.OK or HttpStatusCode.Created or HttpStatusCode.NoContent);
243+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode is HttpStatusCode.OK or HttpStatusCode.Created or HttpStatusCode.NoContent, cancellationToken).ConfigureAwait(false);
244244
}
245245

246246
public async Task PostAsync(
@@ -251,15 +251,15 @@ public async Task PostAsync(
251251
using var request = CreateRequest(HttpMethod.Post, path);
252252
using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
253253

254-
response.EnsureExpectedStatusCode(statusCode => statusCode is HttpStatusCode.OK or HttpStatusCode.Created or HttpStatusCode.NoContent);
254+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode is HttpStatusCode.OK or HttpStatusCode.Created or HttpStatusCode.NoContent, cancellationToken).ConfigureAwait(false);
255255
}
256256

257257
public async Task DeleteAsync(RelativePath path, CancellationToken cancellationToken = default)
258258
{
259259
using var request = CreateRequest(HttpMethod.Delete, path);
260260
using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
261261

262-
response.EnsureExpectedStatusCode(statusCode => statusCode == HttpStatusCode.NoContent);
262+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode == HttpStatusCode.NoContent, cancellationToken).ConfigureAwait(false);
263263
}
264264

265265
public async Task PutAsync<TBody>(
@@ -272,15 +272,15 @@ public async Task PutAsync<TBody>(
272272
using var request = CreateRequest(HttpMethod.Put, path, null, requestContent);
273273
using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
274274

275-
response.EnsureExpectedStatusCode(statusCode => statusCode is HttpStatusCode.Created or HttpStatusCode.NoContent);
275+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode is HttpStatusCode.Created or HttpStatusCode.NoContent, cancellationToken).ConfigureAwait(false);
276276
}
277277

278278
public async Task PutAsync(RelativePath path, CancellationToken cancellationToken = default)
279279
{
280280
using var request = CreateRequest(HttpMethod.Put, path);
281281
using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
282282

283-
response.EnsureExpectedStatusCode(statusCode => statusCode is HttpStatusCode.Created or HttpStatusCode.NoContent);
283+
await response.EnsureExpectedStatusCodeAsync(statusCode => statusCode is HttpStatusCode.Created or HttpStatusCode.NoContent, cancellationToken).ConfigureAwait(false);
284284
}
285285

286286
private HttpRequestMessage CreateRequest(
Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Net;
22
using System.Runtime.Serialization;
3+
using System.Text;
34

45
namespace EasyNetQ.Management.Client;
56

@@ -13,27 +14,13 @@ public class UnexpectedHttpStatusCodeException : Exception
1314
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
1415
//
1516

16-
private const string NoRequest = "<null>";
17-
1817
public HttpStatusCode StatusCode { get; private init; }
1918
public int StatusCodeNumber => (int)StatusCode;
2019

2120
public UnexpectedHttpStatusCodeException()
2221
{
2322
}
2423

25-
public UnexpectedHttpStatusCodeException(HttpStatusCode statusCode) :
26-
base($"Unexpected Status Code: {(int)statusCode} {statusCode}")
27-
{
28-
StatusCode = statusCode;
29-
}
30-
31-
public UnexpectedHttpStatusCodeException(HttpResponseMessage response) :
32-
base($"Unexpected Status Code: {(int)response.StatusCode} {response.StatusCode} from request: {response.RequestMessage?.ToString() ?? NoRequest}")
33-
{
34-
StatusCode = response.StatusCode;
35-
}
36-
3724
public UnexpectedHttpStatusCodeException(string message) : base(message)
3825
{
3926
}
@@ -48,4 +35,51 @@ StreamingContext context
4835
) : base(info, context)
4936
{
5037
}
38+
39+
protected UnexpectedHttpStatusCodeException(string message, HttpStatusCode statusCode) : base(message)
40+
{
41+
StatusCode = statusCode;
42+
}
43+
44+
public static async Task<UnexpectedHttpStatusCodeException> FromHttpResponseMessageAsync(HttpResponseMessage response, CancellationToken cancellationToken = default)
45+
{
46+
var sb = new StringBuilder("Unexpected response: StatusCode: ");
47+
sb.Append((int)response.StatusCode);
48+
sb.Append(" ");
49+
sb.Append(response.StatusCode);
50+
sb.Append(", Content: ");
51+
if (response.Content != null)
52+
{
53+
try
54+
{
55+
#if NET5_0_OR_GREATER
56+
var content = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
57+
#else
58+
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
59+
#endif
60+
sb.Append('\'');
61+
sb.Append(content);
62+
sb.Append('\'');
63+
}
64+
catch
65+
{
66+
sb.Append("<not a string>");
67+
}
68+
}
69+
else
70+
{
71+
sb.Append("<null>");
72+
}
73+
sb.Append(" from request: ");
74+
if (response.RequestMessage != null)
75+
{
76+
sb.Append(response.RequestMessage);
77+
}
78+
else
79+
{
80+
sb.Append("<null>");
81+
}
82+
83+
return new UnexpectedHttpStatusCodeException(sb.ToString(), response.StatusCode);
84+
}
5185
}

0 commit comments

Comments
 (0)