Skip to content

Commit 1a29ca1

Browse files
committed
Update ES client
* TransportClient -> IRequestInvoker
1 parent 8b15615 commit 1a29ca1

6 files changed

+32
-22
lines changed

Elasticstretch.DependencyInjection/Elasticstretch.DependencyInjection.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
</PropertyGroup>
2727

2828
<ItemGroup>
29-
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="[8.9.*,8.12)" />
29+
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.*" />
3030
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.*" />
3131
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.*" />
3232
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.*" />

Elasticstretch.DependencyInjection/ElasticstretchServiceCollectionExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ public static IServiceCollection AddElasticsearchClient(
4747
x => new ElasticsearchClient(
4848
x.GetRequiredService<IOptions<ElasticsearchClientOptions>>().Value.ToSettings()));
4949

50+
services.TryAddTransient<DelegatingHttpHandlerFactory>();
51+
5052
if (configureSettings != null)
5153
{
5254
services.Configure<ElasticsearchClientOptions>(x => x.ConfigureSettings += configureSettings);
5355
}
5456

55-
configureHttp?.Invoke(services.AddHttpClient(HttpFactoryClient.ClientName));
57+
configureHttp?.Invoke(services.AddHttpClient(ConfigureClientFromNodes.HttpClientName));
5658

5759
return services;
5860
}

Elasticstretch.DependencyInjection/GlobalSuppressions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,9 @@
2323
"CA1812:Avoid uninstantiated internal classes",
2424
Scope = "type",
2525
Target = "~T:Elastic.Clients.Elasticsearch.Options.ConfigureClientFromNodes")]
26+
27+
[assembly: SuppressMessage(
28+
"Performance",
29+
"CA1812:Avoid uninstantiated internal classes",
30+
Scope = "type",
31+
Target = "~T:Elastic.Clients.Elasticsearch.Options.DelegatingHttpHandlerFactory")]
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
namespace Elastic.Clients.Elasticsearch.Options;
22

3-
using Microsoft.Extensions.Http;
3+
using Elastic.Transport;
4+
45
using Microsoft.Extensions.Options;
56

67
sealed class ConfigureClientFromNodes(
7-
IServiceProvider provider,
8-
IOptionsFactory<ElasticsearchNodeOptions> nodeOptions,
9-
IOptionsMonitor<HttpClientFactoryOptions> httpOptions,
10-
IEnumerable<IHttpMessageHandlerBuilderFilter> httpFilters)
8+
DelegatingHttpHandlerFactory httpFactory,
9+
IOptionsFactory<ElasticsearchNodeOptions> nodeOptions)
1110
: ConfigureOptionsFromOptions<ElasticsearchClientOptions, ElasticsearchNodeOptions>(nodeOptions)
1211
{
12+
public const string HttpClientName = nameof(ElasticsearchClient);
13+
1314
protected override void Configure(ElasticsearchClientOptions options, ElasticsearchNodeOptions dependency)
1415
{
1516
if (dependency.CredentialsHeader != null)
@@ -19,6 +20,11 @@ protected override void Configure(ElasticsearchClientOptions options, Elasticsea
1920

2021
var fallback = options.NodePool;
2122
options.NodePool = () => dependency.CreatePool() ?? fallback();
22-
options.Connection = () => new HttpFactoryClient(provider, httpOptions, httpFilters);
23+
options.Connection = () => new HttpRequestInvoker(CreateHttpHandler);
24+
}
25+
26+
private HttpMessageHandler CreateHttpHandler(HttpMessageHandler defaultHandler, BoundConfiguration config)
27+
{
28+
return httpFactory.CreateDelegatingHandler(HttpClientName, defaultHandler);
2329
}
2430
}

Elasticstretch.DependencyInjection/Options/HttpFactoryClient.cs renamed to Elasticstretch.DependencyInjection/Options/DelegatingHttpHandlerFactory.cs

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

3-
using Elastic.Clients.Elasticsearch;
4-
using Elastic.Transport;
5-
63
using Microsoft.Extensions.DependencyInjection;
74
using Microsoft.Extensions.Http;
85
using Microsoft.Extensions.Options;
96

107
using System.Net.Http;
118

12-
sealed class HttpFactoryClient(
13-
IServiceProvider provider,
9+
// Use as much as we can from HTTP client factory configuration, while injecting a primary handler on demand.
10+
// Compare with https://github.com/dotnet/runtime/blob/05d94d94028b5622b19734e0e1b60d7aca4667b3/src/libraries/Microsoft.Extensions.Http/src/DefaultHttpMessageHandlerBuilder.cs#L47
11+
sealed class DelegatingHttpHandlerFactory(
12+
IServiceProvider services,
1413
IOptionsMonitor<HttpClientFactoryOptions> options,
1514
IEnumerable<IHttpMessageHandlerBuilderFilter> filters)
16-
: HttpTransportClient
1715
{
18-
public const string ClientName = nameof(ElasticsearchClient);
19-
20-
protected override HttpMessageHandler CreateHttpClientHandler(RequestData requestData)
16+
public HttpMessageHandler CreateDelegatingHandler(string clientName, HttpMessageHandler primaryHandler)
2117
{
22-
var clientOptions = options.Get(ClientName);
18+
var clientOptions = options.Get(clientName);
2319

2420
var configureHandler = (HttpMessageHandlerBuilder builder) =>
2521
{
@@ -35,11 +31,11 @@ protected override HttpMessageHandler CreateHttpClientHandler(RequestData reques
3531
configureHandler = filter.Configure(configureHandler);
3632
}
3733

38-
var builder = provider.GetRequiredService<HttpMessageHandlerBuilder>();
39-
builder.Name = ClientName;
34+
var builder = services.GetRequiredService<HttpMessageHandlerBuilder>();
35+
builder.Name = clientName;
4036

4137
configureHandler(builder);
42-
builder.PrimaryHandler = base.CreateHttpClientHandler(requestData);
38+
builder.PrimaryHandler = primaryHandler;
4339

4440
return builder.Build();
4541
}

Elasticstretch.DependencyInjection/Options/ElasticsearchClientOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ElasticsearchClientOptions
1919
/// <summary>
2020
/// Gets or sets the factory for the underlying transport connection.
2121
/// </summary>
22-
public Func<TransportClient> Connection { get; set; } = () => new HttpTransportClient();
22+
public Func<IRequestInvoker> Connection { get; set; } = () => new HttpRequestInvoker();
2323

2424
/// <summary>
2525
/// Gets or sets the factory for the client source serializer.

0 commit comments

Comments
 (0)