C2dmSharp.Server.C2dmMessageTransportAsync.processResponseError C# (CSharp) Method

processResponseError() static private method

static private processResponseError ( C2dmAsyncParameters asyncParam ) : void
asyncParam C2dmAsyncParameters
return void
        static void processResponseError(C2dmAsyncParameters asyncParam)
        {
            var result = new C2dmMessageTransportResponse()
            {
                ResponseCode = MessageTransportResponseCode.Error,
                ResponseStatus = MessageTransportResponseStatus.Error,
                Message = asyncParam.Message,
                MessageId = string.Empty
            };

            if (asyncParam.WebResponse.StatusCode == HttpStatusCode.Unauthorized)
            {
                //401 bad auth token
                result.ResponseCode = MessageTransportResponseCode.InvalidAuthToken;
                result.ResponseStatus = MessageTransportResponseStatus.Error;
                throw new InvalidAuthenticationTokenTransportException(result);
            }
            else if (asyncParam.WebResponse.StatusCode == HttpStatusCode.ServiceUnavailable)
            {
                //First try grabbing the retry-after header and parsing it.
                TimeSpan retryAfter = new TimeSpan(0, 0, 120);

                var wrRetryAfter = asyncParam.WebResponse.GetResponseHeader("Retry-After");

                if (!string.IsNullOrEmpty(wrRetryAfter))
                {
                    DateTime wrRetryAfterDate = DateTime.UtcNow;

                    if (DateTime.TryParse(wrRetryAfter, out wrRetryAfterDate))
                        retryAfter = wrRetryAfterDate - DateTime.UtcNow;
                    else
                    {
                        int wrRetryAfterSeconds = 120;
                        if (int.TryParse(wrRetryAfter, out wrRetryAfterSeconds))
                            retryAfter = new TimeSpan(0, 0, wrRetryAfterSeconds);
                    }
                }

                //503 exponential backoff, get retry-after header
                result.ResponseCode = MessageTransportResponseCode.ServiceUnavailable;
                result.ResponseStatus = MessageTransportResponseStatus.Error;

                throw new ServiceUnavailableTransportException(retryAfter, result);
            }

            asyncParam.WebResponse.Close();

            if (MessageResponseReceived != null)
                MessageResponseReceived(result);
        }