コード例 #1
0
        /// <summary>
        /// Create a CloudException from a failed response.
        /// </summary>
        /// <param name="request">The HTTP request.</param>
        /// <param name="requestContent">The HTTP request content.</param>
        /// <param name="response">The HTTP response.</param>
        /// <param name="responseContent">The HTTP response content.</param>
        /// <param name="innerException">Optional inner exception.</param>
        /// <returns>A CloudException representing the failure.</returns>
        public static CloudException Create(
            HttpRequestMessage request,
            string requestContent,
            HttpResponseMessage response,
            string responseContent,
            Exception innerException = null)
        {
            // Get the error code and message
            CloudError cloudError = ParseXmlOrJsonError(responseContent);
            string     code       = cloudError.Code;
            string     message    = cloudError.Message;

            // Get the most descriptive message that we can
            string exceptionMessage =
                (code != null && message != null) ? code + ": " + message :
                (message != null) ? message :
                (code != null) ? code :
                !string.IsNullOrEmpty(responseContent) ? responseContent :
                (response != null && response.ReasonPhrase != null) ? response.ReasonPhrase :
                (response != null) ? response.StatusCode.ToString() :
                new InvalidOperationException().Message;

            // Create the exception
            CloudException exception = new CloudException(exceptionMessage, innerException);

            exception.ErrorCode    = code;
            exception.ErrorMessage = message;
            exception.Request      = CloudHttpRequestErrorInfo.Create(request, requestContent);
            exception.Response     = CloudHttpResponseErrorInfo.Create(response, responseContent);

            return(exception);
        }
コード例 #2
0
        /// <summary>
        /// Initializes a new instance of the IndexBatchException class.
        /// </summary>
        /// <param name="httpRequest">The original HTTP index request.</param>
        /// <param name="httpResponse">The original HTTP index response.</param>
        /// <param name="indexResponse">The deserialized response from the index request.</param>
        public IndexBatchException(
            HttpRequestMessage httpRequest,
            HttpResponseMessage httpResponse,
            DocumentIndexResponse indexResponse) : base(CreateMessage(indexResponse))
        {
            // Null check in CreateMessage().
            _indexResponse = indexResponse;

            Error =
                new CloudError()
            {
                Code            = String.Empty,
                Message         = this.Message,
                OriginalMessage = this.Message,
                ResponseBody    = String.Empty
            };

            Request  = CloudHttpRequestErrorInfo.Create(httpRequest);
            Response = CloudHttpResponseErrorInfo.Create(httpResponse);
        }
コード例 #3
0
        public void HandlesExceptionError()
        {
            var runtime = new MockCommandRuntime();
            var request = new HttpRequestMessage(HttpMethod.Get, new Uri("https://www.contoso.com/resource?api-version-1.0"));

            request.Headers.Add("x-ms-request-id", "HyakRequestId");
            var response      = new HttpResponseMessage(HttpStatusCode.BadRequest);
            var hyakException = new TestHyakException("exception message", CloudHttpRequestErrorInfo.Create(request), CloudHttpResponseErrorInfo.Create(response))
            {
                Error = new Hyak.Common.CloudError {
                    Code = "HyakCode", Message = "HyakError"
                }
            };

            var autorestException = new Microsoft.Rest.Azure.CloudException("exception message")
            {
                Body = new Microsoft.Rest.Azure.CloudError {
                    Code = "AutorestCode", Message = "Autorest message"
                },
                Request   = new Microsoft.Rest.HttpRequestMessageWrapper(request, ""),
                Response  = new Microsoft.Rest.HttpResponseMessageWrapper(response, ""),
                RequestId = "AutoRestRequestId"
            };

            var cmdlet = new ResolveError
            {
                Error = new[]
                {
                    new ErrorRecord(new Exception("exception message"), "errorCode", ErrorCategory.AuthenticationError, this),
                    new ErrorRecord(hyakException, "errorCode", ErrorCategory.ConnectionError, this),
                    new ErrorRecord(autorestException, "errorCode", ErrorCategory.InvalidOperation, this),
                },
                CommandRuntime = runtime
            };

            Assert.Throws <NotImplementedException>(() => cmdlet.ExecuteCmdlet());
            Assert.NotNull(runtime.OutputPipeline);
            Assert.Equal(3, runtime.OutputPipeline.Count);
            var errorResult = runtime.OutputPipeline[0] as AzureExceptionRecord;

            Assert.NotNull(errorResult);
            Assert.Equal(ErrorCategory.AuthenticationError, errorResult.ErrorCategory.Category);
            Assert.NotNull(errorResult.Exception);
            Assert.Equal(typeof(Exception), errorResult.Exception.GetType());
            Assert.Equal("exception message", errorResult.Exception.Message);
            var hyakResult = runtime.OutputPipeline[1] as AzureRestExceptionRecord;

            Assert.NotNull(hyakResult);
            Assert.Equal(ErrorCategory.ConnectionError, hyakResult.ErrorCategory.Category);
            Assert.NotNull(errorResult.Exception);
            Assert.Equal(typeof(TestHyakException), hyakResult.Exception.GetType());
            Assert.Equal("exception message", hyakResult.Exception.Message);
            Assert.NotNull(hyakResult.RequestMessage);
            Assert.Equal(HttpMethod.Get.ToString(), hyakResult.RequestMessage.Verb);
            Assert.Equal(new Uri("https://www.contoso.com/resource?api-version-1.0"), hyakResult.RequestMessage.Uri);
            Assert.NotNull(hyakResult.ServerResponse);
            Assert.Equal(HttpStatusCode.BadRequest.ToString(), hyakResult.ServerResponse.ResponseStatusCode);
            var autorestResult = runtime.OutputPipeline[2] as AzureRestExceptionRecord;

            Assert.NotNull(autorestResult);
            Assert.Equal(ErrorCategory.InvalidOperation, autorestResult.ErrorCategory.Category);
            Assert.NotNull(autorestResult.Exception);
            Assert.Equal(typeof(Microsoft.Rest.Azure.CloudException), autorestResult.Exception.GetType());
            Assert.Equal("exception message", autorestResult.Exception.Message);
            Assert.NotNull(autorestResult.RequestMessage);
            Assert.Equal(HttpMethod.Get.ToString(), autorestResult.RequestMessage.Verb);
            Assert.Equal(new Uri("https://www.contoso.com/resource?api-version-1.0"), autorestResult.RequestMessage.Uri);
            Assert.NotNull(autorestResult.ServerResponse);
            Assert.Equal(HttpStatusCode.BadRequest.ToString(), autorestResult.ServerResponse.ResponseStatusCode);
            Assert.Equal("AutoRestRequestId", autorestResult.RequestId);
            Assert.Contains("AutorestCode", autorestResult.ServerMessage);
            Assert.Contains("Autorest message", autorestResult.ServerMessage);
        }
