using System.Collections.Generic; using System.Text; using UnityEngine.Networking; using System; using UnityEngine; using System.Net; using System.IO; using System.Collections; using System.Threading.Tasks; namespace TcgEngine { /// /// Tool to send HTTP web resquests /// public class WebRequest { public const string METHOD_GET = "GET"; public const string METHOD_POST = "POST"; public const string METHOD_PATCH = "PATCH"; public const string METHOD_DELETE = "DELETE"; public const int timeout = 10; public static UnityWebRequest Create(string url) { UnityWebRequest request = new UnityWebRequest(url, METHOD_GET); request.SetRequestHeader("Content-Type", "application/json"); request.downloadHandler = new DownloadHandlerBuffer(); request.timeout = timeout; return request; } public static UnityWebRequest Create(string url, string method, string json_data, string token) { UnityWebRequest request = new UnityWebRequest(url, method); request.SetRequestHeader("Content-Type", "application/json"); if(token != null) request.SetRequestHeader("Authorization", token); request.downloadHandler = new DownloadHandlerBuffer(); request.timeout = timeout; if (method != METHOD_GET && !string.IsNullOrEmpty(json_data)) { UploadHandler uploader = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json_data)); uploader.contentType = "application/json"; request.uploadHandler = uploader; } return request; } public static UnityWebRequest CreateRaw(string url, string method, string contentType, byte[] data, string token) { UnityWebRequest request = new UnityWebRequest(url, method); request.SetRequestHeader("Content-Type", contentType); if (token != null) request.SetRequestHeader("Authorization", token); request.downloadHandler = new DownloadHandlerBuffer(); request.timeout = timeout; if (method != METHOD_GET && !string.IsNullOrEmpty(contentType)) { UploadHandler uploader = new UploadHandlerRaw(data); uploader.contentType = contentType; request.uploadHandler = uploader; } return request; } public static UnityWebRequest CreateHeader(string url) { UnityWebRequest request = UnityWebRequest.Head(url); return request; } public static UnityWebRequest CreateTexture(string url) { UnityWebRequest request = UnityWebRequestTexture.GetTexture(url); request.SetRequestHeader("Content-Type", "image/png"); return request; } public static UnityWebRequest CreateImageUploadForm(string url, string path, byte[] data, string token) { List requestData = new List(); requestData.Add(new MultipartFormDataSection("path", path, "text")); requestData.Add(new MultipartFormFileSection("data", data, "file.png", "image/png")); UnityWebRequest request = UnityWebRequest.Post(url, requestData); if (token != null) request.SetRequestHeader("Authorization", token); request.timeout = 200; return request; } public static WebResponse GetResponse(UnityWebRequest request) { WebResponse res = new WebResponse(); res.success = request.responseCode >= 200 && request.responseCode < 300; res.status = request.responseCode; res.error = request.error; res.data = ""; if (request.downloadHandler != null) res.data = request.downloadHandler.text; return res; } public static HeadResponse GetHeadResponse(UnityWebRequest request) { HeadResponse res = new HeadResponse(); res.success = request.responseCode >= 200 && request.responseCode < 300; res.status = request.responseCode; string type = request.GetResponseHeader("Content-Type"); DateTime.TryParse(request.GetResponseHeader("Last-Modified"), out DateTime date); int.TryParse(request.GetResponseHeader("Content-Length"), out int size); res.content_type = type; res.last_edit = date; res.size = size; return res; } } public class WebTool { public static T JsonToObject(string json) { T value = (T)Activator.CreateInstance(typeof(T)); try { value = JsonUtility.FromJson(json); } catch (Exception) { } return value; } public static T[] JsonToArray(string json) { ListJson list = new ListJson(); list.list = new T[0]; try { string wrap_json = "{ \"list\": " + json + "}"; list = JsonUtility.FromJson>(wrap_json); return list.list; } catch (Exception) { } return new T[0]; } public static string ToJson(object data) { return JsonUtility.ToJson(data); } public static int Parse(string int_str, int default_val = 0) { bool success = int.TryParse(int_str, out int val); return success ? val : default_val; } public static async Task SendRequest(string url) { UnityWebRequest req = WebRequest.Create(url); return await SendRequest(req); } public static async Task SendRequest(UnityWebRequest request) { try { var asyncOp = request.SendWebRequest(); while (!asyncOp.isDone) await TimeTool.Delay(200); } catch (Exception) {} if (request.result != UnityWebRequest.Result.Success) Debug.Log(request.error); WebResponse res = WebRequest.GetResponse(request); request.Dispose(); return res; } } public class WebContext { public HttpListenerContext http; public string method; public string token; public string path; public string data; public void SendResponse(T value) { string val = WebTool.ToJson(value); SendResponse(val); } public void SendResponse(ulong value) { SendResponse(value.ToString()); } public void SendResponse(int value) { SendResponse(value.ToString()); } public void SendResponse(bool value) { SendResponse(value.ToString()); } public void SendResponse(string value) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value); SendResponse(bytes, 200); } public void SendError(string value) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value); SendResponse(bytes, 400); } public void SendResponse() { try { WriteHeader(); http.Response.StatusCode = 200; http.Response.Close(); } catch (Exception e) { Debug.Log(e); } } public void SendResponse(byte[] bytes, int code) { try { WriteHeader(); http.Response.StatusCode = code; http.Response.OutputStream.Write(bytes, 0, bytes.Length); http.Response.Close(); } catch (Exception e) { Debug.Log(e); } } private void WriteHeader() { http.Response.Headers.Add("Access-Control-Allow-Origin", "*"); http.Response.Headers.Add("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT"); http.Response.Headers.Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); } public T GetData() { return WebTool.JsonToObject(data); } public ulong GetInt64() { bool valid = ulong.TryParse(data, out ulong val); return valid ? val : 0; } public int GetInt() { bool valid = int.TryParse(data, out int val); return valid ? val : 0; } public bool GetBool() { bool valid = bool.TryParse(data, out bool val); return valid ? val : false; } public ulong GetClientID() { bool valid = ulong.TryParse(token, out ulong val); return valid ? val : 0; } public string GetIP() { return http.Request.RemoteEndPoint.Address.ToString(); } public string GetKey() { return token; } public bool IsKeyValid(string key) { return token == key; } public string GetQuery(string key) { try { return http.Request.QueryString.Get(key); } catch (Exception e) { Debug.Log(e); } return ""; } public void Close() { try { http.Response.Close(); } catch (Exception e) { Debug.Log(e); } } public static WebContext Create(HttpListenerContext http) { WebContext req = new WebContext(); req.http = http; req.path = ""; req.data = ""; try { req.method = http.Request.HttpMethod; req.path = http.Request.RawUrl.Remove(0, 1); req.token = http.Request.Headers.Get("Authorization"); if (http.Request.InputStream != null) { StreamReader reader = new StreamReader(http.Request.InputStream, http.Request.ContentEncoding); req.data = reader.ReadToEnd(); } } catch (Exception e) { Debug.Log(e); } return req; } } public struct WebResponse { public bool success; public long status; public string data; public string error; public ulong GetInt64() { bool valid = ulong.TryParse(data, out ulong val); return valid ? val : 0; } public int GetInt() { bool valid = int.TryParse(data, out int val); return valid ? val : 0; } public bool GetBool() { bool valid = bool.TryParse(data, out bool val); return valid ? val : false; } public T GetData() { return WebTool.JsonToObject(data); } public string GetError() { ErrorResponse err = WebTool.JsonToObject(data); if(err != null) return err.error; return error; } } public class HeadResponse { public bool success; public long status; public DateTime last_edit; public int size; public string content_type; } [Serializable] public class ErrorResponse { public string error; } [Serializable] public class ListJson { public T[] list; public string error; } }