using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using WebRequest = MoralisUnity.Web3Api.Models.WebRequest; using UnityEngine; using UnityEngine.Networking; using Cysharp.Threading.Tasks; using MoralisUnity.Web3Api.Interfaces; namespace MoralisUnity.Web3Api { /// /// A universal implementation of . /// public class UniversalWebClient : IWebClient { static HashSet ContentHeaders { get; } = new HashSet { { "Allow" }, { "Content-Disposition" }, { "Content-Encoding" }, { "Content-Language" }, { "Content-Length" }, { "Content-Location" }, { "Content-MD5" }, { "Content-Range" }, { "Content-Type" }, { "Expires" }, { "Last-Modified" } }; static List allowedHeaders { get; } = new List { "x-parse-application-id", "x-parse-installation-id", "x-parse-session-token", "content-type", "x-moralis-platform", "x-moralis-platform-version" }; public UniversalWebClient() { } public async UniTask, string>> ExecuteAsync(Models.WebRequest httpRequest) { Tuple, string> result = default; UnityWebRequest webRequest; switch (httpRequest.Method) { case "DELETE": webRequest = UnityWebRequest.Delete(httpRequest.Target); break; case "POST": webRequest = CreatePostRequest(httpRequest); break; case "PUT": webRequest = CreatePutRequest(httpRequest); break; default: webRequest = UnityWebRequest.Get(httpRequest.Target); break; } if (httpRequest.Headers != null) { foreach (KeyValuePair header in httpRequest.Headers) { if (webRequest.GetRequestHeader(header.Key) != null) continue; if (!String.IsNullOrWhiteSpace(header.Value) && allowedHeaders.Contains(header.Key.ToLower())) { webRequest.SetRequestHeader(header.Key, header.Value); } } } try { await webRequest.SendWebRequest(); } catch (Exception exp) { Debug.LogError($"Error: {exp.Message}"); } HttpStatusCode responseStatus = HttpStatusCode.BadRequest; string responseText = null; if (Enum.IsDefined(typeof(HttpStatusCode), (int)webRequest.responseCode)) { responseStatus = (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), webRequest.responseCode); } if (webRequest.result == UnityWebRequest.Result.ConnectionError) { responseText = webRequest.error; } else { responseText = webRequest.downloadHandler.text; } result = new Tuple, string>(responseStatus, webRequest.GetResponseHeaders(), responseText); // Signals that this UnityWebRequest is no longer being used, and should clean up any resources it is using. webRequest.Dispose(); return result; } private UnityWebRequest CreatePostRequest(Models.WebRequest httpRequest) { //string requestData = null; var req = new UnityWebRequest(httpRequest.Target, "POST"); Stream data = httpRequest.Data; if ((httpRequest.Data is null && httpRequest.Method.ToLower().Equals("post") ? new MemoryStream(new byte[0]) : httpRequest.Data) is Stream { } adjData) { data = adjData; } byte[] buffer = new byte[data.Length]; data.Read(buffer, 0, buffer.Length); data.Position = 0; //requestData = Encoding.UTF8.GetString(buffer); req.uploadHandler = (UploadHandler)new UploadHandlerRaw(buffer); req.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); return req; // UnityWebRequest.Post(httpRequest.Target, requestData); } private UnityWebRequest CreatePutRequest(Models.WebRequest httpRequest) { //string requestData = null; var req = new UnityWebRequest(httpRequest.Target, "PUT"); Stream data = httpRequest.Data; if ((httpRequest.Data is null && httpRequest.Method.ToLower().Equals("put") ? new MemoryStream(new byte[0]) : httpRequest.Data) is Stream { } adjData) { data = adjData; } byte[] buffer = new byte[data.Length]; data.Read(buffer, 0, buffer.Length); data.Position = 0; //requestData = Encoding.UTF8.GetString(buffer); req.uploadHandler = (UploadHandler)new UploadHandlerRaw(buffer); req.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); return req; // return UnityWebRequest.Put(httpRequest.Target, requestData); } } }