using Slim; using System.Extensions; using System.Net.Http; using System.Net.Http.Headers; namespace System.DependencyInjection.Http; public sealed class HttpClientBuilder { private readonly IServiceProducer serviceProducer; private Uri baseAddress; private Func httpMessageHandlerFactory; private bool disposeMessageHandler; private Action defaultRequestHeadersSetup; private long maxResponseBufferSize = 2147483647L; //2GB default HttpClient value [https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.maxresponsecontentbuffersize?view=net-6.0] private TimeSpan timeout = TimeSpan.FromSeconds(100); //100 seconds default HttpClient value [https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout?view=net-6.0] internal HttpClientBuilder(IServiceProducer serviceProducer) { serviceProducer.ThrowIfNull(nameof(serviceProducer)); this.serviceProducer = serviceProducer; } public HttpClientBuilder WithMessageHandler(Func httpMessageHandlerFactory) { httpMessageHandlerFactory.ThrowIfNull(nameof(httpMessageHandlerFactory)); this.httpMessageHandlerFactory = httpMessageHandlerFactory; return this; } public HttpClientBuilder WithDisposeMessageHandler(bool disposeMessageHandler) { this.disposeMessageHandler = disposeMessageHandler; return this; } public HttpClientBuilder WithBaseAddress(Uri baseAddress) { baseAddress.ThrowIfNull(nameof(baseAddress)); this.baseAddress = baseAddress; return this; } public HttpClientBuilder WithDefaultRequestHeadersSetup(Action setup) { setup.ThrowIfNull(nameof(setup)); this.defaultRequestHeadersSetup = setup; return this; } public HttpClientBuilder WithMaxResponseBufferSize(long responseBufferSize) { this.maxResponseBufferSize = responseBufferSize; return this; } public HttpClientBuilder WithTimeout(TimeSpan timeout) { this.timeout = timeout; return this; } public IServiceProducer Build() { this.serviceProducer.RegisterScoped>(sp => { var client = this.httpMessageHandlerFactory is not null ? new HttpClient(this.httpMessageHandlerFactory(sp), this.disposeMessageHandler) : new HttpClient(); client.BaseAddress = this.baseAddress; this.defaultRequestHeadersSetup?.Invoke(client.DefaultRequestHeaders); client.MaxResponseContentBufferSize = this.maxResponseBufferSize; client.Timeout = this.timeout; return client; }); return this.serviceProducer; } }