Skip to content

Commit 5999cd7

Browse files
committed
Refactor web request handling to use async/await
1 parent 2916fe6 commit 5999cd7

File tree

3 files changed

+55
-139
lines changed

3 files changed

+55
-139
lines changed

Runtime/Scripts/Core/Request/WebRequestInternal.cs

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Text;
5+
using System.Threading;
6+
using System.Threading.Tasks;
57
using JetBrains.Annotations;
68
using UnityEngine;
79
using UnityEngine.Networking;
@@ -24,6 +26,7 @@ public class WebRequestInternal
2426

2527
private int _requestTimeOutDuration;
2628
private int _requestAttempts;
29+
private CancellationTokenSource _cancellationTokenSource;
2730

2831
public WebRequestInternal(WebRequest.Configuration configuration)
2932
{
@@ -47,7 +50,8 @@ private void StartRequest()
4750
if (RequestState == WebRequestState.None)
4851
{
4952
RequestState = WebRequestState.Pending;
50-
WebRequestManager.Instance.StartRequest(this, RequestRoutine());
53+
_cancellationTokenSource = new CancellationTokenSource();
54+
RequestRoutineAsync(_cancellationTokenSource.Token);
5155
}
5256
}
5357

@@ -56,7 +60,8 @@ private void StopRequest()
5660
if (RequestState == WebRequestState.Pending)
5761
{
5862
RequestState = WebRequestState.None;
59-
WebRequestManager.Instance.StopRequest(this);
63+
_cancellationTokenSource?.Cancel();
64+
_request?.Abort();
6065
DisposeRequest(true);
6166
}
6267
}
@@ -72,7 +77,8 @@ private void RestartRequest()
7277
OnRequestWillRestart?.Invoke(_requestAttempts);
7378

7479
SetUpRequestConfiguration(_configuration);
75-
WebRequestManager.Instance.RestartRequest(this, RequestRoutine());
80+
_cancellationTokenSource = new CancellationTokenSource();
81+
RequestRoutineAsync(_cancellationTokenSource.Token);
7682
}
7783
}
7884

@@ -116,57 +122,70 @@ private bool SetUpRequestConfiguration(WebRequest.Configuration configuration)
116122
return configured;
117123
}
118124

119-
private IEnumerator RequestRoutine()
125+
private async Task RequestRoutineAsync(CancellationToken cancellationToken)
120126
{
121-
if (RequestState == WebRequestState.Pending)
127+
try
122128
{
123-
_requestTimeOutDuration = RequestTimeOut + (RequestTimeOut / 2 * _requestAttempts);
124-
_requestAttempts++;
125-
126-
_request.SendWebRequest();
127-
}
129+
if (RequestState == WebRequestState.Pending)
130+
{
131+
_requestTimeOutDuration = RequestTimeOut + (RequestTimeOut / 2 * _requestAttempts);
132+
_requestAttempts++;
128133

129-
float requestProgress = -1f;
130-
float requestStuckTime = 0f;
134+
var operation = _request.SendWebRequest();
135+
}
131136

132-
while (!_request.isDone)
133-
{
134-
bool requestNotProgressing = Mathf.Approximately(requestProgress, _request.uploadProgress + _request.downloadProgress);
137+
float requestProgress = -1f;
138+
float requestStuckTime = 0f;
135139

136-
if (requestNotProgressing)
140+
while (!_request.isDone)
137141
{
138-
requestStuckTime += Time.deltaTime;
142+
cancellationToken.ThrowIfCancellationRequested();
143+
144+
bool requestNotProgressing = Mathf.Approximately(requestProgress, _request.uploadProgress + _request.downloadProgress);
139145

140-
if (requestStuckTime >= _requestTimeOutDuration)
146+
if (requestNotProgressing)
141147
{
142-
RequestState = WebRequestState.Timeout;
143-
HandleOnRequestTimeOut();
148+
requestStuckTime += Time.deltaTime;
149+
150+
if (requestStuckTime >= _requestTimeOutDuration)
151+
{
152+
RequestState = WebRequestState.Timeout;
153+
HandleOnRequestTimeOut();
144154

145-
yield break;
155+
return;
156+
}
146157
}
158+
else
159+
{
160+
requestStuckTime = 0f;
161+
requestProgress = _request.uploadProgress + _request.downloadProgress;
162+
}
163+
164+
await Task.Yield();
165+
}
166+
167+
RequestState = WebRequestState.Completed;
168+
169+
if (_request.result is UnityWebRequest.Result.ConnectionError or UnityWebRequest.Result.DataProcessingError or UnityWebRequest.Result.ProtocolError)
170+
{
171+
JoystickLogger.LogError($"Request result: {_request.result} | ErrorInfo: {_request.error} | Url: {_request.url}");
147172
}
148173
else
149174
{
150-
requestStuckTime = 0f;
151-
requestProgress = _request.uploadProgress + _request.downloadProgress;
175+
JoystickLogger.Log($"Url: {_request.url} | Response Code:{_request.responseCode} | Response Data: {_request.downloadHandler.text}");
152176
}
153177

154-
yield return null;
178+
HandleOnRequestDone();
179+
DisposeRequest(true);
155180
}
156-
157-
RequestState = WebRequestState.Completed;
158-
159-
if (_request.result is UnityWebRequest.Result.ConnectionError or UnityWebRequest.Result.DataProcessingError or UnityWebRequest.Result.ProtocolError)
181+
catch (OperationCanceledException)
160182
{
161-
JoystickLogger.LogError($"Request result: {_request.result} | ErrorInfo: {_request.error} | Url: {_request.url}");
183+
JoystickLogger.Log("Request was cancelled.");
162184
}
163-
else
185+
catch (Exception e)
164186
{
165-
JoystickLogger.Log($"Url: {_request.url} | Response Code:{_request.responseCode} | Response Data: {_request.downloadHandler.text}");
187+
JoystickLogger.LogError($"An error occurred during the request: {e.Message}");
166188
}
167-
168-
HandleOnRequestDone();
169-
DisposeRequest(true);
170189
}
171190

172191
private void HandleOnRequestTimeOut()
@@ -224,6 +243,8 @@ private void DisposeRequest(bool disposeUploadHandler)
224243
_request.disposeUploadHandlerOnDispose = disposeUploadHandler;
225244
_request.Dispose();
226245
_request = null;
246+
_cancellationTokenSource?.Dispose();
247+
_cancellationTokenSource = null;
227248
}
228249
}
229250
}

Runtime/Scripts/Core/Request/WebRequestManager.cs

Lines changed: 0 additions & 94 deletions
This file was deleted.

Runtime/Scripts/Core/Request/WebRequestManager.cs.meta

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)