Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
 private static IEnumerator GetReadyValue <T>(Util.Promise <T> promise, T value)
 {
     promise.Result = value;
     yield break;
 }