diff --git a/src/Spoleto.RestClient/Authentication/DynamicAuthenticator.cs b/src/Spoleto.RestClient/Authentication/DynamicAuthenticator.cs index 88fff8d..ebb0461 100644 --- a/src/Spoleto.RestClient/Authentication/DynamicAuthenticator.cs +++ b/src/Spoleto.RestClient/Authentication/DynamicAuthenticator.cs @@ -1,5 +1,6 @@ using System.Net; using System.Net.Http.Headers; +using System.Security.Authentication; namespace Spoleto.RestClient.Authentication { @@ -53,7 +54,13 @@ public sealed override async Task Authenticate(IRestClient client, HttpRequestMe public virtual Task IsExpired(HttpResponseMessage response) => Task.FromResult(response.StatusCode == HttpStatusCode.Unauthorized); - public void SetExpired() => _token = null; + public void SetExpired() + { + if (_token == null) + throw new AuthenticationException("Cannot authenticate and get an access token. Check the credentials."); + + _token = null; + } protected abstract Task GetAuthenticationToken(IRestClient client); diff --git a/src/Spoleto.RestClient/Client/IRestClient.cs b/src/Spoleto.RestClient/Client/IRestClient.cs index 3fa5379..a196eea 100644 --- a/src/Spoleto.RestClient/Client/IRestClient.cs +++ b/src/Spoleto.RestClient/Client/IRestClient.cs @@ -2,11 +2,11 @@ { public interface IRestClient : IDisposable { - JsonRestRequest CreateJsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? content = null) where TObj : class; + JsonRestRequest CreateJsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, TObj? content = null) where TObj : class; - XmlRestRequest CreateXmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? content = null) where TObj : class; + XmlRestRequest CreateXmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, TObj? content = null) where TObj : class; - BinaryRestRequest CreateBinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, byte[]? content = null); + BinaryRestRequest CreateBinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, byte[]? content = null); Task ExecuteAsStringAsync(RestRequest request, CancellationToken cancellationToken = default); diff --git a/src/Spoleto.RestClient/Client/RestClient.cs b/src/Spoleto.RestClient/Client/RestClient.cs index 3454f5a..c798865 100644 --- a/src/Spoleto.RestClient/Client/RestClient.cs +++ b/src/Spoleto.RestClient/Client/RestClient.cs @@ -18,11 +18,11 @@ public RestClient(HttpClient httpClient, IAuthenticator? authenticator = null, R _disposeHttpClient = disposeHttpClient; } - public virtual JsonRestRequest CreateJsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? content = null) where TObj : class => new(uri, httpMethod, content); + public virtual JsonRestRequest CreateJsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, TObj? content = null) where TObj : class => new(uri, httpMethod, isMultipartFormData, content); - public virtual XmlRestRequest CreateXmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? content = null) where TObj : class => new(uri, httpMethod, content); + public virtual XmlRestRequest CreateXmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, TObj? content = null) where TObj : class => new(uri, httpMethod, isMultipartFormData, content); - public virtual BinaryRestRequest CreateBinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, byte[]? content = null) => new(uri, httpMethod, content); + public virtual BinaryRestRequest CreateBinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, byte[]? content = null) => new(uri, httpMethod, isMultipartFormData, content); public async Task ExecuteAsStringAsync(RestRequest request, CancellationToken cancellationToken = default) { diff --git a/src/Spoleto.RestClient/RestRequest/BinaryRestRequest.cs b/src/Spoleto.RestClient/RestRequest/BinaryRestRequest.cs index 53cd23e..02c5d0d 100644 --- a/src/Spoleto.RestClient/RestRequest/BinaryRestRequest.cs +++ b/src/Spoleto.RestClient/RestRequest/BinaryRestRequest.cs @@ -5,8 +5,8 @@ namespace Spoleto.RestClient { public record BinaryRestRequest : RestRequest, IBinaryRestRequest { - public BinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, byte[]? content = null) - : base(uri, httpMethod, content) + public BinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, byte[]? content = null) + : base(uri, httpMethod, isMultipartFormData, content) { } @@ -14,9 +14,14 @@ public BinaryRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, byt public override HttpContent GetHttpContent() { - var content = new ByteArrayContent(Content); + HttpContent content = new ByteArrayContent(Content); content.Headers.ContentType = MediaTypeHeaderValue.Parse(ContentType); + if (IsMultipartFormData) + { + content = new MultipartFormDataContent { { content } }; + } + return content; } } diff --git a/src/Spoleto.RestClient/RestRequest/IRestRequest.cs b/src/Spoleto.RestClient/RestRequest/IRestRequest.cs index 5e81656..b89bc4c 100644 --- a/src/Spoleto.RestClient/RestRequest/IRestRequest.cs +++ b/src/Spoleto.RestClient/RestRequest/IRestRequest.cs @@ -4,6 +4,8 @@ namespace Spoleto.RestClient public interface IRestRequest { HttpMethod HttpMethod { get; } + + bool IsMultipartFormData { get; } string Uri { get; } diff --git a/src/Spoleto.RestClient/RestRequest/JsonRestRequest.cs b/src/Spoleto.RestClient/RestRequest/JsonRestRequest.cs index ed14fd5..17c838d 100644 --- a/src/Spoleto.RestClient/RestRequest/JsonRestRequest.cs +++ b/src/Spoleto.RestClient/RestRequest/JsonRestRequest.cs @@ -6,8 +6,8 @@ namespace Spoleto.RestClient { public record JsonRestRequest : RestRequest, IJsonRestRequest where TObj : class { - public JsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? obj = null) - : base(uri, httpMethod, SerializationManager.Serialize(SerializationManager.DataFomat.Json, obj)) + public JsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, TObj? obj = null) + : base(uri, httpMethod, isMultipartFormData, SerializationManager.Serialize(SerializationManager.DataFomat.Json, obj)) { } @@ -15,7 +15,12 @@ public JsonRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? public override HttpContent GetHttpContent() { - var content = new StringContent(Content, Encoding, ContentType); + HttpContent content = new StringContent(Content, Encoding, ContentType); + + if (IsMultipartFormData) + { + content = new MultipartFormDataContent { { content } }; + } return content; } diff --git a/src/Spoleto.RestClient/RestRequest/RestRequest.cs b/src/Spoleto.RestClient/RestRequest/RestRequest.cs index 53d3e82..4acd24f 100644 --- a/src/Spoleto.RestClient/RestRequest/RestRequest.cs +++ b/src/Spoleto.RestClient/RestRequest/RestRequest.cs @@ -4,10 +4,11 @@ namespace Spoleto.RestClient { public abstract record RestRequest : IRestRequest { - protected RestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get) + protected RestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false) { Uri = uri; HttpMethod = httpMethod; + IsMultipartFormData = isMultipartFormData; ContentType = GetContentType(); } @@ -15,6 +16,8 @@ protected RestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get) public HttpMethod HttpMethod { get; } + public bool IsMultipartFormData { get; } + public string ContentType { get; set; } public virtual Encoding Encoding { get; set; } = Encoding.UTF8; @@ -28,7 +31,7 @@ protected RestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get) public abstract record RestRequest : RestRequest, IRestRequestGeneric where T : class { - protected RestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, T? content = null) + protected RestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get,bool isMultipartFormData=false, T? content = null) : base(uri, httpMethod) { Content = content; diff --git a/src/Spoleto.RestClient/RestRequest/XmlRestRequest.cs b/src/Spoleto.RestClient/RestRequest/XmlRestRequest.cs index 1bb09ea..10773b2 100644 --- a/src/Spoleto.RestClient/RestRequest/XmlRestRequest.cs +++ b/src/Spoleto.RestClient/RestRequest/XmlRestRequest.cs @@ -4,8 +4,8 @@ namespace Spoleto.RestClient { public record XmlRestRequest : RestRequest, IXmlRestRequest where TObj : class { - public XmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? obj = null) - : base(uri, httpMethod, SerializationManager.Serialize(SerializationManager.DataFomat.Xml, obj)) + public XmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, bool isMultipartFormData = false, TObj? obj = null) + : base(uri, httpMethod, isMultipartFormData, SerializationManager.Serialize(SerializationManager.DataFomat.Xml, obj)) { } @@ -13,7 +13,12 @@ public XmlRestRequest(string uri, HttpMethod httpMethod = HttpMethod.Get, TObj? public override HttpContent GetHttpContent() { - var content = new StringContent(Content, Encoding, ContentType); + HttpContent content = new StringContent(Content, Encoding, ContentType); + + if (IsMultipartFormData) + { + content = new MultipartFormDataContent { { content } }; + } return content; }