using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Text; using System.Text.RegularExpressions; using TapTap.Common; using UnityEngine; namespace TapTap.Login.Internal { public class Net : MonoBehaviour { public delegate void Action(); // ReSharper disable Unity.PerformanceAnalysis public void PostAsync(string url, Dictionary queryParams, Dictionary formParams, Action methodForResult, Action methodForError) { if (string.IsNullOrEmpty(url)) { methodForError(-1, "empty url"); return; } StartCoroutine(Post(url, queryParams, formParams, methodForResult, methodForError)); } // ReSharper disable Unity.PerformanceAnalysis public void GetAsync(string url, string authorization, Dictionary queryParams, Action methodForResult, Action methodForError) { if (string.IsNullOrEmpty(url)) { methodForError(-1, "empty url"); return; } StartCoroutine(Get(url, authorization, queryParams, methodForResult, methodForError)); } // ReSharper disable Unity.PerformanceAnalysis private IEnumerator Get(string url, string authorization, Dictionary queryParams, Action methodForResult, Action methodForError) { string baseUrl; Dictionary finalQueryParams = queryParams ?? new Dictionary(); NameValueCollection collection = new NameValueCollection(); ParseUrl(url, out baseUrl, out collection); foreach (string key in collection.AllKeys) { foreach (string value in collection.GetValues(key)) { finalQueryParams.Add(key, value); } } string finalUrl; if (finalQueryParams.Count == 0) { finalUrl = baseUrl; } else { finalUrl = baseUrl + "?" + DictToQueryString(finalQueryParams); } Dictionary headers = new Dictionary(); headers.Add("User-Agent", "TapTapUnitySDK/" + TapTapSdk.Version + " " + "UnityPlayer/" + Application.unityVersion); headers.Add("Authorization", authorization); WWW w = new WWW(finalUrl, null, headers); PrintRequest(w, "GET", null, headers); yield return w; PrintResponse(w); if (!string.IsNullOrEmpty(w.error)) { string data = w.text; if (data != null) { methodForError(GetResponseCode(w), data); } else { methodForError(GetResponseCode(w), w.error); } w.Dispose(); yield break; } else { string data = w.text; if (data != null) { methodForResult(w.text); yield break; } else { methodForError(GetResponseCode(w), "Empyt response from server : " + url); } } } // ReSharper disable Unity.PerformanceAnalysis private IEnumerator Post(string url, Dictionary queryParams, Dictionary formParams, Action methodForResult, Action methodForError) { string baseUrl; Dictionary finalQueryParams = queryParams ?? new Dictionary(); NameValueCollection collection = new NameValueCollection(); ParseUrl(url, out baseUrl, out collection); foreach (string key in collection.AllKeys) { foreach (string value in collection.GetValues(key)) { finalQueryParams.Add(key, value); } } string finalUrl; if(finalQueryParams.Count == 0) { finalUrl = baseUrl; } else { finalUrl = baseUrl + "?" + DictToQueryString(finalQueryParams); } WWWForm wwwForm = new WWWForm(); Dictionary finalFormParams = formParams ?? new Dictionary(); foreach (KeyValuePair kv in finalFormParams) { // Debug.Log($"kv.key:{kv.Key} value:{kv.Value}"); wwwForm.AddField(kv.Key, kv.Value); ; } Dictionary headers = new Dictionary(); headers.Add("User-Agent", "TapTapUnitySDK/1.0 " + "UnityPlayer/" + Application.unityVersion); WWW w = new WWW(finalUrl, wwwForm.data, headers); PrintRequest(w, "POST", wwwForm, headers); yield return w; PrintResponse(w); if (!string.IsNullOrEmpty(w.error)) { string data = w.text; if (data != null) { methodForError(GetResponseCode(w), data); } else { methodForError(GetResponseCode(w), w.error); } w.Dispose(); yield break; } else { string data = w.text; if (data != null) { methodForResult(w.text); yield break; } else { methodForError(GetResponseCode(w), "Empyt response from server : " + url); } } } public static void PrintRequest(WWW request, string method, WWWForm wwwFrom, Dictionary headers) { if (TapLogger.LogDelegate == null) { return; } if (request == null) { return; } StringBuilder sb = new StringBuilder(); sb.AppendLine("=== HTTP Request Start ==="); sb.AppendLine($"URL: {request.url}"); sb.AppendLine($"Method: {method}"); sb.AppendLine($"Headers: \t"); if (wwwFrom?.headers != null) { foreach (var header in wwwFrom.headers) { sb.AppendLine($"{header.Key}: {header.Value}"); } } if (headers != null) { foreach (var header in headers) { sb.AppendLine($"{header.Key}: {header.Value}"); } } sb.AppendLine("=== HTTP Request End ==="); TapLogger.Debug(sb.ToString()); } private static void PrintResponse(WWW response) { if (TapLogger.LogDelegate == null) { return; } StringBuilder sb = new StringBuilder(); sb.AppendLine("=== HTTP Response Start ==="); sb.AppendLine($"URL: {response.url}"); sb.AppendLine($"Status Code: {GetResponseCode(response)}"); sb.AppendLine($"error: {response.error}"); if (!string.IsNullOrEmpty(response.text)) { sb.AppendLine($"Content: {response.text}"); } sb.AppendLine("=== HTTP Response End ==="); TapLogger.Debug(sb.ToString()); } public static int GetResponseCode(WWW request) { int ret = 0; if (request.responseHeaders == null) { Debug.LogError("no response headers."); } else { if (!request.responseHeaders.ContainsKey("STATUS")) { Debug.LogError("response headers has no STATUS."); } else { ret = ParseResponseCode(request.responseHeaders["STATUS"]); } } return ret; } public static int ParseResponseCode(string statusLine) { int ret = 0; string[] components = statusLine.Split(' '); if (components.Length < 3) { Debug.LogError("invalid response status: " + statusLine); } else { if (!int.TryParse(components[1], out ret)) { Debug.LogError("invalid response code: " + components[1]); } } return ret; } public static string DictToQueryString(IDictionary dict) { List list = new List(); foreach (var item in dict) { list.Add(item.Key + "=" + item.Value); } return string.Join("&", list.ToArray()); } public static void ParseUrl(string url, out string baseUrl, out NameValueCollection nvc) { if (url == null) throw new ArgumentNullException("url"); nvc = new NameValueCollection(); baseUrl = ""; if (url == "") return; int questionMarkIndex = url.IndexOf('?'); if (questionMarkIndex == -1) { baseUrl = url; return; } baseUrl = url.Substring(0, questionMarkIndex); if (questionMarkIndex == url.Length - 1) return; string ps = url.Substring(questionMarkIndex + 1); Regex re = new Regex(@"(^|&)?(\w+)=([^&]+)(&|$)?", RegexOptions.None); MatchCollection mc = re.Matches(ps); foreach (Match m in mc) { nvc.Add(m.Result("$2").ToLower(), m.Result("$3")); } } } }