コード例 #4
0
        /// <summary>
        /// Create a CloudException from a failed response sending XML content.
        /// </summary>
        /// <param name="request">The HTTP request.</param>
        /// <param name="requestContent">The HTTP request content.</param>
        /// <param name="response">The HTTP response.</param>
        /// <param name="responseContent">The HTTP response content.</param>
        /// <param name="innerException">Optional inner exception.</param>
        /// <returns>A CloudException representing the failure.</returns>
        public static new CloudException CreateFromXml(
            HttpRequestMessage request,
            string requestContent,
            HttpResponseMessage response,
            string responseContent,
            Exception innerException = null)
        {
            string        code                  = null;
            string        message               = null;
            string        extendedErrorCode     = null;
            string        errorMessageFormat    = null;
            List <string> errorMessageArguments = null;

            if (responseContent != null)
            {
                try
                {
                    XElement root = XDocument.Parse(responseContent).Root;

                    XElement codeElement = root.Element(XName.Get("Code", "http://schemas.microsoft.com/windowsazure"));
                    if (codeElement != null)
                    {
                        code = codeElement.Value;
                    }

                    XElement messageElement = root.Element(XName.Get("Message", "http://schemas.microsoft.com/windowsazure"));
                    if (messageElement != null)
                    {
                        message = messageElement.Value;
                    }

                    XElement extendedCodeElement = root.Element(XName.Get("ExtendedCode", "http://schemas.microsoft.com/windowsazure"));
                    if (extendedCodeElement != null)
                    {
                        extendedErrorCode = extendedCodeElement.Value;
                    }

                    XElement messageTemplateElement = root.Element(XName.Get("MessageTemplate", "http://schemas.microsoft.com/windowsazure"));
                    if (messageTemplateElement != null)
                    {
                        errorMessageFormat = messageTemplateElement.Value;
                    }

                    XElement parametersElement = root.Element(XName.Get("Parameters", "http://schemas.microsoft.com/windowsazure"));
                    if (parametersElement != null)
                    {
                        errorMessageArguments =
                            parametersElement
                            .Elements(XName.Get("string", "http://schemas.microsoft.com/2003/10/Serialization/Arrays"))
                            .Select(e => e.Value)
                            .ToList();
                    }
                }
                catch
                {
                    // Ignore any and all failures
                }
            }

            // Get the exception message
            string exceptionMessage = null;

            if (code != null || message != null || extendedErrorCode != null)
            {
                StringBuilder text = new StringBuilder();
                if (code != null)
                {
                    text.Append(code);
                }
                if (extendedErrorCode != null)
                {
                    text.AppendFormat(
                        code != null ? " ({0})" : "{0}",
                        extendedErrorCode);
                }
                if (code != null || extendedErrorCode != null && message != null)
                {
                    text.Append(": ");
                }
                if (message != null)
                {
                    text.Append(message);
                }
                exceptionMessage = text.ToString();
            }
            else
            {
                // Otherwise use the best default that we can come up with
                exceptionMessage =
                    (responseContent != null) ? responseContent :
                    (response != null && response.ReasonPhrase != null) ? response.ReasonPhrase :
                    (response != null) ? response.StatusCode.ToString() :
                    new InvalidOperationException().Message;
            }

            // Create the exception
            TrafficManagerCloudException exception = new TrafficManagerCloudException(exceptionMessage, innerException);

            exception.Error.Code            = code;
            exception.Error.Message         = message;
            exception.Request               = CloudHttpRequestErrorInfo.Create(request, requestContent);
            exception.Response              = CloudHttpResponseErrorInfo.Create(response, responseContent);
            exception.ExtendedErrorCode     = extendedErrorCode;
            exception.ErrorMessageFormat    = errorMessageFormat;
            exception.ErrorMessageArguments = errorMessageArguments ?? new List <string>();

            return(exception);
        }