diff --git a/src/ZendeskApi.Client/Exceptions/ErrorWithMessageResponse.cs b/src/ZendeskApi.Client/Exceptions/ErrorWithMessageResponse.cs new file mode 100644 index 00000000..5f460e9b --- /dev/null +++ b/src/ZendeskApi.Client/Exceptions/ErrorWithMessageResponse.cs @@ -0,0 +1,38 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace ZendeskApi.Client.Exceptions +{ + /// + public class ErrorWithMessageResponse + { + /// + public ErrorWithMessageResponse() + { + } + + /// + [JsonProperty("error")] + public ErrorWithMessage Error { get; internal set; } + + /// + public ErrorResponse ToErrorResponse(JObject details = null) => new ErrorResponse() + { + Error = Error?.Title, + Description = Error?.Message, + Details = details + }; + + /// + public class ErrorWithMessage() + { + /// + [JsonProperty("message")] + public string Message { get; internal set; } + + /// + [JsonProperty("title")] + public string Title { get; internal set; } + } + } +} diff --git a/src/ZendeskApi.Client/Exceptions/ZendeskRequestExceptionBuilder.cs b/src/ZendeskApi.Client/Exceptions/ZendeskRequestExceptionBuilder.cs index afdfd862..9993c0fe 100644 --- a/src/ZendeskApi.Client/Exceptions/ZendeskRequestExceptionBuilder.cs +++ b/src/ZendeskApi.Client/Exceptions/ZendeskRequestExceptionBuilder.cs @@ -59,12 +59,39 @@ public async Task Build() (int)_response.StatusCode <= 499 && !_doNotBuildErrorModelResponseCodes.Contains((int)_response.StatusCode)) { - error = await _response.Content.ReadAsAsync(); + var content = await _response.Content.ReadAsStringAsync(); + try + { + error = JsonConvert.DeserializeObject(content); + } + catch (JsonReaderException) + { + try + { + error = JsonConvert.DeserializeObject(content)?.ToErrorResponse(); + } + catch + { + // Swallow a deserialization failure here. + } + + // Throw the original exception if an error could not be deserialized. + if ( error == null ) + throw; + } + if (error?.Error != null && error.Description != null) { - var detail = Environment.NewLine + JsonConvert.SerializeObject(error.Details, Formatting.Indented); - message.AppendLine($"{error.Error}: {error.Description}. {detail}"); + if (error.Details == null) + { + message.AppendLine($"{error.Error}: {error.Description.TrimEnd('.')}."); + } + else + { + var detail = Environment.NewLine + JsonConvert.SerializeObject(error.Details, Formatting.Indented); + message.AppendLine($"{error.Error}: {error.Description}. {detail}"); + } } }