/// <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); }
/// <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); }
/// <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); }
/// <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; }
public WebSiteCloudException( string message, string code, CloudHttpRequestErrorInfo request, CloudHttpResponseErrorInfo response, Exception innerException) : base(message, innerException) { this.Request = request; this.Response = response; }
/// <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(); }
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); }
public TestHyakException(string message, CloudHttpRequestErrorInfo request, CloudHttpResponseErrorInfo response) : base(message) { Request = request; Response = response; }
/// <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); }
/// <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); }