8000 Add Xml documentation to exposed methods and classes. by laurentksh · Pull Request #1275 · reactiveui/refit · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Add Xml documentation to exposed methods and classes. #1275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 66 additions & 1 deletion Refit/ApiException.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,60 @@

namespace Refit
{

/// <summary>
/// Represents an error that occured while sending an API request.
/// </summary>
[Serializable]
public class ApiException : Exception
{
/// <summary>
/// HTTP response status code.
/// </summary>
public HttpStatusCode StatusCode { get; }

/// <summary>
/// The reason phrase which typically is sent by the server together with the status code.
/// </summary>
public string? ReasonPhrase { get; }

/// <summary>
/// HTTP response headers.
/// </summary>
public HttpResponseHeaders Headers { get; }

/// <summary>
/// The HTTP method used to send the request.
/// </summary>
public HttpMethod HttpMethod { get; }

/// <summary>
/// The <see cref="System.Uri"/> used to send the HTTP request.
/// </summary>
public Uri? Uri => RequestMessage.RequestUri;

/// <summary>
/// The HTTP Request message used to send the request.
/// </summary>
public HttpRequestMessage RequestMessage { get; }

/// <summary>
/// HTTP response content headers as defined in RFC 2616.
/// </summary>
public HttpContentHeaders? ContentHeaders { get; private set; }

/// <summary>
/// HTTP Response content as string.
/// </summary>
public string? Content { get; private set; }

/// <summary>
/// Does the response have content?
/// </summary>
public bool HasContent => !string.IsNullOrWhiteSpace(Content);

/// <summary>
/// Refit settings used to send the request.
/// </summary>
public RefitSettings RefitSettings { get; }

protected ApiException(HttpRequestMessage message, HttpMethod httpMethod, string? content, HttpStatusCode statusCode, string? reasonPhrase, HttpResponseHeaders headers, RefitSettings refitSettings, Exception? innerException = null) :
Expand All @@ -38,10 +79,24 @@ protected ApiException(string exceptionMessage, HttpRequestMessage message, Http
Content = content;
}

/// <summary>
/// Get the deserialized response content as nullable <typeparamref name="T"/>.
/// </summary>
/// <typeparam name="T">Type to deserialize the content to</typeparam>
/// <returns>The response content deserialized as <typeparamref name="T"/></returns>
public async Task<T?> GetContentAsAsync<T>() => HasContent ?
await RefitSettings.ContentSerializer.FromHttpContentAsync<T>(new StringContent(Content!)).ConfigureAwait(false) :
default;

/// <summary>
/// Create an instance of <see cref="ApiException"/>.
/// </summary>
/// <param name="message">The HTTP Request message used to send the request.</param>
/// <param name="httpMethod">The HTTP method used to send the request.</param>
/// <param name="response">The HTTP Response message.</param>
/// <param name="refitSettings">Refit settings used to sent the request.</param>
/// <param name="innerException">Add an inner exception to the <see cref="ApiException"/>.</param>
/// <returns>A newly created <see cref="ApiException"/>.</returns>
#pragma warning disable VSTHRD200 // Use "Async" suffix for async methods
public static Task<ApiException> Create(HttpRequestMessage message, HttpMethod httpMethod, HttpResponseMessage response, RefitSettings refitSettings, Exception? innerException = null)
#pragma warning restore VSTHRD200 // Use "Async" suffix for async methods
Expand All @@ -50,6 +105,16 @@ public static Task<ApiException> Create(HttpRequestMessage message, HttpMethod h
return Create(exceptionMessage, message, httpMethod, response, refitSettings, innerException);
}

/// <summary>
/// Create an instance of <see cref="ApiException"/> with a custom exception message.
/// </summary>
/// <param name="exceptionMessage">A custom exception message.</param>
/// <param name="message">The HTTP Request message used to send the request.</param>
/// <param name="httpMethod">The HTTP method used to send the request.</param>
/// <param name="response">The HTTP Response message.</param>
/// <param name="refitSettings">Refit settings used to sent the request.</param>
/// <param name="innerException">Add an inner exception to the <see cref="ApiException"/>.</param>
/// <returns>A newly created <see cref="ApiException"/>.</returns>
#pragma warning disable VSTHRD200 // Use "Async" suffix for async methods
public static async Task<ApiException> Create(string exceptionMessage, HttpRequestMessage message, HttpMethod httpMethod, HttpResponseMessage response, RefitSettings refitSettings, Exception? innerException = null)
#pragma warning restore VSTHRD200 // Use "Async" suffix for async methods
Expand Down
73 changes: 71 additions & 2 deletions Refit/ApiResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,23 @@ internal static T Create<T, TBody>(HttpResponseMessage resp, object? content, Re
}
}

/// <summary>
/// Implementation of <see cref="IApiResponse{T}"/> that provides additional functionalities.
/// </summary>
/// <typeparam name="T"></typeparam>
public sealed class ApiResponse<T> : IApiResponse<T>
{
readonly HttpResponseMessage response;
bool disposed;

/// <summary>
/// Create an instance of <see cref="ApiResponse{T}"/> with type <typeparamref name="T"/>.
/// </summary>
/// <param name="response">Original HTTP Response message.</param>
/// <param name="content">Response content.</param>
/// <param name="settings">Refit settings used to send the request.</param>
/// <param name="error">The ApiException, if the request failed.</param>
/// <exception cref="ArgumentNullException"></exception>
public ApiResponse(HttpResponseMessage response, T? content, RefitSettings settings, ApiException? error = null)
{
this.response = response ?? throw new ArgumentNullException(nameof(response));
Expand All @@ -27,16 +39,30 @@ public ApiResponse(HttpResponseMessage response, T? content, RefitSettings setti
Settings = settings;
}

/// <summary>
/// Deserialized request content as <typeparamref name="T"/>.
/// </summary>
public T? Content { get; }
public RefitSettings Settings { get; }

/// <summary>
/// Refit settings used to send the request.
/// </summary>
public RefitSettings Settings { get; }

public HttpResponseHeaders Headers => response.Headers;

public HttpContentHeaders? ContentHeaders => response.Content?.Headers;

public bool IsSuccessStatusCode => response.IsSuccessStatusCode;

public string? ReasonPhrase => response.ReasonPhrase;

public HttpRequestMessage? RequestMessage => response.RequestMessage;

public HttpStatusCode StatusCode => response.StatusCode;

public Version Version => response.Version;

public ApiException? Error { get; private set; }


Expand All @@ -45,6 +71,11 @@ public void Dispose()
Dispose(true);
}

/// <summary>
/// Ensures the request was successful by throwing an exception in case of failure
/// </summary>
/// <returns>The current <see cref="ApiResponse{T}"/></returns>
/// <exception cref="ApiException"></exception>
public async Task<ApiResponse<T>> EnsureSuccessStatusCodeAsync()
{
if (!IsSuccessStatusCode)
Expand All @@ -70,20 +101,58 @@ void Dispose(bool disposing)
}
}

/// <inheritdoc/>
public interface IApiResponse<out T> : IApiResponse
{
/// <summary>
/// Deserialized request content as <typeparamref name="T"/>.
/// </summary>
8000 T? Content { get; }
}

/// <summary>
/// Base interface used to represent an API response.
/// </summary>
public interface IApiResponse : IDisposable
{
/// <summary>
/// HTTP response headers.
/// </summary>
HttpResponseHeaders Headers { get; }

/// <summary>
/// HTTP response content headers as defined in RFC 2616.
/// </summary>
HttpContentHeaders? ContentHeaders { get; }

/// <summary>
/// Indicates whether the request was successful.
/// </summary>
bool IsSuccessStatusCode { get; }

/// <summary>
/// HTTP response status code.
/// </summary>
HttpStatusCode StatusCode { get; }

/// <summary>
/// The reason phrase which typically is sent by the server together with the status code.
/// </summary>
string? ReasonPhrase { get; }

/// <summary>
/// The HTTP Request message which led to this response.
/// </summary>
HttpRequestMessage? RequestMessage { get; }
HttpStatusCode StatusCode { get; }

/// <summary>
/// HTTP Message version.
/// </summary>
Version Version { get; }

/// <summary>
/// The <see cref="ApiException"/> object in case of unsuccessful response.
/// </summary>
ApiException? Error { get; }
}
}
Loading
0