From 7e7f63524d6fb9480890cbebb3b438796479ea48 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 3 Nov 2025 22:08:17 +0000 Subject: [PATCH 1/2] allow passing additional headers to client methods --- ClientProxyBase/ClientProxyBase.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ClientProxyBase/ClientProxyBase.cs b/ClientProxyBase/ClientProxyBase.cs index adb3c0b1..fd1da05e 100644 --- a/ClientProxyBase/ClientProxyBase.cs +++ b/ClientProxyBase/ClientProxyBase.cs @@ -105,7 +105,7 @@ protected virtual ResponseData HandleResponseContent(String content) return JsonConvert.DeserializeObject>(content); } - protected virtual async Task> SendGetRequest(String uri, String accessToken, CancellationToken cancellationToken) + protected virtual async Task> SendGetRequest(String uri, String accessToken, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) { HttpRequestMessage requestMessage = new(HttpMethod.Get, uri); @@ -126,7 +126,7 @@ protected virtual async Task> SendGetRequest(String return Result.Success(responseData); } - protected virtual async Task> SendPostRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken) + protected virtual async Task> SendPostRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) { HttpRequestMessage requestMessage = new(HttpMethod.Post, uri); @@ -154,7 +154,7 @@ protected virtual async Task> SendPostRequest(responseData); } - protected virtual async Task> SendPutRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken) + protected virtual async Task> SendPutRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) { HttpRequestMessage requestMessage = new(HttpMethod.Put, uri); @@ -184,7 +184,7 @@ protected virtual async Task> SendPutRequest(responseData); } - protected virtual async Task> SendPatchRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken) + protected virtual async Task> SendPatchRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) { HttpRequestMessage requestMessage = new(HttpMethod.Patch, uri); @@ -214,7 +214,7 @@ protected virtual async Task> SendPatchRequest(responseData); } - protected virtual async Task> SendDeleteRequest(String uri, String accessToken, CancellationToken cancellationToken) + protected virtual async Task> SendDeleteRequest(String uri, String accessToken, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) { HttpRequestMessage requestMessage = new(HttpMethod.Delete, uri); From 69e01bb7a77e177715e16c89cc9d9a1f72fbe017 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 4 Nov 2025 09:30:56 +0000 Subject: [PATCH 2/2] remove optional params --- ClientProxyBase/ClientProxyBase.cs | 50 ++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/ClientProxyBase/ClientProxyBase.cs b/ClientProxyBase/ClientProxyBase.cs index fd1da05e..80add2d3 100644 --- a/ClientProxyBase/ClientProxyBase.cs +++ b/ClientProxyBase/ClientProxyBase.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using SimpleResults; using System; +using System.Linq; namespace ClientProxyBase; @@ -105,13 +106,21 @@ protected virtual ResponseData HandleResponseContent(String content) return JsonConvert.DeserializeObject>(content); } - protected virtual async Task> SendGetRequest(String uri, String accessToken, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) + protected virtual async Task> SendGetRequest(String uri, + String accessToken, + CancellationToken cancellationToken) => + await this.SendGetRequest(uri, accessToken, cancellationToken, null); + + + protected virtual async Task> SendGetRequest(String uri, String accessToken, CancellationToken cancellationToken, List<(String header, String value)> additionalHeaders) { HttpRequestMessage requestMessage = new(HttpMethod.Get, uri); if (String.IsNullOrEmpty(accessToken) == false) requestMessage.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationSchemes.Bearer, accessToken); - + + AddAdditionalHeaders(requestMessage, additionalHeaders); + // Make the Http Call here HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(requestMessage, cancellationToken); @@ -126,12 +135,17 @@ protected virtual async Task> SendGetRequest(String return Result.Success(responseData); } - protected virtual async Task> SendPostRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) + protected virtual async Task> SendPostRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken) => await this.SendPostRequest(uri, accessToken, content, cancellationToken, null); + + protected virtual async Task> SendPostRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, List<(String header, String value)> additionalHeaders) { HttpRequestMessage requestMessage = new(HttpMethod.Post, uri); if (String.IsNullOrEmpty(accessToken) == false) requestMessage.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationSchemes.Bearer, accessToken); + + AddAdditionalHeaders(requestMessage, additionalHeaders); + if (content.GetType() == typeof(FormUrlEncodedContent)) { // Treat this specially requestMessage.Content = content as FormUrlEncodedContent; @@ -154,12 +168,18 @@ protected virtual async Task> SendPostRequest(responseData); } - protected virtual async Task> SendPutRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) + protected virtual async Task> SendPutRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken) => + await this.SendPutRequest(uri, accessToken, content, cancellationToken, null); + + protected virtual async Task> SendPutRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, List<(String header, String value)> additionalHeaders) { HttpRequestMessage requestMessage = new(HttpMethod.Put, uri); if (String.IsNullOrEmpty(accessToken) == false) requestMessage.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationSchemes.Bearer, accessToken); + + AddAdditionalHeaders(requestMessage, additionalHeaders); + if (content.GetType() == typeof(FormUrlEncodedContent)) { // Treat this specially @@ -184,12 +204,17 @@ protected virtual async Task> SendPutRequest(responseData); } - protected virtual async Task> SendPatchRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) + protected virtual async Task> SendPatchRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken) => await this.SendPatchRequest(uri, accessToken, content, cancellationToken, null); + + protected virtual async Task> SendPatchRequest(String uri, String accessToken, TRequest content, CancellationToken cancellationToken, List<(String header, String value)> additionalHeaders) { HttpRequestMessage requestMessage = new(HttpMethod.Patch, uri); if (String.IsNullOrEmpty(accessToken) == false) requestMessage.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationSchemes.Bearer, accessToken); + + AddAdditionalHeaders(requestMessage, additionalHeaders); + if (content.GetType() == typeof(FormUrlEncodedContent)) { // Treat this specially @@ -214,13 +239,17 @@ protected virtual async Task> SendPatchRequest(responseData); } - protected virtual async Task> SendDeleteRequest(String uri, String accessToken, CancellationToken cancellationToken, (String header, String value) additionalHeaders = default) + protected virtual async Task> SendDeleteRequest(String uri, String accessToken, CancellationToken cancellationToken) => await this.SendDeleteRequest(uri, accessToken, cancellationToken, null); + + protected virtual async Task> SendDeleteRequest(String uri, String accessToken, CancellationToken cancellationToken, List<(String header, String value)> additionalHeaders) { HttpRequestMessage requestMessage = new(HttpMethod.Delete, uri); if (String.IsNullOrEmpty(accessToken) == false) requestMessage.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationSchemes.Bearer, accessToken); + AddAdditionalHeaders(requestMessage,additionalHeaders); + // Make the Http Call here HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(requestMessage, cancellationToken); @@ -235,6 +264,15 @@ protected virtual async Task> SendDeleteRequest(Str return Result.Success(responseData); } + static void AddAdditionalHeaders(HttpRequestMessage requestMessage, + List<(String header, String value)> additionalHeaders) { + if (additionalHeaders != null && additionalHeaders.Any()) { + foreach ((String header, String value) additionalHeader in additionalHeaders) { + requestMessage.Headers.Add(additionalHeader.header, additionalHeader.value); + } + } + } + #endregion }