From af894be70e33ba1cd1772e4b4393d3ef0ef12d4b Mon Sep 17 00:00:00 2001 From: Florian Bernd Date: Tue, 19 Nov 2024 16:02:19 +0100 Subject: [PATCH] Add `RequestConfigurationDescriptor` copy constructor (#136) Add `RequestConfigurationDescriptor` copy constructor. As well removes `net6` TFMs. --- .../Configuration/RequestConfiguration.cs | 4 +- .../RequestConfigurationDescriptor.cs | 9 +- .../Configuration/TransportConfiguration.cs | 2 +- .../TransportConfigurationDescriptor.cs | 102 ++++++++++++++++-- .../Elastic.Transport.csproj | 4 +- .../TransportConfigurationTests.cs | 6 +- 6 files changed, 107 insertions(+), 20 deletions(-) diff --git a/src/Elastic.Transport/Configuration/RequestConfiguration.cs b/src/Elastic.Transport/Configuration/RequestConfiguration.cs index 940d69b..d451fd5 100644 --- a/src/Elastic.Transport/Configuration/RequestConfiguration.cs +++ b/src/Elastic.Transport/Configuration/RequestConfiguration.cs @@ -7,8 +7,6 @@ using System.Collections.Specialized; using System.Security.Cryptography.X509Certificates; -using Elastic.Transport.Extensions; - namespace Elastic.Transport; /// @@ -31,7 +29,7 @@ public RequestConfiguration() /// public RequestConfiguration(IRequestConfiguration config) { -#if NET8_0_OR_GREATER +#if NET ArgumentNullException.ThrowIfNull(config); #else if (config is null) diff --git a/src/Elastic.Transport/Configuration/RequestConfigurationDescriptor.cs b/src/Elastic.Transport/Configuration/RequestConfigurationDescriptor.cs index 552fbdd..f6ce3cc 100644 --- a/src/Elastic.Transport/Configuration/RequestConfigurationDescriptor.cs +++ b/src/Elastic.Transport/Configuration/RequestConfigurationDescriptor.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using System.Linq; using System.Security.Cryptography.X509Certificates; using Elastic.Transport.Extensions; @@ -19,10 +18,14 @@ public class RequestConfigurationDescriptor : IRequestConfiguration public RequestConfigurationDescriptor() { } /// - public RequestConfigurationDescriptor(IRequestConfiguration? config) + public RequestConfigurationDescriptor(IRequestConfiguration config) { +#if NET + ArgumentNullException.ThrowIfNull(config); +#else if (config is null) - return; + throw new ArgumentNullException(nameof(config)); +#endif _accept = config.Accept; _allowedStatusCodes= config.AllowedStatusCodes; diff --git a/src/Elastic.Transport/Configuration/TransportConfiguration.cs b/src/Elastic.Transport/Configuration/TransportConfiguration.cs index 2608a94..b5d106b 100644 --- a/src/Elastic.Transport/Configuration/TransportConfiguration.cs +++ b/src/Elastic.Transport/Configuration/TransportConfiguration.cs @@ -117,7 +117,7 @@ public TransportConfiguration( /// Expert usage: Create a new transport configuration based of a previously configured instance public TransportConfiguration(ITransportConfiguration config) { -#if NET8_0_OR_GREATER +#if NET ArgumentNullException.ThrowIfNull(config); #else if (config is null) diff --git a/src/Elastic.Transport/Configuration/TransportConfigurationDescriptor.cs b/src/Elastic.Transport/Configuration/TransportConfigurationDescriptor.cs index 86c8c7f..ea1ae1d 100644 --- a/src/Elastic.Transport/Configuration/TransportConfigurationDescriptor.cs +++ b/src/Elastic.Transport/Configuration/TransportConfigurationDescriptor.cs @@ -20,16 +20,18 @@ namespace Elastic.Transport; /// Allows you to control how behaves and where/how it connects to Elastic Stack products /// /// -/// -/// -/// -/// -public class TransportConfigurationDescriptor( - NodePool nodePool, - IRequestInvoker? invoker = null, - Serializer? serializer = null, - ProductRegistration? productRegistration = null) : TransportConfigurationDescriptorBase(nodePool, invoker, serializer, productRegistration) +public class TransportConfigurationDescriptor : TransportConfigurationDescriptorBase { + /// + /// Creates a new instance of + /// + /// + /// + /// + /// + public TransportConfigurationDescriptor(NodePool nodePool, IRequestInvoker? invoker = null, Serializer? serializer = null, ProductRegistration? productRegistration = null) + : base(nodePool, invoker, serializer, productRegistration) { } + /// /// Creates a new instance of /// @@ -51,6 +53,15 @@ public TransportConfigurationDescriptor(string cloudId, BasicAuthentication cred /// public TransportConfigurationDescriptor(string cloudId, Base64ApiKey credentials, ProductRegistration? productRegistration = null) : this(new CloudNodePool(cloudId, credentials), productRegistration: productRegistration) { } + + /// + /// Creates a new instance of + /// + /// Expert usage: Create a new transport configuration based of a previously configured instance. + /// + /// + public TransportConfigurationDescriptor(ITransportConfiguration config) + : base(config) { } } /// > @@ -98,6 +109,79 @@ protected TransportConfigurationDescriptorBase(NodePool nodePool, IRequestInvoke _responseHeadersToParse = new HeadersList(_productRegistration.ResponseHeadersToParse); } + /// Expert usage: Create a new transport configuration based of a previously configured instance + protected TransportConfigurationDescriptorBase(ITransportConfiguration config) + { +#if NET + ArgumentNullException.ThrowIfNull(config); +#else + if (config is null) + throw new ArgumentNullException(nameof(config)); +#endif + + // it's important url formatter is repointed to the new instance of ITransportConfiguration + _urlFormatter = new UrlFormatter(this); + + _accept = config.Accept; + _allowedStatusCodes = config.AllowedStatusCodes; + _authentication = config.Authentication; + _bootstrapLock = config.BootstrapLock; + _certificateFingerprint = config.CertificateFingerprint; + _clientCertificates = config.ClientCertificates; + _connectionLimit = config.ConnectionLimit; + _contentType = config.ContentType; + _dateTimeProvider = config.DateTimeProvider; + _deadTimeout = config.DeadTimeout; + _disableAuditTrail = config.DisableAuditTrail; + _disableAutomaticProxyDetection = config.DisableAutomaticProxyDetection; + _disableDirectStreaming = config.DisableDirectStreaming; + _disableMetaHeader = config.DisableMetaHeader; + _disablePings = config.DisablePings; + _disableSniff = config.DisableSniff; + _dnsRefreshTimeout = config.DnsRefreshTimeout; + _enableHttpCompression = config.EnableHttpCompression; + _enableTcpStats = config.EnableTcpStats; + _enableThreadPoolStats = config.EnableThreadPoolStats; + _forceNode = config.ForceNode; + _headers = config.Headers; + _httpPipeliningEnabled = config.HttpPipeliningEnabled; + _keepAliveInterval = config.KeepAliveInterval; + _keepAliveTime = config.KeepAliveTime; + _maxDeadTimeout = config.MaxDeadTimeout; + _maxRetries = config.MaxRetries; + _maxRetryTimeout = config.MaxRetryTimeout; + _memoryStreamFactory = config.MemoryStreamFactory; + _nodePool = config.NodePool; + _nodePredicate = config.NodePredicate; + _onRequestCompleted = config.OnRequestCompleted; + _onRequestDataCreated = config.OnRequestDataCreated; + _opaqueId = config.OpaqueId; + _parseAllHeaders = config.ParseAllHeaders; + _pingTimeout = config.PingTimeout; + _pipelineProvider = config.PipelineProvider; + _prettyJson = config.PrettyJson; + _productRegistration = config.ProductRegistration; + _proxyAddress = config.ProxyAddress; + _proxyPassword = config.ProxyPassword; + _proxyUsername = config.ProxyUsername; + _queryStringParameters = config.QueryStringParameters; + _requestInvoker = config.RequestInvoker; + _requestMetaData = config.RequestMetaData; + _requestResponseSerializer = config.RequestResponseSerializer; + _requestTimeout = config.RequestTimeout; + _responseHeadersToParse = config.ResponseHeadersToParse; + _runAs = config.RunAs; + _serverCertificateValidationCallback = config.ServerCertificateValidationCallback; + _skipDeserializationForStatusCodes = config.SkipDeserializationForStatusCodes; + _sniffInformationLifeSpan = config.SniffInformationLifeSpan; + _sniffsOnConnectionFault = config.SniffsOnConnectionFault; + _sniffsOnStartup = config.SniffsOnStartup; + _statusCodeToResponseSuccess = config.StatusCodeToResponseSuccess; + _throwExceptions = config.ThrowExceptions; + _transferEncodingChunked = config.TransferEncodingChunked; + _userAgent = config.UserAgent; + } + private readonly SemaphoreSlim _bootstrapLock; private readonly NodePool _nodePool; private readonly ProductRegistration _productRegistration; diff --git a/src/Elastic.Transport/Elastic.Transport.csproj b/src/Elastic.Transport/Elastic.Transport.csproj index 0f1a546..7af8489 100644 --- a/src/Elastic.Transport/Elastic.Transport.csproj +++ b/src/Elastic.Transport/Elastic.Transport.csproj @@ -11,7 +11,7 @@ annotations true true - netstandard2.0;netstandard2.1;net462;net6.0;net8.0 + netstandard2.0;netstandard2.1;net462;net8.0 @@ -29,7 +29,7 @@ - + diff --git a/tests/Elastic.Transport.Tests/Configuration/TransportConfigurationTests.cs b/tests/Elastic.Transport.Tests/Configuration/TransportConfigurationTests.cs index 369f7a5..b63c0f3 100644 --- a/tests/Elastic.Transport.Tests/Configuration/TransportConfigurationTests.cs +++ b/tests/Elastic.Transport.Tests/Configuration/TransportConfigurationTests.cs @@ -46,12 +46,14 @@ public void CopiesAllProperties() autoFaker.RuleFor(x => x.ClientCertificates, f => new X509CertificateCollection()); var config = autoFaker.Generate(); - var newConfig = new TransportConfiguration(config); - config.Accept.Should().NotBeEmpty(); config.ClientCertificates.Should().NotBeNull(); + ITransportConfiguration newConfig = new TransportConfiguration(config); config.Should().BeEquivalentTo(newConfig); + + ITransportConfiguration newDescriptor = new TransportConfigurationDescriptor(config); + config.Should().BeEquivalentTo(newDescriptor); } #endif }