Skip to content

Commit d29d51a

Browse files
committed
HTTP factory integration
1 parent 3590023 commit d29d51a

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

Elasticstretch.DependencyInjection/Elasticstretch.DependencyInjection.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<ItemGroup>
2929
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="*" />
3030
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="*" />
31+
<PackageReference Include="Microsoft.Extensions.Http" Version="*" />
3132
<PackageReference Include="Microsoft.Extensions.Options" Version="*" />
3233
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="*" />
3334
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="*" PrivateAssets="All" />

Elasticstretch.DependencyInjection/ElasticstretchServiceCollectionExtensions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ public static class ElasticstretchServiceCollectionExtensions
2525
/// </remarks>
2626
/// <param name="services">The service collection.</param>
2727
/// <param name="configureSettings">A delegate to configure the client settings.</param>
28+
/// <param name="configureHttp">
29+
/// A delegate to configure the underlying HTTP client (not all features supported).
30+
/// </param>
2831
/// <returns>The same services, for chaining.</returns>
2932
public static IServiceCollection AddElasticsearchClient(
3033
this IServiceCollection services,
31-
Action<ElasticsearchClientSettings>? configureSettings = null)
34+
Action<ElasticsearchClientSettings>? configureSettings = null,
35+
Action<IHttpClientBuilder>? configureHttp = null)
3236
{
3337
services.AddOptions();
3438

@@ -46,6 +50,8 @@ public static IServiceCollection AddElasticsearchClient(
4650
services.Configure<ElasticsearchClientOptions>(x => x.ConfigureSettings += configureSettings);
4751
}
4852

53+
configureHttp?.Invoke(services.AddHttpClient(HttpFactoryClient.ClientName));
54+
4955
return services;
5056
}
5157

Elasticstretch.DependencyInjection/Options/ConfigureClientFromNodes.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
namespace Elastic.Clients.Elasticsearch.Options;
22

3+
using Microsoft.Extensions.Http;
34
using Microsoft.Extensions.Options;
45

56
sealed class ConfigureClientFromNodes
67
: ConfigureOptionsFromOptions<ElasticsearchClientOptions, ElasticsearchNodeOptions>
78
{
8-
public ConfigureClientFromNodes(IOptionsFactory<ElasticsearchNodeOptions> optionsFactory)
9-
: base(optionsFactory)
9+
readonly IServiceProvider _provider;
10+
readonly IOptionsMonitor<HttpClientFactoryOptions> _httpOptions;
11+
12+
public ConfigureClientFromNodes(
13+
IServiceProvider provider,
14+
IOptionsFactory<ElasticsearchNodeOptions> nodeOptions,
15+
IOptionsMonitor<HttpClientFactoryOptions> httpOptions)
16+
: base(nodeOptions)
1017
{
18+
_provider = provider;
19+
_httpOptions = httpOptions;
1120
}
1221

1322
protected override void Configure(ElasticsearchClientOptions options, ElasticsearchNodeOptions dependency)
@@ -19,5 +28,6 @@ protected override void Configure(ElasticsearchClientOptions options, Elasticsea
1928

2029
var fallback = options.NodePool;
2130
options.NodePool = () => dependency.CreatePool() ?? fallback();
31+
options.Connection = () => new HttpFactoryClient(_provider, _httpOptions);
2232
}
2333
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
namespace Elastic.Clients.Elasticsearch.Options;
2+
3+
using Elastic.Clients.Elasticsearch;
4+
using Elastic.Transport;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Microsoft.Extensions.Http;
7+
using Microsoft.Extensions.Options;
8+
using System.Net.Http;
9+
10+
sealed class HttpFactoryClient : HttpTransportClient
11+
{
12+
public const string ClientName = nameof(ElasticsearchClient);
13+
14+
readonly IServiceProvider _provider;
15+
readonly IOptionsMonitor<HttpClientFactoryOptions> _options;
16+
17+
public HttpFactoryClient(IServiceProvider provider, IOptionsMonitor<HttpClientFactoryOptions> options)
18+
{
19+
_provider = provider;
20+
_options = options;
21+
}
22+
23+
protected override HttpMessageHandler CreateHttpClientHandler(RequestData requestData)
24+
{
25+
var builder = _provider.GetRequiredService<HttpMessageHandlerBuilder>();
26+
builder.PrimaryHandler = base.CreateHttpClientHandler(requestData);
27+
28+
foreach (var item in _options.Get(ClientName).HttpMessageHandlerBuilderActions)
29+
{
30+
item(builder);
31+
}
32+
33+
return builder.Build();
34+
}
35+
}

0 commit comments

Comments
 (0)