Skip to content

Commit 22bc76e

Browse files
committed
Support HTTP handler filters
1 parent bca2896 commit 22bc76e

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

Elasticstretch.DependencyInjection/Options/ConfigureClientFromNodes.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ sealed class ConfigureClientFromNodes
88
{
99
readonly IServiceProvider _provider;
1010
readonly IOptionsMonitor<HttpClientFactoryOptions> _httpOptions;
11+
readonly IEnumerable<IHttpMessageHandlerBuilderFilter> _httpFilters;
1112

1213
public ConfigureClientFromNodes(
1314
IServiceProvider provider,
1415
IOptionsFactory<ElasticsearchNodeOptions> nodeOptions,
15-
IOptionsMonitor<HttpClientFactoryOptions> httpOptions)
16+
IOptionsMonitor<HttpClientFactoryOptions> httpOptions,
17+
IEnumerable<IHttpMessageHandlerBuilderFilter> httpFilters)
1618
: base(nodeOptions)
1719
{
1820
_provider = provider;
1921
_httpOptions = httpOptions;
22+
_httpFilters = httpFilters;
2023
}
2124

2225
protected override void Configure(ElasticsearchClientOptions options, ElasticsearchNodeOptions dependency)
@@ -28,6 +31,6 @@ protected override void Configure(ElasticsearchClientOptions options, Elasticsea
2831

2932
var fallback = options.NodePool;
3033
options.NodePool = () => dependency.CreatePool() ?? fallback();
31-
options.Connection = () => new HttpFactoryClient(_provider, _httpOptions);
34+
options.Connection = () => new HttpFactoryClient(_provider, _httpOptions, _httpFilters);
3235
}
3336
}

Elasticstretch.DependencyInjection/Options/HttpFactoryClient.cs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,40 @@ sealed class HttpFactoryClient : HttpTransportClient
1313

1414
readonly IServiceProvider _provider;
1515
readonly IOptionsMonitor<HttpClientFactoryOptions> _options;
16+
readonly IEnumerable<IHttpMessageHandlerBuilderFilter> _filters;
1617

17-
public HttpFactoryClient(IServiceProvider provider, IOptionsMonitor<HttpClientFactoryOptions> options)
18+
public HttpFactoryClient(
19+
IServiceProvider provider,
20+
IOptionsMonitor<HttpClientFactoryOptions> options,
21+
IEnumerable<IHttpMessageHandlerBuilderFilter> filters)
1822
{
1923
_provider = provider;
2024
_options = options;
25+
_filters = filters;
2126
}
2227

2328
protected override HttpMessageHandler CreateHttpClientHandler(RequestData requestData)
2429
{
25-
var builder = _provider.GetRequiredService<HttpMessageHandlerBuilder>();
26-
builder.PrimaryHandler = base.CreateHttpClientHandler(requestData);
30+
var clientOptions = _options.Get(ClientName);
31+
32+
var configureHandler = (HttpMessageHandlerBuilder builder) =>
33+
{
34+
foreach (var item in clientOptions.HttpMessageHandlerBuilderActions)
35+
{
36+
item(builder);
37+
}
38+
};
2739

28-
foreach (var item in _options.Get(ClientName).HttpMessageHandlerBuilderActions)
40+
// Not sure why filters are needed in addition to builder actions, but OK...
41+
foreach (var filter in _filters.Reverse())
2942
{
30-
item(builder);
43+
configureHandler = filter.Configure(configureHandler);
3144
}
3245

46+
var builder = _provider.GetRequiredService<HttpMessageHandlerBuilder>();
47+
configureHandler(builder);
48+
49+
builder.PrimaryHandler = base.CreateHttpClientHandler(requestData);
3350
return builder.Build();
3451
}
3552
}

0 commit comments

Comments
 (0)