diff --git a/Elasticstretch.DependencyInjection/Options/ConfigureClientFromNodes.cs b/Elasticstretch.DependencyInjection/Options/ConfigureClientFromNodes.cs index 8db50e9..249ff1f 100644 --- a/Elasticstretch.DependencyInjection/Options/ConfigureClientFromNodes.cs +++ b/Elasticstretch.DependencyInjection/Options/ConfigureClientFromNodes.cs @@ -8,15 +8,18 @@ sealed class ConfigureClientFromNodes { readonly IServiceProvider _provider; readonly IOptionsMonitor _httpOptions; + readonly IEnumerable _httpFilters; public ConfigureClientFromNodes( IServiceProvider provider, IOptionsFactory nodeOptions, - IOptionsMonitor httpOptions) + IOptionsMonitor httpOptions, + IEnumerable httpFilters) : base(nodeOptions) { _provider = provider; _httpOptions = httpOptions; + _httpFilters = httpFilters; } protected override void Configure(ElasticsearchClientOptions options, ElasticsearchNodeOptions dependency) @@ -28,6 +31,6 @@ protected override void Configure(ElasticsearchClientOptions options, Elasticsea var fallback = options.NodePool; options.NodePool = () => dependency.CreatePool() ?? fallback(); - options.Connection = () => new HttpFactoryClient(_provider, _httpOptions); + options.Connection = () => new HttpFactoryClient(_provider, _httpOptions, _httpFilters); } } diff --git a/Elasticstretch.DependencyInjection/Options/HttpFactoryClient.cs b/Elasticstretch.DependencyInjection/Options/HttpFactoryClient.cs index bd21c27..8f049d6 100644 --- a/Elasticstretch.DependencyInjection/Options/HttpFactoryClient.cs +++ b/Elasticstretch.DependencyInjection/Options/HttpFactoryClient.cs @@ -13,23 +13,40 @@ sealed class HttpFactoryClient : HttpTransportClient readonly IServiceProvider _provider; readonly IOptionsMonitor _options; + readonly IEnumerable _filters; - public HttpFactoryClient(IServiceProvider provider, IOptionsMonitor options) + public HttpFactoryClient( + IServiceProvider provider, + IOptionsMonitor options, + IEnumerable filters) { _provider = provider; _options = options; + _filters = filters; } protected override HttpMessageHandler CreateHttpClientHandler(RequestData requestData) { - var builder = _provider.GetRequiredService(); - builder.PrimaryHandler = base.CreateHttpClientHandler(requestData); + var clientOptions = _options.Get(ClientName); + + var configureHandler = (HttpMessageHandlerBuilder builder) => + { + foreach (var item in clientOptions.HttpMessageHandlerBuilderActions) + { + item(builder); + } + }; - foreach (var item in _options.Get(ClientName).HttpMessageHandlerBuilderActions) + // Not sure why filters are needed in addition to builder actions, but OK... + foreach (var filter in _filters.Reverse()) { - item(builder); + configureHandler = filter.Configure(configureHandler); } + var builder = _provider.GetRequiredService(); + configureHandler(builder); + + builder.PrimaryHandler = base.CreateHttpClientHandler(requestData); return builder.Build(); } }