Skip to content

Commit 0813129

Browse files
authored
Refactor response handling and update project structure (#131)
Refactored response handling to improve clarity and consistency: - Renamed `DefaultMimeType` to `DefaultContentType`. - Removed `CustomResponseBuilder` parameter from `RequestData` constructor. - Updated `RequestCoreAsync` to use `contentType` instead of `mimeType`. - Added `ResponseFactory` property to `IRequestInvoker` interface. - Refactored `DefaultResponseBuilder` to implement `IResponseBuilder`. - Simplified response deserialization logic. Updated project structure and configurations: - Added new project `Elastic.Transport.Tests.Shared`. - Updated solution file and project references. - Enabled nullable reference types in several files. - Removed `StreamResponseTests.cs` and `ResponseBuilderDisposeTests.cs`. - Added new test classes for `ResponseFactory`, `DynamicResponseBuilder`, and `BytesResponseBuilder`. Enhanced error handling and documentation: - Removed `EmptyError` class. - Updated `ApiCallDetails` to use nullable reference types. - Improved method signatures and internal logic for consistency. - Added license information to several files.
1 parent e8cd3c2 commit 0813129

File tree

64 files changed

+2605
-1061
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+2605
-1061
lines changed

Elastic.Transport.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Playground", "Playground\Pl
4444
EndProject
4545
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Elasticsearch.IntegrationTests", "tests\Elastic.Elasticsearch.IntegrationTests\Elastic.Elasticsearch.IntegrationTests.csproj", "{317C118F-FA1E-499A-B7F2-DC932DE66CB8}"
4646
EndProject
47+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Transport.Tests.Shared", "tests\Elastic.Transport.Tests.Shared\Elastic.Transport.Tests.Shared.csproj", "{13A2597D-F50C-4D7F-ADA9-716991C8E9DE}"
48+
EndProject
4749
Global
4850
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4951
Debug|Any CPU = Debug|Any CPU
@@ -86,6 +88,10 @@ Global
8688
{317C118F-FA1E-499A-B7F2-DC932DE66CB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
8789
{317C118F-FA1E-499A-B7F2-DC932DE66CB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
8890
{317C118F-FA1E-499A-B7F2-DC932DE66CB8}.Release|Any CPU.Build.0 = Release|Any CPU
91+
{13A2597D-F50C-4D7F-ADA9-716991C8E9DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
92+
{13A2597D-F50C-4D7F-ADA9-716991C8E9DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
93+
{13A2597D-F50C-4D7F-ADA9-716991C8E9DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
94+
{13A2597D-F50C-4D7F-ADA9-716991C8E9DE}.Release|Any CPU.Build.0 = Release|Any CPU
8995
EndGlobalSection
9096
GlobalSection(SolutionProperties) = preSolution
9197
HideSolutionNode = FALSE
@@ -100,6 +106,7 @@ Global
100106
{ED4E89BE-FBE9-4876-979C-63A0E3BC5419} = {BBB0AC81-F09D-4895-84E2-7E933D608E78}
101107
{5EE4DC72-B337-448B-802A-6158F4D90667} = {7610B796-BB3E-4CB2-8296-79BBFF6D23FC}
102108
{317C118F-FA1E-499A-B7F2-DC932DE66CB8} = {3582B07D-C2B0-49CC-B676-EAF806EB010E}
109+
{13A2597D-F50C-4D7F-ADA9-716991C8E9DE} = {3582B07D-C2B0-49CC-B676-EAF806EB010E}
103110
EndGlobalSection
104111
GlobalSection(ExtensibilityGlobals) = postSolution
105112
SolutionGuid = {7F60C4BB-6216-4E50-B1E4-9C38EB484843}

Playground/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66

77
var registration = new ElasticsearchProductRegistration(typeof(Elastic.Clients.Elasticsearch.ElasticsearchClient));
88

9-
Console.WriteLine(registration.DefaultMimeType ?? "NOT SPECIFIED");
9+
Console.WriteLine(registration.DefaultContentType ?? "NOT SPECIFIED");

src/Elastic.Transport.VirtualizedCluster/Components/ExposingPipelineFactory.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public ExposingPipelineFactory(TConfiguration configuration, DateTimeProvider da
1515
{
1616
DateTimeProvider = dateTimeProvider;
1717
Configuration = configuration;
18-
Pipeline = Create(new RequestData(Configuration, null, null), DateTimeProvider);
18+
Pipeline = Create(new RequestData(Configuration, null), DateTimeProvider);
1919
RequestHandler = new DistributedTransport<TConfiguration>(Configuration, this, DateTimeProvider);
2020
}
2121

@@ -28,3 +28,4 @@ public ExposingPipelineFactory(TConfiguration configuration, DateTimeProvider da
2828
public override RequestPipeline Create(RequestData requestData, DateTimeProvider dateTimeProvider) =>
2929
new DefaultRequestPipeline(requestData, DateTimeProvider);
3030
}
31+
#nullable restore

src/Elastic.Transport.VirtualizedCluster/Components/VirtualClusterConnection.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Collections.Generic;
88
using System.IO;
99
using System.Linq;
10+
using System.Runtime;
1011
using System.Threading;
1112
using System.Threading.Tasks;
1213
using Elastic.Transport.VirtualizedCluster.Products;
@@ -101,6 +102,8 @@ private static object DefaultResponse
101102
}
102103
}
103104

105+
public ResponseFactory ResponseFactory => _inMemoryRequestInvoker.ResponseFactory;
106+
104107
private void UpdateCluster(VirtualCluster cluster)
105108
{
106109
lock (Lock)
@@ -109,7 +112,6 @@ private void UpdateCluster(VirtualCluster cluster)
109112
_calls = cluster.Nodes.ToDictionary(n => n.Uri.Port, v => new State());
110113
_productRegistration = cluster.ProductRegistration;
111114
}
112-
113115
}
114116

115117
private bool IsSniffRequest(Endpoint endpoint) => _productRegistration.IsSniffRequest(endpoint);
@@ -173,7 +175,7 @@ public TResponse Request<TResponse>(Endpoint endpoint, RequestData requestData,
173175
}
174176
catch (TheException e)
175177
{
176-
return requestData.ConnectionSettings.ProductRegistration.ResponseBuilder.ToResponse<TResponse>(endpoint, requestData, postData, e, null, null, Stream.Null, null, -1, null, null);
178+
return ResponseFactory.Create<TResponse>(endpoint, requestData, postData, e, null, null, Stream.Null, null, -1, null, null);
177179
}
178180
}
179181

@@ -326,3 +328,4 @@ private class State
326328
public int Successes;
327329
}
328330
}
331+
#nullable restore

src/Elastic.Transport.VirtualizedCluster/Components/VirtualizedCluster.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ internal VirtualizedCluster(TestableDateTimeProvider dateTimeProvider, Transport
3232
path: RootPath,
3333
postData: PostData.Serializable(new { }),
3434
openTelemetryData: default,
35-
localConfiguration: r?.Invoke(new RequestConfigurationDescriptor()),
36-
responseBuilder: null
35+
localConfiguration: r?.Invoke(new RequestConfigurationDescriptor())
3736
);
3837
_asyncCall = async (t, r) =>
3938
{
@@ -43,14 +42,13 @@ internal VirtualizedCluster(TestableDateTimeProvider dateTimeProvider, Transport
4342
postData: PostData.Serializable(new { }),
4443
openTelemetryData: default,
4544
localConfiguration: r?.Invoke(new RequestConfigurationDescriptor()),
46-
responseBuilder: null,
4745
CancellationToken.None
4846
).ConfigureAwait(false);
4947
return res;
5048
};
5149
}
5250

