From 34e6254e1868b4b540f6b6b21cfaa23c7deb5647 Mon Sep 17 00:00:00 2001 From: Michael Yarichuk Date: Sun, 3 May 2020 18:55:53 +0300 Subject: [PATCH] add convenience methods (adding multiple certificates at once, multiple policies at once, etc) --- Simple.HttpClientFactory/HttpClientBuilder.cs | 35 ++++++++++++++++++- .../IHttpClientBuilder.cs | 17 +++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Simple.HttpClientFactory/HttpClientBuilder.cs b/Simple.HttpClientFactory/HttpClientBuilder.cs index 55f6d3f..4ef0daa 100644 --- a/Simple.HttpClientFactory/HttpClientBuilder.cs +++ b/Simple.HttpClientFactory/HttpClientBuilder.cs @@ -17,14 +17,37 @@ internal class HttpClientBuilder : IHttpClientBuilder private readonly List _certificates = new List(); private readonly List> _policies = new List>(); private readonly List _middlewareHandlers = new List(); + private readonly Dictionary _defaultHeaders = new Dictionary(); + public IHttpClientBuilder WithDefaultHeaders(IReadOnlyDictionary headers) + { + foreach(var kvp in headers) + { + if(!_defaultHeaders.ContainsKey(kvp.Key)) + _defaultHeaders.Add(kvp.Key, kvp.Value); + } + return this; + } + public IHttpClientBuilder WithCertificates(IEnumerable certificates) + { + _certificates.AddRange(certificates); + return this; + } + public IHttpClientBuilder WithCertificate(params X509Certificate2[] certificates) { _certificates.AddRange(certificates); return this; } + public IHttpClientBuilder WithPolicies(IEnumerable> policies) + { + _policies.AddRange(policies); + return this; + } + + public IHttpClientBuilder WithPolicy(IAsyncPolicy policy) { _policies.Add(policy); @@ -130,7 +153,7 @@ public HttpClient Build(Action clientHandlerConfigurator = nu } var client = ConstructClientWithMiddleware(clientHandler, policyHandler); - + if (_timeout.HasValue) client.Timeout = _timeout.Value; @@ -158,6 +181,16 @@ private HttpClient ConstructClientWithMiddleware(TClientHandler } else client = new HttpClient(clientHandler, true); + + if(_defaultHeaders.Count > 0) + { + foreach(var header in _defaultHeaders) + { + if(!client.DefaultRequestHeaders.Contains(header.Key)) + client.DefaultRequestHeaders.Add(header.Key, header.Value); + } + } + return client; } } diff --git a/Simple.HttpClientFactory/IHttpClientBuilder.cs b/Simple.HttpClientFactory/IHttpClientBuilder.cs index df0909a..f357a2d 100644 --- a/Simple.HttpClientFactory/IHttpClientBuilder.cs +++ b/Simple.HttpClientFactory/IHttpClientBuilder.cs @@ -1,5 +1,6 @@ using Polly; using System; +using System.Collections.Generic; using System.Net.Http; using System.Security.Cryptography.X509Certificates; @@ -7,11 +8,27 @@ namespace Simple.HttpClientFactory { public interface IHttpClientBuilder { + /// + /// Add default headers to be added to teach request + /// + IHttpClientBuilder WithDefaultHeaders(IReadOnlyDictionary headers); + + /// + /// Configure one or more SSL certificates to use + /// + IHttpClientBuilder WithCertificates(IEnumerable certificates); + /// /// Configure one or more SSL certificates to use /// IHttpClientBuilder WithCertificate(params X509Certificate2[] certificates); + /// + /// Chain multiple Polly error policies + /// + /// Policies will be evaluated in the order of their configuration + IHttpClientBuilder WithPolicies(IEnumerable> policies); + /// /// Chain Polly error policy ///