diff --git a/DigitalData.Core.Abstractions/Client/IBaseHttpClientService.cs b/DigitalData.Core.Abstractions/Client/IBaseHttpClientService.cs index cd4c43c..756e94e 100644 --- a/DigitalData.Core.Abstractions/Client/IBaseHttpClientService.cs +++ b/DigitalData.Core.Abstractions/Client/IBaseHttpClientService.cs @@ -4,12 +4,15 @@ namespace DigitalData.Core.Abstractions.Client { public interface IBaseHttpClientService { - public string Uri { get; init; } + string Uri { get; init; } - public CookieCollection GetCookies(string route = ""); + CookieCollection GetCookies(string route = ""); Task FetchAsync( - string route = "", + string? scheme = null, + int? port = null, + string? path = null, + Dictionary? queryParams = null, HttpMethod? method = null, HttpContent? body = null, Dictionary? form = null, diff --git a/DigitalData.Core.Client/BaseHttpClientService.cs b/DigitalData.Core.Client/BaseHttpClientService.cs index 95a2317..ee45d4d 100644 --- a/DigitalData.Core.Client/BaseHttpClientService.cs +++ b/DigitalData.Core.Client/BaseHttpClientService.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Options; using System.Diagnostics.CodeAnalysis; using System.Net; +using System.Web; namespace DigitalData.Core.Client { @@ -23,7 +24,10 @@ namespace DigitalData.Core.Client public CookieCollection GetCookies(string route = "") => _cookies.GetCookies(uri: new Uri(Uri + route)); public async Task FetchAsync( - string route = "", + string? scheme = null, + int? port = null, + string? path = null, + Dictionary? queryParams = null, HttpMethod? method = null, HttpContent? body = null, Dictionary? form = null, @@ -36,10 +40,26 @@ namespace DigitalData.Core.Client method ??= HttpMethod.Get; // create URL - var requestUriStr = Uri + route; - var requestUri = new Uri(requestUriStr); + var uriBuilder = new UriBuilder(Uri); + if(scheme is not null) + uriBuilder.Scheme = scheme; + if (port is int portInt) + uriBuilder.Port = portInt; + uriBuilder.Path = path; - var requestMessage = new HttpRequestMessage(method, requestUriStr); + // Add query parameters if provided + if (queryParams?.Count > 0) + { + var query = HttpUtility.ParseQueryString(uriBuilder.Query); + foreach (var param in queryParams) + query[param.Key] = param.Value; + + uriBuilder.Query = query.ToString(); + } + + var requestUri = uriBuilder.Uri; + + var requestMessage = new HttpRequestMessage(method, requestUri); // Add headers if provided headers?.ForEach(header => requestMessage.Headers.Add(header.Key, header.Value));