53-
public VirtualClusterRequestInvoker Connection => RequestHandler.Configuration.Connection as VirtualClusterRequestInvoker;
51+
public VirtualClusterRequestInvoker Connection => RequestHandler.Configuration.RequestInvoker as VirtualClusterRequestInvoker;
5452
public NodePool ConnectionPool => RequestHandler.Configuration.NodePool;
5553
public ITransport<ITransportConfiguration> RequestHandler => _exposingRequestPipeline?.RequestHandler;
5654

src/Elastic.Transport.VirtualizedCluster/Products/Elasticsearch/ElasticsearchVirtualCluster.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public ElasticsearchVirtualCluster MasterEligible(params int[] ports)
6666
foreach (var node in InternalNodes.Where(n => !ports.Contains(n.Uri.Port)))
6767
{
6868
var currentFeatures = node.Features.Count == 0 ? ElasticsearchNodeFeatures.Default : node.Features;
69-
node.Features = currentFeatures.Except(new[] { ElasticsearchNodeFeatures.MasterEligible }).ToList().AsReadOnly();
69+
node.Features = currentFeatures.Except([ElasticsearchNodeFeatures.MasterEligible]).ToList().AsReadOnly();
7070
}
7171
return this;
7272
}
@@ -77,7 +77,7 @@ public ElasticsearchVirtualCluster StoresNoData(params int[] ports)
7777
foreach (var node in InternalNodes.Where(n => ports.Contains(n.Uri.Port)))
7878
{
7979
var currentFeatures = node.Features.Count == 0 ? ElasticsearchNodeFeatures.Default : node.Features;
80-
node.Features = currentFeatures.Except(new[] { ElasticsearchNodeFeatures.HoldsData }).ToList().AsReadOnly();
80+
node.Features = currentFeatures.Except([ElasticsearchNodeFeatures.HoldsData]).ToList().AsReadOnly();
8181
}
8282
return this;
8383
}
@@ -88,7 +88,7 @@ public VirtualCluster HttpDisabled(params int[] ports)
8888
foreach (var node in InternalNodes.Where(n => ports.Contains(n.Uri.Port)))
8989
{
9090
var currentFeatures = node.Features.Count == 0 ? ElasticsearchNodeFeatures.Default : node.Features;
91-
node.Features = currentFeatures.Except(new[] { ElasticsearchNodeFeatures.HttpEnabled }).ToList().AsReadOnly();
91+
node.Features = currentFeatures.Except([ElasticsearchNodeFeatures.HttpEnabled]).ToList().AsReadOnly();
9292
}
9393
return this;
9494
}

