/// <summary> /// Gets the web request status. /// </summary> /// <returns>The web request status.</returns> /// <param name="in_requestState">In_request state.</param> private eWebRequestStatus GetWebRequestStatus(RequestState in_requestState) { eWebRequestStatus status = eWebRequestStatus.STATUS_PENDING; // for testing packet loss, some packets are flagged to be lost // and should always return status pending no matter what the real // status is if (m_activeRequest.LoseThisPacket) { return(status); } #if !(DOT_NET) if (m_activeRequest.WebRequest.error != null) { status = eWebRequestStatus.STATUS_ERROR; } else if (m_activeRequest.WebRequest.isDone) { status = eWebRequestStatus.STATUS_DONE; } #endif return(status); }
/// <summary> /// The update method needs to be called periodically to send/receive responses /// and run the associated callbacks. /// </summary> public void Update() { // basic flow here is to: // 1- process existing requests // 2- send next request // 3- handle heartbeat/timeouts if (!m_initialized) { return; } if (!m_enabled) { return; } // process current request if (m_activeRequest != null) { eWebRequestStatus status = GetWebRequestStatus(m_activeRequest); if (status == eWebRequestStatus.STATUS_ERROR) { // do nothing with the error right now - let the timeout code handle it } else if (status == eWebRequestStatus.STATUS_DONE) { ResetIdleTimer(); // note that active request is set to null if exception is to be thrown HandleResponseBundle(GetWebRequestResponse(m_activeRequest)); m_activeRequest = null; } } // send the next message if we're ready if (m_activeRequest == null) { m_activeRequest = CreateAndSendNextRequestBundle(); } // is it time for a retry? if (m_activeRequest != null) { if (DateTime.Now.Subtract(m_activeRequest.TimeSent) >= GetPacketTimeout(m_activeRequest.Retries)) { if (!ResendMessage(m_activeRequest)) { // we've reached the retry limit - send timeout error to all client callbacks eWebRequestStatus status = GetWebRequestStatus(m_activeRequest); if (status == eWebRequestStatus.STATUS_ERROR) { m_brainCloudClientRef.Log("Timeout with network error: " + GetWebRequestResponse(m_activeRequest)); } else { m_brainCloudClientRef.Log("Timeout no reply from server"); } m_activeRequest = null; // Fake a message bundle to keep the callback logic in one place TriggerCommsError(StatusCodes.CLIENT_NETWORK_ERROR, ReasonCodes.CLIENT_NETWORK_ERROR_TIMEOUT, "Timeout trying to reach brainCloud server"); } } } // is it time for a heartbeat? if (Authenticated) { if (DateTime.Now.Subtract(m_lastTimePacketSent) >= m_idleTimeout) { SendHeartbeat(); } } }