Skip to content

Commit 25dffc3

Browse files
committed
Add StatusCode and Uri to HttpClientException for ease of use
1 parent f678a62 commit 25dffc3

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

src/StackExchange.Utils.Http/Extensions.Modifier.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public static IRequestBuilder AddHeader(this IRequestBuilder builder, string nam
9090
}
9191
catch (Exception e)
9292
{
93-
var wrapper = new HttpClientException("Unable to set header: " + name + " to '" + value + "'", e);
93+
var wrapper = new HttpClientException("Unable to set header: " + name + " to '" + value + "'", builder.Message.RequestUri, e);
9494
builder.GetSettings().OnException(builder, new HttpExceptionArgs(builder, wrapper));
9595
}
9696
}
@@ -131,7 +131,7 @@ public static IRequestBuilder AddHeaders(this IRequestBuilder builder, IDictiona
131131
}
132132
catch (Exception e)
133133
{
134-
var wrapper = new HttpClientException("Unable to set header: " + kv.Key + " to '" + kv.Value + "'", e);
134+
var wrapper = new HttpClientException("Unable to set header: " + kv.Key + " to '" + kv.Value + "'", builder.Message.RequestUri, e);
135135
builder.GetSettings().OnException(builder, new HttpExceptionArgs(builder, wrapper));
136136
}
137137
}

src/StackExchange.Utils.Http/Http.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ internal static async Task<HttpCallResponse<T>> SendAsync<T>(IRequestBuilder<T>
6262
// This isn't ideal cntrol flow behavior, but it's the only way to get proper stacks
6363
if (!response.IsSuccessStatusCode && !builder.Inner.IgnoredResponseStatuses.Contains(response.StatusCode))
6464
{
65-
exception = new HttpClientException($"Response code was {(int)response.StatusCode} ({response.StatusCode}) from {response.RequestMessage.RequestUri}: {response.ReasonPhrase}");
65+
exception = new HttpClientException($"Response code was {(int)response.StatusCode} ({response.StatusCode}) from {response.RequestMessage.RequestUri}: {response.ReasonPhrase}", response.StatusCode, response.RequestMessage.RequestUri);
6666
stackTraceString.SetValue(exception, new StackTrace(true).ToString());
6767
}
6868
else
@@ -76,8 +76,8 @@ internal static async Task<HttpCallResponse<T>> SendAsync<T>(IRequestBuilder<T>
7676
catch (TaskCanceledException ex)
7777
{
7878
exception = cancellationToken.IsCancellationRequested
79-
? new HttpClientException("HttpClient request cancelled by token request.", ex)
80-
: new HttpClientException("HttpClient request timed out. Timeout: " + builder.Inner.Timeout.TotalMilliseconds.ToString("N0") + "ms", ex);
79+
? new HttpClientException("HttpClient request cancelled by token request.", builder.Inner.Message.RequestUri, ex)
80+
: new HttpClientException("HttpClient request timed out. Timeout: " + builder.Inner.Timeout.TotalMilliseconds.ToString("N0") + "ms", builder.Inner.Message.RequestUri, ex);
8181
}
8282
catch (Exception ex)
8383
{

src/StackExchange.Utils.Http/HttpCallResponse.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected HttpCallResponse(HttpResponseMessage response, Exception error) : this
8282
/// <returns>The created <see cref="HttpCallResponse{T}"/>.</returns>
8383
public static HttpCallResponse<T> Create<T>(HttpRequestMessage request, Exception error = null)
8484
{
85-
error = (error ?? new HttpClientException("Failed to send request for " + request.RequestUri))
85+
error = (error ?? new HttpClientException("Failed to send request for " + request.RequestUri, request.RequestUri))
8686
// Add these regardless of source
8787
.AddLoggedData("Request URI", request.RequestUri);
8888

src/StackExchange.Utils.Http/HttpClientException.cs

+27
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Net;
23
using System.Runtime.Serialization;
34

45
namespace StackExchange.Utils
@@ -8,9 +9,35 @@ namespace StackExchange.Utils
89
/// </summary>
910
public class HttpClientException : Exception
1011
{
12+
/// <summary>
13+
/// The status code, if known, for this exception.
14+
/// </summary>
15+
public HttpStatusCode? StatusCode { get; }
16+
17+
/// <summary>
18+
/// The requested URI, if known, for this exception.
19+
/// </summary>
20+
public Uri Uri { get; }
21+
1122
internal HttpClientException() { }
1223
internal HttpClientException(string message) : base(message) { }
1324
internal HttpClientException(string message, Exception innerException) : base(message, innerException) { }
1425
internal HttpClientException(SerializationInfo info, StreamingContext context) : base(info, context) { }
26+
27+
internal HttpClientException(string message, HttpStatusCode statusCode, Uri uri) : base(message)
28+
{
29+
StatusCode = statusCode;
30+
Uri = uri;
31+
}
32+
33+
internal HttpClientException(string message, Uri uri) : base(message)
34+
{
35+
Uri = uri;
36+
}
37+
38+
internal HttpClientException(string message, Uri uri, Exception innerException) : base(message, innerException)
39+
{
40+
Uri = uri;
41+
}
1542
}
1643
}

0 commit comments

Comments
 (0)