using Mogafa.Common.HttpClients; using Newtonsoft.Json; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; namespace Mogafa.Unity.Common.Networks { /// /// UnityWebRequest based HttpClient /// public class UnityWebRequestHttpClient : HttpClientAbstract { /// /// /// /// /// /// public UnityWebRequestHttpClient(string userAgent, List handlers, HttpRequestOptions requestOptions) : base(userAgent, handlers, requestOptions) { } /// /// /// /// /// /// protected async override Task> RequestInternal(HttpRequest request) { var webRequest = new UnityWebRequest(request.Url, request.Method); webRequest.certificateHandler = new BypassCertificate(); foreach (var header in request.Options.Headers) { webRequest.SetRequestHeader(header.Key, header.Value); } webRequest.SetRequestHeader("Content-Type", "application/json"); if (!string.IsNullOrEmpty(request.Options.ContentType)) { webRequest.SetRequestHeader("Content-Type", request.Options.ContentType); } if (!string.IsNullOrEmpty(request.Body)&&(request.Method == HttpMethods.Post || request.Method == HttpMethods.Put)) { byte[] bodyRaw = Encoding.UTF8.GetBytes(request.Body); webRequest.uploadHandler = new UploadHandlerRaw(bodyRaw); } webRequest.downloadHandler = new DownloadHandlerBuffer(); webRequest.timeout = request.Options.Timeout; //webRequest.SetRequestHeader("User-Agent", ""); await webRequest.SendWebRequest(); var response = new HttpOriginalResponse(); if (webRequest.isNetworkError || webRequest.isHttpError) { response.StatusMessage = webRequest.error; response.StatusCode = (int)webRequest.responseCode; return response; } response.StatusCode = HttpStatusCodes.OK; var responseText = webRequest.downloadHandler.text; var data = JsonConvert.DeserializeObject(responseText); response.Body = data; return response; } } public static class ExtensionMethods { public static TaskAwaiter GetAwaiter(this AsyncOperation asyncOp) { var tcs = new TaskCompletionSource(); asyncOp.completed += obj => { tcs.SetResult(null); }; return ((Task)tcs.Task).GetAwaiter(); } } public class BypassCertificate : CertificateHandler { protected override bool ValidateCertificate(byte[] certificateData) { return true; } } }