2017-06-21 18:58:02 +03:00
|
|
|
|
using System;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Net.Http;
|
|
|
|
|
using System.Net.Http.Headers;
|
2018-10-16 17:43:48 +03:00
|
|
|
|
using System.Text;
|
2017-06-21 18:58:02 +03:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
|
|
|
|
namespace Refit
|
|
|
|
|
{
|
2018-10-06 02:22:52 +03:00
|
|
|
|
|
|
|
|
|
[Serializable]
|
2017-06-21 18:58:02 +03:00
|
|
|
|
public class ApiException : Exception
|
|
|
|
|
{
|
2018-01-28 20:50:46 +03:00
|
|
|
|
public HttpStatusCode StatusCode { get; }
|
|
|
|
|
public string ReasonPhrase { get; }
|
|
|
|
|
public HttpResponseHeaders Headers { get; }
|
|
|
|
|
public HttpMethod HttpMethod { get; }
|
|
|
|
|
public Uri Uri => RequestMessage.RequestUri;
|
|
|
|
|
public HttpRequestMessage RequestMessage { get; }
|
2017-06-21 18:58:02 +03:00
|
|
|
|
public HttpContentHeaders ContentHeaders { get; private set; }
|
|
|
|
|
public string Content { get; private set; }
|
|
|
|
|
public bool HasContent => !string.IsNullOrWhiteSpace(Content);
|
|
|
|
|
public RefitSettings RefitSettings { get; set; }
|
|
|
|
|
|
2018-11-09 12:38:36 +03:00
|
|
|
|
protected ApiException(HttpRequestMessage message, HttpMethod httpMethod, HttpStatusCode statusCode, string reasonPhrase, HttpResponseHeaders headers, RefitSettings refitSettings = null) :
|
2018-01-14 22:58:24 +03:00
|
|
|
|
base(CreateMessage(statusCode, reasonPhrase))
|
2017-06-21 18:58:02 +03:00
|
|
|
|
{
|
2018-01-28 20:50:46 +03:00
|
|
|
|
RequestMessage = message;
|
2017-06-21 18:58:02 +03:00
|
|
|
|
HttpMethod = httpMethod;
|
|
|
|
|
StatusCode = statusCode;
|
|
|
|
|
ReasonPhrase = reasonPhrase;
|
|
|
|
|
Headers = headers;
|
|
|
|
|
RefitSettings = refitSettings;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-25 23:06:22 +03:00
|
|
|
|
[Obsolete("Use GetContentAsAsync<T>() instead", false)]
|
|
|
|
|
public T GetContentAs<T>() => GetContentAsAsync<T>().ConfigureAwait(false).GetAwaiter().GetResult();
|
|
|
|
|
|
|
|
|
|
public async Task<T> GetContentAsAsync<T>() => HasContent ?
|
|
|
|
|
await RefitSettings.ContentSerializer.DeserializeAsync<T>(new StringContent(Content)).ConfigureAwait(false) :
|
2018-01-28 00:50:46 +03:00
|
|
|
|
default;
|
2017-06-21 18:58:02 +03:00
|
|
|
|
|
|
|
|
|
#pragma warning disable VSTHRD200 // Use "Async" suffix for async methods
|
2018-01-28 20:50:46 +03:00
|
|
|
|
public static async Task<ApiException> Create(HttpRequestMessage message, HttpMethod httpMethod, HttpResponseMessage response, RefitSettings refitSettings = null)
|
2017-06-21 18:58:02 +03:00
|
|
|
|
#pragma warning restore VSTHRD200 // Use "Async" suffix for async methods
|
|
|
|
|
{
|
2018-01-28 20:50:46 +03:00
|
|
|
|
var exception = new ApiException(message, httpMethod, response.StatusCode, response.ReasonPhrase, response.Headers, refitSettings);
|
2017-06-21 18:58:02 +03:00
|
|
|
|
|
|
|
|
|
if (response.Content == null)
|
2018-11-09 12:38:36 +03:00
|
|
|
|
{
|
2017-06-21 18:58:02 +03:00
|
|
|
|
return exception;
|
2018-11-09 12:38:36 +03:00
|
|
|
|
}
|
2017-06-21 18:58:02 +03:00
|
|
|
|
|
2018-01-28 20:50:46 +03:00
|
|
|
|
try
|
|
|
|
|
{
|
2018-11-27 01:01:42 +03:00
|
|
|
|
exception.ContentHeaders = response.Content.Headers;
|
|
|
|
|
exception.Content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
|
|
|
|
|
|
2018-11-09 12:38:36 +03:00
|
|
|
|
if (response.Content.Headers.ContentType.MediaType.Equals("application/problem+json"))
|
|
|
|
|
{
|
2018-11-27 01:01:42 +03:00
|
|
|
|
exception = await ValidationApiException.Create(exception).ConfigureAwait(false);
|
2018-11-09 12:38:36 +03:00
|
|
|
|
}
|
2018-11-27 01:01:42 +03:00
|
|
|
|
|
2017-06-21 18:58:02 +03:00
|
|
|
|
response.Content.Dispose();
|
2018-01-28 20:50:46 +03:00
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
2017-06-21 18:58:02 +03:00
|
|
|
|
// NB: We're already handling an exception at this point,
|
|
|
|
|
// so we want to make sure we don't throw another one
|
|
|
|
|
// that hides the real error.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return exception;
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-17 01:11:56 +03:00
|
|
|
|
static string CreateMessage(HttpStatusCode statusCode, string reasonPhrase) =>
|
2018-01-14 22:58:24 +03:00
|
|
|
|
$"Response status code does not indicate success: {(int)statusCode} ({reasonPhrase}).";
|
2017-06-21 18:58:02 +03:00
|
|
|
|
}
|
|
|
|
|
}
|