/// <summary>
        /// Abort request
        /// </summary>
        public void Abort()
        {
            if (isDestroying)
            {
                return;
            }

            if (isSending)
            {
                SetOnSuccess(null);
                SetOnFailure(null);
                SetOnError(null);
                SetOnFinish(null);
                SetOnFinishEachRequest(null);

                StopAllCoroutines();

                if (request != null)
                {
                    request.Destroy();
                    request = null;
                }
            }

            Destroy(gameObject);
        }
        public void Abort()
        {
            if (isDestroying)
            {
                return;
            }

            if (isPending)
            {
                SetOnSuccess(null);
                SetOnFailure(null);
                SetOnError(null);
                SetOnFinish(null);
                SetOnFinishEachRequest(null);

                StopCoroutine(pendingCoroutine);
                pendingCoroutine = null;

                if (requestNode != null)
                {
                    requestNode.Destroy();
                    requestNode = null;
                }
            }

            Destroy(gameObject);
        }
        private HttpRequestNode CreateReq(IHttpRequestData reqData)
        {
            HttpRequestNode req = CreateRequestNode(reqData);

            req.Setup(reqData);
            return(req);
        }
        public void AbortRequest()
        {
            if (isDestroying)
            {
                return;
            }

            if (isPending)
            {
                StopCoroutine(pendingCoroutine);
                pendingCoroutine = null;

                if (requestNode != null)
                {
                    requestNode.Destroy();
                    requestNode = null;
                }

                requestQueue.Clear();
            }
        }
        private IEnumerator Coro_Send()
        {
            while (requestQueue.Count > 0)
            {
                var reqData = requestQueue.Dequeue();

                request = CreateReq(reqData);

                // Send request to server.
                yield return(request.Send());

                // TODO: This handles to execute agent priority requests based on verified status code
                // Example: when request token is expired, so there must be a priority request to refresh token to be executed first
                // and then continue the other requests again that has issue with expired token
                if (priorityRequestForStatusCode != null)
                {
                    var pReq = priorityRequestForStatusCode(request.ResponseCode);

                    if (pReq != null && pReq.reqData != null)
                    {
                        if (request != null)
                        {
                            request.Destroy();
                            request = null;
                        }

                        var leftReqData = requestQueue.ToArray();
                        requestQueue.Clear();

                        // Add the request that has problem based on checked status code above
                        requestQueue.Enqueue(reqData);

                        for (int i = 0; i < leftReqData.Length; i++)
                        {
                            requestQueue.Enqueue(leftReqData[i]);
                        }

                        yield return(Coro_ExecutePriorityRequest(pReq));

                        continue;
                    }
                }

                if (request.IsError)
                {
                    if (onError != null)
                    {
                        onError(request);
                    }
                }
                else
                {
                    if (request.IsSuccess)
                    {
                        if (onSuccess != null)
                        {
                            onSuccess(request);
                        }
                    }
                    else
                    {
                        if (onFailure != null)
                        {
                            onFailure(request);
                        }
                    }
                }

                if (onFinishEachRequest != null)
                {
                    onFinishEachRequest(request);
                }

                if (request != null)
                {
                    request.Destroy();
                    request = null;
                }
            }

            if (onFinish != null)
            {
                onFinish();
            }

            // Tell that the instance of this class is being destroyed.
            isDestroying = true;

            yield return(0);

            // Destroy in 0.01 sec
            Destroy(gameObject, 0.01f);
        }
        private IEnumerator Coro_ExecutePriorityRequest(PriorityRequest newReq)
        {
            priorityRequests.Push(newReq);

            while (priorityRequests.Count > 0)
            {
                var req = priorityRequests.Pop();

                request = CreateReq(req.reqData);

                yield return(request.Send());

                if (priorityRequestForStatusCode != null)
                {
                    var pReq = priorityRequestForStatusCode(request.ResponseCode);

                    if (pReq != null && pReq.reqData != null)
                    {
                        if (request != null)
                        {
                            request.Destroy();
                            request = null;
                        }

                        priorityRequests.Push(pReq);
                        priorityRequests.Push(req);

                        continue;
                    }
                }

                if (request.IsError)
                {
                    if (req.onError != null)
                    {
                        req.onError(request);
                    }
                }
                else
                {
                    if (request.IsSuccess)
                    {
                        if (req.onSuccess != null)
                        {
                            req.onSuccess(request);
                        }
                    }
                    else
                    {
                        if (req.onFailure != null)
                        {
                            req.onFailure(request);
                        }
                    }
                }

                if (request != null)
                {
                    request.Destroy();
                    request = null;
                }
            }
        }
        private IEnumerator Coro_Send()
        {
            HttpRequest httpReq  = null;
            HttpRequest pHttpReq = null;

            while (requestQueue.Count > 0)
            {
                httpReq     = requestQueue.Dequeue();
                requestNode = CreateReq(httpReq.requestData);

                // Send request to server.
                yield return(requestNode.Send());

                // TODO: This handles to execute agent priority requests based on verified status code
                // Example: when request token is expired, so there must be a priority request to refresh token to be executed first
                // and then continue the other requests again that has issue with expired token
                if (priorityRequestForStatusCode != null)
                {
                    pHttpReq = priorityRequestForStatusCode(requestNode);

                    if (pHttpReq != null && pHttpReq.requestData != null)
                    {
                        if (requestNode != null)
                        {
                            requestNode.Destroy();
                            requestNode = null;
                        }

                        HttpRequest[] leftHttpReqs = requestQueue.ToArray();
                        requestQueue.Clear();

                        // Add the request that has problem based on checked status code above
                        requestQueue.Enqueue(httpReq);

                        for (int i = 0; i < leftHttpReqs.Length; i++)
                        {
                            requestQueue.Enqueue(leftHttpReqs[i]);
                        }

                        yield return(Coro_ExecutePriorityRequest(pHttpReq));

                        leftHttpReqs = null;
                        httpReq      = null;
                        pHttpReq     = null;

                        continue;
                    }

                    pHttpReq = null;
                }

                if (requestNode.IsNetworkError)
                {
                    if (onError != null)
                    {
                        onError(requestNode);
                    }

                    if (httpReq.onError != null)
                    {
                        httpReq.onError(requestNode);
                    }
                }
                else
                {
                    if (requestNode.IsSuccess)
                    {
                        if (onSuccess != null)
                        {
                            onSuccess(requestNode);
                        }

                        if (httpReq.onSuccess != null)
                        {
                            httpReq.onSuccess(requestNode);
                        }
                    }
                    else
                    {
                        if (onFailure != null)
                        {
                            onFailure(requestNode);
                        }

                        if (httpReq.onFailure != null)
                        {
                            httpReq.onFailure(requestNode);
                        }
                    }
                }

                if (onFinishEachRequest != null)
                {
                    onFinishEachRequest(requestNode);
                }

                if (httpReq.onFinish != null)
                {
                    httpReq.onFinish(requestNode);
                }

                if (requestNode != null)
                {
                    requestNode.Destroy();
                    requestNode = null;
                }

                httpReq  = null;
                pHttpReq = null;
            }

            if (onFinish != null)
            {
                onFinish();
            }

            if (destroyWhenDone)
            {
                // Tell that the instance of this class is being destroyed.
                isDestroying = true;
                isPending    = false;

                yield return(new WaitForEndOfFrame());

                // Destroy in 0.01 sec
                Destroy(gameObject, 0.01f);
            }
            else
            {
                isPending = false;
            }

            pendingCoroutine = null;
        }
        private IEnumerator Coro_ExecutePriorityRequest(HttpRequest newReq)
        {
            HttpRequest httpReq  = null;
            HttpRequest pHttpReq = null;

            priorityRequests.Push(newReq);

            while (priorityRequests.Count > 0)
            {
                httpReq     = priorityRequests.Pop();
                requestNode = CreateReq(httpReq.requestData);

                yield return(requestNode.Send());

                if (priorityRequestForStatusCode != null)
                {
                    pHttpReq = priorityRequestForStatusCode(requestNode);

                    if (pHttpReq != null && pHttpReq.requestData != null)
                    {
                        if (requestNode != null)
                        {
                            requestNode.Destroy();
                            requestNode = null;
                        }

                        priorityRequests.Push(pHttpReq);
                        priorityRequests.Push(httpReq);

                        httpReq  = null;
                        pHttpReq = null;
                        continue;
                    }

                    pHttpReq = null;
                }

                if (requestNode.IsNetworkError)
                {
                    if (httpReq.onError != null)
                    {
                        httpReq.onError(requestNode);
                    }
                }
                else
                {
                    if (requestNode.IsSuccess)
                    {
                        if (httpReq.onSuccess != null)
                        {
                            httpReq.onSuccess(requestNode);
                        }
                    }
                    else
                    {
                        if (httpReq.onFailure != null)
                        {
                            httpReq.onFailure(requestNode);
                        }
                    }
                }

                if (httpReq.onFinish != null)
                {
                    httpReq.onFinish(requestNode);
                }

                if (requestNode != null)
                {
                    requestNode.Destroy();
                    requestNode = null;
                }

                httpReq  = null;
                pHttpReq = null;
            }
        }