22using System . Collections ;
33using System . Collections . Generic ;
44using System . Text ;
5+ using System . Threading ;
6+ using System . Threading . Tasks ;
57using JetBrains . Annotations ;
68using UnityEngine ;
79using 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}
0 commit comments