Esempio n. 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>
        /// <param name="parseError">
        /// Function to parse the response content and return the error code
        /// and error message as a Tuple.
        /// </param>
        /// <returns>A CloudException representing the failure.</returns>
        private static CloudException Create(
            HttpRequestMessage request,
            string requestContent,
            HttpResponseMessage response,
            string responseContent,
            Exception innerException,
            Func <string, Tuple <string, string> > parseError)
        {
            // Get the error code and message
            Tuple <string, string> tuple = parseError(responseContent);
            string code    = tuple.Item1;
            string message = tuple.Item2;

            // Get the most descriptive message that we can
            string exceptionMessage =
                (code != null && message != null) ? code + ": " + message :
                (message != null) ? message :
                (code != null) ? code :
                (responseContent != null) ? 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);
        }
Esempio n. 2
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 /*new*/ CloudException CreateResourceCloudExceptionTemporaryImplementation(
            HttpRequestMessage request,
            string requestContent,
            HttpResponseMessage response,
            string responseContent,
            Exception innerException = null)
        {
            Tuple <string, string> tuple = ParseResourceProviderJsonError(responseContent);
            string code    = tuple.Item1;
            string message = tuple.Item2;

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

            // Create the exception
            CloudException exception = new WebSiteCloudException(
                exceptionMessage,
                code,
                CloudHttpRequestErrorInfo.Create(request, requestContent),
                CloudHttpResponseErrorInfo.Create(response, responseContent),
                innerException);

            return(exception);
        }
Esempio n. 3
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);
        }
Esempio n. 4
0
        /// <summary>
        /// Get a standard string representation of an HTTP response.
        /// </summary>
        /// <param name="response">The response message.</param>
        /// <returns>String representation of the response.</returns>
        public static string AsString(this CloudHttpResponseErrorInfo response)
        {
            StringBuilder text = new StringBuilder();

            text.AppendHttpResponse(response);
            return(text.ToString());
        }
 public WebSiteCloudException(
     string message,
     string code,
     CloudHttpRequestErrorInfo request,
     CloudHttpResponseErrorInfo response,
     Exception innerException)
     : base(message, innerException)
 {
     this.Request = request;
     this.Response = response;
 }
Esempio n. 6
0
 public WebSiteCloudException(
     string message,
     string code,
     CloudHttpRequestErrorInfo request,
     CloudHttpResponseErrorInfo response,
     Exception innerException)
     : base(message, innerException)
 {
     this.Request  = request;
     this.Response = response;
 }
Esempio n. 7
0
        /// <summary>
        /// Append an HTTP response.
        /// </summary>
        /// <param name="text">The StringBuilder.</param>
        /// <param name="response">The response message.</param>
        public static void AppendHttpResponse(this StringBuilder text, CloudHttpResponseErrorInfo response)
        {
            if (response == null)
            {
                throw new ArgumentNullException("response");
            }

            text.AppendHttpResponse(
                response.StatusCode,
                response.ReasonPhrase,
                response.Version,
                response.Headers,
                null,
                response.Content);
        }
        /// <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);
        }
 public HttpResponseInfo(CloudHttpResponseErrorInfo response) : base(response)
 {
     ResponseStatusCode = response.StatusCode.ToString();
 }
Esempio n. 10
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);
        }
Esempio n. 11
0
 public TestHyakException(string message, CloudHttpRequestErrorInfo request, CloudHttpResponseErrorInfo response) : base(message)
 {
     Request  = request;
     Response = response;
 }
Esempio n. 12
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);
        }
        /// <summary>
        /// Process a <see cref="CloudException"/> and converts it to a PowerShell
        /// <see cref="ErrorRecord"/>, or <c>null</c> if that is not availaible.
        /// </summary>
        /// <param name="ex">The <see cref="WebException"/> that was thrown.</param>
        /// <param name="requestId">The request Id from the response, if it's availiable.</param>
        /// <returns>An <see cref="ErrorRecord"/> containing the exception details,
        /// or <c>null</c> if the exception cannot be parsed.</returns>
        private static ErrorRecord AsErrorRecord(
            this CloudException ex,
            out string requestId)
        {
            ErrorRecord errorRecord = null;

            requestId = null;

            if (ex.Response != null)
            {
                CloudHttpResponseErrorInfo response = ex.Response;

                // Extract the request Ids
                if (response.Headers != null &&
                    response.Headers.ContainsKey(Constants.RequestIdHeaderName))
                {
                    requestId = response.Headers[Constants.RequestIdHeaderName].First();
                }

                // Check if it's a service resource error message
                ServiceResourceError serviceResourceError;
                if (errorRecord == null &&
                    ServiceResourceError.TryParse(response.Content, out serviceResourceError))
                {
                    errorRecord = new ErrorRecord(
                        new CommunicationException(serviceResourceError.Message, ex),
                        string.Empty,
                        ErrorCategory.InvalidOperation,
                        null);
                }

                // Check if it's a management service error message
                ManagementServiceExceptionInfo info;
                if (errorRecord == null &&
                    ManagementServiceExceptionInfo.TryParse(response.Content, out info))
                {
                    if (info.PropertyBag.Contains(DataServiceConstants.SqlMessageTextKey))
                    {
                        // Set the exception to throw as a new exception with the server message
                        string errorDetails =
                            info.PropertyBag[DataServiceConstants.SqlMessageTextKey].ToString();

                        errorRecord = new ErrorRecord(
                            new CommunicationException(errorDetails, ex),
                            string.Empty,
                            ErrorCategory.InvalidOperation,
                            null);
                    }
                }

                // Check if it's a database management error message
                SqlDatabaseManagementError databaseManagementError;
                if (errorRecord == null &&
                    SqlDatabaseManagementError.TryParse(response.Content, out databaseManagementError))
                {
                    string errorDetails = string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.DatabaseManagementErrorFormat,
                        databaseManagementError.Code,
                        databaseManagementError.Message);

                    errorRecord = new ErrorRecord(
                        new CommunicationException(errorDetails, ex),
                        string.Empty,
                        ErrorCategory.InvalidOperation,
                        null);
                }

                // Check if it's a not found message
                if (errorRecord == null &&
                    response.StatusCode == HttpStatusCode.NotFound)
                {
                    string message = string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.UriDoesNotExist,
                        ex.Request.RequestUri.AbsoluteUri);
                    string errorDetails = string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.DatabaseManagementErrorFormat,
                        response.StatusCode.ToString(),
                        message);

                    errorRecord = new ErrorRecord(
                        new CommunicationException(errorDetails, ex),
                        string.Empty,
                        ErrorCategory.InvalidOperation,
                        null);
                }
            }

            // Return the resulting error record
            return(errorRecord);
        }
Esempio n. 14
0
        /// <summary>
        /// Append an HTTP response.
        /// </summary>
        /// <param name="text">The StringBuilder.</param>
        /// <param name="response">The response message.</param>
        public static void AppendHttpResponse(this StringBuilder text, CloudHttpResponseErrorInfo response)
        {
            if (response == null)
            {
                throw new ArgumentNullException("response");
            }

            text.AppendHttpResponse(
                response.StatusCode,
                response.ReasonPhrase,
                response.Version,
                response.Headers,
                null,
                response.Content);
        }