Skip to content

Commit 814656b

Browse files
Make sure to close web response when a WebException occurs when sending heartbeat
1 parent c3118c6 commit 814656b

File tree

1 file changed

+48
-52
lines changed

1 file changed

+48
-52
lines changed

fCraft/Network/Heartbeat.cs

Lines changed: 48 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -95,22 +95,21 @@ static void Beat([NotNull] SchedulerTask scheduledTask)
9595

9696
static HttpWebRequest heartBeatRequest;
9797

98-
static void SendHeartBeat()
99-
{
98+
static void SendHeartBeat() {
10099
HeartbeatData data = new HeartbeatData(HeartbeatServerUrl);
101-
if (!RaiseHeartbeatSendingEvent(data, HeartbeatServerUrl))
102-
{
100+
if (!RaiseHeartbeatSendingEvent(data, HeartbeatServerUrl)) {
103101
return;
104102
}
103+
105104
try {
106105
heartBeatRequest = CreateRequest(data.CreateUri());
107-
} catch (Exception UriFormatException) {
108-
Logger.Log(LogType.Debug, UriFormatException.ToString());
109-
return;
110-
}
111-
var state = new HeartbeatRequestState(heartBeatRequest, data);
112-
heartBeatRequest.BeginGetResponse(ResponseCallback, state);
106+
} catch (Exception UriFormatException) {
107+
Logger.Log(LogType.Debug, UriFormatException.ToString());
108+
return;
109+
}
113110

111+
var state = new HeartbeatRequestState(heartBeatRequest, data);
112+
heartBeatRequest.BeginGetResponse(ResponseCallback, state);
114113
}
115114

116115

@@ -125,18 +124,15 @@ public static HttpWebRequest CreateRequest([NotNull] Uri uri) {
125124

126125

127126
// Called when the heartbeat server responds.
128-
static void ResponseCallback([NotNull] IAsyncResult result)
129-
{
127+
static void ResponseCallback([NotNull] IAsyncResult result) {
130128
if (Server.IsShuttingDown) return;
131129
HeartbeatRequestState state = (HeartbeatRequestState)result.AsyncState;
132-
try
133-
{
130+
131+
try {
134132
string responseText;
135-
using (HttpWebResponse response = (HttpWebResponse)state.Request.EndGetResponse(result))
136-
{
133+
using (HttpWebResponse response = (HttpWebResponse)state.Request.EndGetResponse(result)) {
137134
// ReSharper disable AssignNullToNotNullAttribute
138-
using (StreamReader responseReader = new StreamReader(response.GetResponseStream()))
139-
{
135+
using (StreamReader responseReader = new StreamReader(response.GetResponseStream())) {
140136
// ReSharper restore AssignNullToNotNullAttribute
141137
responseText = responseReader.ReadToEnd();
142138
}
@@ -145,43 +141,43 @@ static void ResponseCallback([NotNull] IAsyncResult result)
145141

146142
// try parse response as server Url, if needed
147143
string replyString = responseText.Trim();
148-
if (replyString.CaselessStarts("bad heartbeat"))
149-
{
150-
Logger.Log(LogType.Error, "Heartbeat: {0}", replyString);
151-
}
152-
else
153-
{
154-
try
155-
{
156-
Uri newUri = new Uri(replyString);
157-
Uri oldUri = Url;
158-
if (newUri != oldUri)
159-
{
160-
Url = newUri;
161-
RaiseUriChangedEvent(oldUri, newUri);
162-
}
163-
}
164-
catch (UriFormatException)
165-
{
166-
Logger.Log(LogType.Error,
167-
"Heartbeat: Server replied with: {0}",
168-
replyString);
144+
ParseHeartbeatResponse(replyString);
145+
} catch (Exception ex) {
146+
LogHeartbeatError(state, ex);
147+
}
148+
}
149+
150+
static void ParseHeartbeatResponse( string replyString ) {
151+
if (replyString.CaselessStarts("bad heartbeat")) {
152+
Logger.Log(LogType.Error, "Heartbeat: {0}", replyString);
153+
} else {
154+
try {
155+
Uri newUri = new Uri(replyString);
156+
Uri oldUri = Url;
157+
if (newUri != oldUri) {
158+
Url = newUri;
159+
RaiseUriChangedEvent(oldUri, newUri);
169160
}
161+
} catch (UriFormatException) {
162+
Logger.Log(LogType.Error, "Heartbeat: Server replied with: {0}", replyString);
170163
}
171164
}
172-
catch (Exception ex)
173-
{
174-
if (ex is WebException || ex is IOException)
175-
{
176-
Logger.Log(LogType.Warning,
177-
"Heartbeat: {0} is probably down ({1})",
178-
state.Request.RequestUri.Host,
179-
ex.Message);
180-
}
181-
else
182-
{
183-
Logger.Log(LogType.Error, "Heartbeat: {0}", ex);
184-
}
165+
}
166+
167+
static void LogHeartbeatError(HeartbeatRequestState state, Exception ex) {
168+
if (ex is WebException || ex is IOException) {
169+
string host = state.Request.RequestUri.Host;
170+
Logger.Log(LogType.Warning, "Heartbeat: {0} is probably down ({1})", host, ex.Message);
171+
172+
// avoid leaking resources in case of error
173+
try {
174+
WebException webEx = ex as WebException;
175+
if (webEx != null && webEx.Response != null) {
176+
webEx.Response.Close();
177+
}
178+
} catch { }
179+
} else {
180+
Logger.Log(LogType.Error, "Heartbeat: {0}", ex);
185181
}
186182
}
187183

0 commit comments

Comments
 (0)