private IEnumerator InternalSend(string url, HTTPMethods method, byte[] postData, Util.Promise <byte[]> promise, bool noAuth = false) { byte[] result = null; Exception exception = null; // register for authentication if (this.AuthOperate == null) { this.AuthOperate = new Network.AuthOperate(); this.AuthOperate.LoadState(); } if (string.IsNullOrEmpty(this.AuthOperate.auth.SecretKey)) { var authF = this.CreateAuth(); foreach (var v in authF) { yield return(v); } authF.ThrowIfException(); } int retryCount = 0; Requests.RetryCountRemain = 0; HTTPResponse responce = null; ++Requests.InNetAccess; while (retryCount < Requests.RetryCount) { responce = null; var sendNow = DateTime.Now; var request = new HTTPRequest(url, method, (req, resp) => { Requests.TotalRequestCount += 1; Requests.TotalResponseTime += (DateTime.Now - sendNow).TotalSeconds; responce = resp; switch (req.State) { case HTTPRequestStates.Finished: if (resp.IsSuccess) { result = resp.Data; } else { exception = new HTTPException(req, resp); Debug.Log(string.Format("Finished status is failed. url:{0} resp:{1} req:{2}, data:\n{3}", url, resp.StatusCode, req, toString(ref postData))); } break; case HTTPRequestStates.Error: if (resp == null) { exception = req.Exception; } else { exception = new HTTPException(req, resp); } Debug.LogError(string.Format("url:{0}\nstate:{1}\nreq:{2}\nresp:{3}\nexception:{4}", url, req.State, req, resp, req.Exception)); break; } }); if (postData != null) { request.RawData = postData; request.SetHeader("Content-Type", "application/json; charset=UTF-8"); } #if UNITY_IOS var platform = "ios"; // TODO: ビルドセッティングでプラットフォームを切り替える #else var platform = "android"; // TODO: ビルドセッティングでプラットフォームを切り替える #endif request.SetHeader("X-Techarts-Platform", platform); if (!string.IsNullOrEmpty(AuthOperate.accessToken)) { request.SetHeader("Authorization", "techarts " + AuthOperate.accessToken + " " + ClientApiVersion); } Debug.Log(string.Format("{0} {1}: {2}", HTTPMethods.Post.ToString(), url, Encoding.UTF8.GetString(postData))); yield return(request.Send()); if (request.State == HTTPRequestStates.Finished) { break; } // タイムアウトした場合は、5秒後にリトライ Requests.RetryCountRemain = Requests.RetryCount - retryCount; ++retryCount; Debug.LogError(string.Format("Request Time Out: retry:{0} exception:{1}", retryCount, exception == null ? "no exception" : exception.Message)); yield return(new WaitForSeconds(5.0f)); } --Requests.InNetAccess; if (exception != null && exception is HTTPException && ((HTTPException)exception).Response != null) { // User not found, because cleared database. // If happened the error, please initialize save data. if (((HTTPException)exception).Response.StatusCode == 410) { // new ArgumentException("サーバーに指定されたユーザーが見つかりません。データベースがクリアされた可能性ああります。セーブデータを初期化して、ゲームを再起動してください"); // サーバーにプレイヤーデータがない場合 var authF = this.CreateAuth(); foreach (var v in authF) { yield return(v); } authF.ThrowIfException(); var accessTokenF = Api.Net.Auth.AccessToken.Post(this, new Api.Net.Auth.AccessToken.Request( player_id: this.AuthOperate.auth.PlayerId, secret_key: this.AuthOperate.auth.SecretKey)); foreach (var v in accessTokenF) { yield return(v); } Debug.LogWarning("Recreate Authentication: PlayerId=" + this.AuthOperate.auth.PlayerId); this.AuthOperate.accessToken = accessTokenF.Result.AccessToken; exception = null; // 本体を送信 var resendF = Send(url, method, postData); foreach (var v in resendF) { yield return(v); } resendF.ThrowIfException(); result = resendF.Result; } // get accesstoken if status code is 401. // and then re-send the url. else if (((HTTPException)exception).Response.StatusCode == 401 && !noAuth) { var accessTokenF = Api.Net.Auth.AccessToken.Post(this, new Api.Net.Auth.AccessToken.Request( player_id: AuthOperate.auth.PlayerId, secret_key: AuthOperate.auth.SecretKey)); foreach (var v in accessTokenF) { yield return(v); } //if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor) { if (accessTokenF.HasException) { var authF = this.CreateAuth(); foreach (var v in authF) { yield return(v); } authF.ThrowIfException(); accessTokenF = Api.Net.Auth.AccessToken.Post(this, new Api.Net.Auth.AccessToken.Request( player_id: AuthOperate.auth.PlayerId, secret_key: AuthOperate.auth.SecretKey)); foreach (var v in accessTokenF) { yield return(v); } } Debug.LogWarning("Recreate Authentication: PlayerId=" + AuthOperate.auth.PlayerId); } this.AuthOperate.accessToken = accessTokenF.Result.AccessToken; exception = null; var resendF = Send(url, method, postData); foreach (var v in resendF) { yield return(v); } resendF.ThrowIfException(); result = resendF.Result; } } if (result == null) { if (responce != null) { Debug.LogError(string.Format("URL:{0} RESPONCE:{1} \nDATA:{2}", url, responce.StatusCode, Encoding.UTF8.GetString(postData))); } else { Debug.LogError(string.Format("URL:{0} RESPONCE:null", url)); } promise.Exception = exception; } else { promise.Result = result; } yield break; }
private static IEnumerator GetReadyValue <T>(Util.Promise <T> promise, T value) { promise.Result = value; yield break; }