11using Solana . Unity . Rpc . Utilities ;
22using System ;
3- using System . Collections ;
43using System . Net ;
54using System . Net . Http ;
65using System . Text ;
6+ using System . Threading ;
77using System . Threading . Tasks ;
88using UnityEngine . Networking ;
99
@@ -14,6 +14,8 @@ namespace Solana.Unity.Rpc.Core.Http;
1414/// </summary>
1515public static class CrossHttpClient
1616{
17+ private static TaskCompletionSource < UnityWebRequest . Result > _currentRequestTask ;
18+
1719 /// <summary>
1820 /// Send an async request using HttpClient or UnityWebRequest if running on Unity
1921 /// </summary>
@@ -29,6 +31,8 @@ public static async Task<HttpResponseMessage> SendAsyncRequest(HttpClient httpCl
2931 }
3032 return await httpClient . SendAsync ( httpReq ) . ConfigureAwait ( false ) ;
3133 }
34+
35+
3236
3337 /// <summary>
3438 /// Convert a httReq to a Unity Web request
@@ -39,42 +43,48 @@ public static async Task<HttpResponseMessage> SendAsyncRequest(HttpClient httpCl
3943 /// <exception cref="HttpRequestException"></exception>
4044 private static async Task < HttpResponseMessage > SendUnityWebRequest ( Uri uri , HttpRequestMessage httpReq )
4145 {
42- using ( var request = new UnityWebRequest ( uri , httpReq . Method . ToString ( ) ) )
46+ using UnityWebRequest request = new ( uri , httpReq . Method . ToString ( ) ) ;
47+ if ( httpReq . Content != null )
4348 {
44- if ( httpReq . Content != null )
45- {
46- request . uploadHandler = new UploadHandlerRaw ( await httpReq . Content . ReadAsByteArrayAsync ( ) ) ;
47- request . SetRequestHeader ( "Content-Type" , "application/json" ) ;
48- }
49- request . downloadHandler = new DownloadHandlerBuffer ( ) ;
50- var response = new HttpResponseMessage ( ) ;
51- var e = SendRequest ( request , response ) ;
52- while ( e . MoveNext ( ) ) { }
53- if ( request . result == UnityWebRequest . Result . ConnectionError )
54- {
55- throw new HttpRequestException ( "Error While Sending: " + request . error ) ;
56- }
57- return response ;
49+ request . uploadHandler = new UploadHandlerRaw ( await httpReq . Content . ReadAsByteArrayAsync ( ) ) ;
50+ request . SetRequestHeader ( "Content-Type" , "application/json" ) ;
51+ }
52+ request . downloadHandler = new DownloadHandlerBuffer ( ) ;
53+ if ( _currentRequestTask != null )
54+ {
55+ await _currentRequestTask . Task ;
56+ }
57+ UnityWebRequest . Result result = await SendRequest ( request ) ;
58+ HttpResponseMessage response = new ( ) ;
59+ if ( result == UnityWebRequest . Result . Success )
60+ {
61+ response . StatusCode = HttpStatusCode . OK ;
62+ response . Content = new ByteArrayContent ( Encoding . UTF8 . GetBytes ( request . downloadHandler . text ) ) ;
63+ }
64+ else
65+ {
66+ response . StatusCode = HttpStatusCode . ExpectationFailed ;
5867 }
68+ return response ;
5969 }
6070
61- /// <summary>
62- /// Send a request using UnityWebRequest and wait for the response
63- /// </summary>
64- /// <param name="request"></param>
65- /// <param name="res"></param>
66- /// <returns></returns>
67- /// <exception cref="HttpRequestException"></exception>
68- private static IEnumerator SendRequest ( UnityWebRequest request , HttpResponseMessage res )
71+ private static Task < UnityWebRequest . Result > SendRequest ( UnityWebRequest request )
6972 {
70- yield return request . SendWebRequest ( ) ;
71- while ( ! request . isDone )
72- yield return true ;
73- if ( request . result == UnityWebRequest . Result . ConnectionError )
73+ TaskCompletionSource < UnityWebRequest . Result > sendRequestTask = new ( ) ;
74+ _currentRequestTask = sendRequestTask ;
75+ UnityWebRequestAsyncOperation op = request . SendWebRequest ( ) ;
76+
77+ if ( request . isDone )
78+ {
79+ sendRequestTask . SetResult ( request . result ) ;
80+ }
81+ else
7482 {
75- throw new HttpRequestException ( "Error While Sending: " + request . error ) ;
83+ op . completed += asyncOp =>
84+ {
85+ sendRequestTask . SetResult ( ( ( UnityWebRequestAsyncOperation ) asyncOp ) . webRequest . result ) ;
86+ } ;
7687 }
77- res . StatusCode = HttpStatusCode . OK ;
78- res . Content = new ByteArrayContent ( Encoding . UTF8 . GetBytes ( request . downloadHandler . text ) ) ;
88+ return sendRequestTask . Task ;
7989 }
8090}
0 commit comments