Skip to content

Commit 980b36b

Browse files
authored
Merge pull request #103 from bugsnag/martin308/improved-http-exception-handling
improved http exception handling
2 parents 92de4ea + 64dc5af commit 980b36b

File tree

1 file changed

+37
-22
lines changed

1 file changed

+37
-22
lines changed

src/Bugsnag/WebRequest.cs

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ public class WebRequest
1010
{
1111
private class WebRequestState
1212
{
13-
public AsyncCallback Callback { get; private set; }
13+
public AsyncCallback Callback { get; }
1414

15-
public object OriginalState { get; private set; }
15+
public object OriginalState { get; }
1616

17-
public Uri Endpoint { get; private set; }
17+
public Uri Endpoint { get; }
1818

19-
public byte[] Report { get; private set; }
19+
public byte[] Report { get; }
2020

21-
public System.Net.WebRequest Request { get; private set; }
21+
public System.Net.WebRequest Request { get; }
2222

2323
public HttpWebResponse Response { get; set; }
2424

25+
public WebException Exception { get; set; }
26+
2527
public WebRequestState(AsyncCallback callback, object state, Uri endpoint, byte[] report, System.Net.WebRequest request)
2628
{
2729
Callback = callback;
@@ -34,29 +36,31 @@ public WebRequestState(AsyncCallback callback, object state, Uri endpoint, byte[
3436

3537
private class WebRequestAsyncResult : IAsyncResult
3638
{
37-
public bool IsCompleted { get { return _innerAsyncResult.IsCompleted; } }
39+
public bool IsCompleted => InnerAsyncResult.IsCompleted;
3840

39-
public WaitHandle AsyncWaitHandle { get { return _innerAsyncResult.AsyncWaitHandle; } }
41+
public WaitHandle AsyncWaitHandle => InnerAsyncResult.AsyncWaitHandle;
4042

4143
public object AsyncState => WebRequestState.OriginalState;
4244

43-
public bool CompletedSynchronously { get { return _innerAsyncResult.CompletedSynchronously; } }
45+
public bool CompletedSynchronously => InnerAsyncResult.CompletedSynchronously;
4446

45-
public WebRequestState WebRequestState => _webRequestState;
47+
public WebRequestState WebRequestState { get; }
4648

47-
private readonly IAsyncResult _innerAsyncResult;
48-
private readonly WebRequestState _webRequestState;
49+
private IAsyncResult InnerAsyncResult { get; }
4950

5051
public WebRequestAsyncResult(IAsyncResult innerAsyncResult, WebRequestState webRequestState)
5152
{
52-
_innerAsyncResult = innerAsyncResult;
53-
_webRequestState = webRequestState;
53+
InnerAsyncResult = innerAsyncResult;
54+
WebRequestState = webRequestState;
5455
}
5556
}
5657

5758
public IAsyncResult BeginSend(Uri endpoint, IWebProxy proxy, KeyValuePair<string, string>[] headers, byte[] report, AsyncCallback callback, object state)
5859
{
59-
var request = System.Net.WebRequest.Create(endpoint);
60+
var request = (HttpWebRequest)System.Net.WebRequest.Create(endpoint);
61+
#if !NETSTANDARD1_3
62+
request.KeepAlive = false;
63+
#endif
6064
request.Method = "POST";
6165
request.ContentType = "application/json";
6266
if (proxy != null)
@@ -80,8 +84,18 @@ public WebResponse EndSend(IAsyncResult asyncResult)
8084
{
8185
if (asyncResult is WebRequestAsyncResult result)
8286
{
83-
var statusCode = result.WebRequestState.Response.StatusCode;
84-
return new WebResponse(statusCode);
87+
if (result.WebRequestState.Response != null)
88+
{
89+
return new WebResponse(result.WebRequestState.Response.StatusCode);
90+
}
91+
92+
if (result.WebRequestState.Exception != null)
93+
{
94+
if (result.WebRequestState.Exception.Response is HttpWebResponse response)
95+
{
96+
return new WebResponse(response.StatusCode);
97+
}
98+
}
8599
}
86100

87101
return null;
@@ -101,7 +115,7 @@ private void ReadCallback(IAsyncResult asynchronousResult)
101115
}
102116
catch (WebException exception)
103117
{
104-
state.Response = exception.Response as HttpWebResponse;
118+
state.Exception = exception;
105119
}
106120

107121
state.Callback(new WebRequestAsyncResult(asynchronousResult, state));
@@ -119,7 +133,10 @@ private void WriteCallback(IAsyncResult asynchronousResult)
119133
}
120134
catch (WebException exception)
121135
{
122-
state.Response = exception.Response as HttpWebResponse;
136+
state.Exception = exception;
137+
// call the original callback as we cannot continue sending the report
138+
state.Callback(new WebRequestAsyncResult(asynchronousResult, state));
139+
return;
123140
}
124141

125142
state.Request.BeginGetResponse(new AsyncCallback(ReadCallback), state);
@@ -128,13 +145,11 @@ private void WriteCallback(IAsyncResult asynchronousResult)
128145

129146
public class WebResponse
130147
{
131-
private readonly HttpStatusCode _httpStatusCode;
148+
public HttpStatusCode HttpStatusCode { get; }
132149

133150
public WebResponse(HttpStatusCode httpStatusCode)
134151
{
135-
_httpStatusCode = httpStatusCode;
152+
HttpStatusCode = httpStatusCode;
136153
}
137-
138-
public HttpStatusCode HttpStatusCode => _httpStatusCode;
139154
}
140155
}

0 commit comments

Comments
 (0)