2
2
using System . Collections ;
3
3
using System . Collections . Generic ;
4
4
using System . Text ;
5
+ using System . Threading ;
6
+ using System . Threading . Tasks ;
5
7
using JetBrains . Annotations ;
6
8
using UnityEngine ;
7
9
using UnityEngine . Networking ;
@@ -24,6 +26,7 @@ public class WebRequestInternal
24
26
25
27
private int _requestTimeOutDuration ;
26
28
private int _requestAttempts ;
29
+ private CancellationTokenSource _cancellationTokenSource ;
27
30
28
31
public WebRequestInternal ( WebRequest . Configuration configuration )
29
32
{
@@ -47,7 +50,8 @@ private void StartRequest()
47
50
if ( RequestState == WebRequestState . None )
48
51
{
49
52
RequestState = WebRequestState . Pending ;
50
- WebRequestManager . Instance . StartRequest ( this , RequestRoutine ( ) ) ;
53
+ _cancellationTokenSource = new CancellationTokenSource ( ) ;
54
+ RequestRoutineAsync ( _cancellationTokenSource . Token ) ;
51
55
}
52
56
}
53
57
@@ -56,7 +60,8 @@ private void StopRequest()
56
60
if ( RequestState == WebRequestState . Pending )
57
61
{
58
62
RequestState = WebRequestState . None ;
59
- WebRequestManager . Instance . StopRequest ( this ) ;
63
+ _cancellationTokenSource ? . Cancel ( ) ;
64
+ _request ? . Abort ( ) ;
60
65
DisposeRequest ( true ) ;
61
66
}
62
67
}
@@ -72,7 +77,8 @@ private void RestartRequest()
72
77
OnRequestWillRestart ? . Invoke ( _requestAttempts ) ;
73
78
74
79
SetUpRequestConfiguration ( _configuration ) ;
75
- WebRequestManager . Instance . RestartRequest ( this , RequestRoutine ( ) ) ;
80
+ _cancellationTokenSource = new CancellationTokenSource ( ) ;
81
+ RequestRoutineAsync ( _cancellationTokenSource . Token ) ;
76
82
}
77
83
}
78
84
@@ -116,57 +122,70 @@ private bool SetUpRequestConfiguration(WebRequest.Configuration configuration)
116
122
return configured ;
117
123
}
118
124
119
- private IEnumerator RequestRoutine ( )
125
+ private async Task RequestRoutineAsync ( CancellationToken cancellationToken )
120
126
{
121
- if ( RequestState == WebRequestState . Pending )
127
+ try
122
128
{
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 ++ ;
128
133
129
- float requestProgress = - 1f ;
130
- float requestStuckTime = 0f ;
134
+ var operation = _request . SendWebRequest ( ) ;
135
+ }
131
136
132
- while ( ! _request . isDone )
133
- {
134
- bool requestNotProgressing = Mathf . Approximately ( requestProgress , _request . uploadProgress + _request . downloadProgress ) ;
137
+ float requestProgress = - 1f ;
138
+ float requestStuckTime = 0f ;
135
139
136
- if ( requestNotProgressing )
140
+ while ( ! _request . isDone )
137
141
{
138
- requestStuckTime += Time . deltaTime ;
142
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
143
+
144
+ bool requestNotProgressing = Mathf . Approximately ( requestProgress , _request . uploadProgress + _request . downloadProgress ) ;
139
145
140
- if ( requestStuckTime >= _requestTimeOutDuration )
146
+ if ( requestNotProgressing )
141
147
{
142
- RequestState = WebRequestState . Timeout ;
143
- HandleOnRequestTimeOut ( ) ;
148
+ requestStuckTime += Time . deltaTime ;
149
+
150
+ if ( requestStuckTime >= _requestTimeOutDuration )
151
+ {
152
+ RequestState = WebRequestState . Timeout ;
153
+ HandleOnRequestTimeOut ( ) ;
144
154
145
- yield break ;
155
+ return ;
156
+ }
146
157
}
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 } ") ;
147
172
}
148
173
else
149
174
{
150
- requestStuckTime = 0f ;
151
- requestProgress = _request . uploadProgress + _request . downloadProgress ;
175
+ JoystickLogger . Log ( $ "Url: { _request . url } | Response Code:{ _request . responseCode } | Response Data: { _request . downloadHandler . text } ") ;
152
176
}
153
177
154
- yield return null ;
178
+ HandleOnRequestDone ( ) ;
179
+ DisposeRequest ( true ) ;
155
180
}
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 )
160
182
{
161
- JoystickLogger . LogError ( $ "Request result: { _request . result } | ErrorInfo: { _request . error } | Url: { _request . url } ") ;
183
+ JoystickLogger . Log ( "Request was cancelled. " ) ;
162
184
}
163
- else
185
+ catch ( Exception e )
164
186
{
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 } ") ;
166
188
}
167
-
168
- HandleOnRequestDone ( ) ;
169
- DisposeRequest ( true ) ;
170
189
}
171
190
172
191
private void HandleOnRequestTimeOut ( )
@@ -224,6 +243,8 @@ private void DisposeRequest(bool disposeUploadHandler)
224
243
_request . disposeUploadHandlerOnDispose = disposeUploadHandler ;
225
244
_request . Dispose ( ) ;
226
245
_request = null ;
246
+ _cancellationTokenSource ? . Dispose ( ) ;
247
+ _cancellationTokenSource = null ;
227
248
}
228
249
}
229
250
}
0 commit comments