src/Elastic.Transport.VirtualizedCluster/Rules/RuleBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,11 @@ public TRule ReturnResponse<T>(T response)
8080
r = ms.ToArray();
8181
}
8282
Self.ReturnResponse = r;
83-
Self.ReturnContentType = RequestData.DefaultMimeType;
83+
Self.ReturnContentType = RequestData.DefaultContentType;
8484
return (TRule)this;
8585
}
8686

87-
public TRule ReturnByteResponse(byte[] response, string responseContentType = RequestData.DefaultMimeType)
87+
public TRule ReturnByteResponse(byte[] response, string responseContentType = RequestData.DefaultContentType)
8888
{
8989
Self.ReturnResponse = response;
9090
Self.ReturnContentType = responseContentType;

src/Elastic.Transport/Components/Pipeline/DefaultRequestPipeline.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ public class DefaultRequestPipeline : RequestPipeline
2525
private readonly MemoryStreamFactory _memoryStreamFactory;
2626
private readonly Func<Node, bool> _nodePredicate;
2727
private readonly ProductRegistration _productRegistration;
28-
private readonly ResponseBuilder _responseBuilder;
29-
3028
private RequestConfiguration? _pingAndSniffRequestConfiguration;
3129
private List<Audit>? _auditTrail;
3230
private readonly ITransportConfiguration _settings;
@@ -36,13 +34,11 @@ internal DefaultRequestPipeline(RequestData requestData, DateTimeProvider dateTi
3634
{
3735
_requestData = requestData;
3836
_settings = requestData.ConnectionSettings;
39-
4037
_nodePool = requestData.ConnectionSettings.NodePool;
41-
_requestInvoker = requestData.ConnectionSettings.Connection;
38+
_requestInvoker = requestData.ConnectionSettings.RequestInvoker;
4239
_dateTimeProvider = dateTimeProvider;
4340
_memoryStreamFactory = requestData.MemoryStreamFactory;
4441
_productRegistration = requestData.ConnectionSettings.ProductRegistration;
45-
_responseBuilder = _productRegistration.ResponseBuilder;
4642
_nodePredicate = requestData.ConnectionSettings.NodePredicate ?? _productRegistration.NodePredicate;
4743

4844
StartedOn = dateTimeProvider.Now();
@@ -148,8 +144,8 @@ public override void BadResponse<TResponse>(ref TResponse response, ApiCallDetai
148144
{
149145
//make sure we copy over the error body in case we disabled direct streaming.
150146
var s = callDetails?.ResponseBodyInBytes == null ? Stream.Null : _memoryStreamFactory.Create(callDetails.ResponseBodyInBytes);
151-
var m = callDetails?.ResponseMimeType ?? RequestData.DefaultMimeType;
152-
response = _responseBuilder.ToResponse<TResponse>(endpoint, data, postData, exception, callDetails?.HttpStatusCode, null, s, m, callDetails?.ResponseBodyInBytes?.Length ?? -1, null, null);
147+
var m = callDetails?.ResponseContentType ?? RequestData.DefaultContentType;
148+
response = _requestInvoker.ResponseFactory.Create<TResponse>(endpoint, data, postData, exception, callDetails?.HttpStatusCode, null, s, m, callDetails?.ResponseBodyInBytes?.Length ?? -1, null, null);
153149
}
154150

155151
response.ApiCallDetails.AuditTrail = AuditTrail;
@@ -447,8 +443,9 @@ public async ValueTask SniffCoreAsync(bool isAsync, CancellationToken cancellati
447443
foreach (var node in SniffNodes)
448444
{
449445
var sniffEndpoint = _productRegistration.CreateSniffEndpoint(node, PingAndSniffRequestConfiguration, _settings);
446+
450447
//TODO remove
451-
var requestData = new RequestData(_settings, null, null);
448+
var requestData = new RequestData(_settings, null);
452449

453450
using var audit = Audit(SniffSuccess, node);
454451

0 commit comments

Comments
 (0)