protected TransportConfigurationBase(IConnectionPool connectionPool, IConnection connection, ITransportSerializer requestResponseSerializer, IProductRegistration productRegistration)
        {
            _connectionPool      = connectionPool;
            _connection          = connection ?? new HttpConnection();
            _productRegistration = productRegistration ?? ProductRegistration.Default;
            var serializer = requestResponseSerializer ?? new LowLevelRequestResponseSerializer();

            UseThisRequestResponseSerializer = new DiagnosticsSerializerProxy(serializer);

            _connectionLimit        = TransportConfiguration.DefaultConnectionLimit;
            _requestTimeout         = TransportConfiguration.DefaultTimeout;
            _dnsRefreshTimeout      = TransportConfiguration.DefaultDnsRefreshTimeout;
            _memoryStreamFactory    = TransportConfiguration.DefaultMemoryStreamFactory;
            _sniffOnConnectionFault = true;
            _sniffOnStartup         = true;
            _sniffLifeSpan          = TimeSpan.FromHours(1);

            _urlFormatter = new UrlFormatter(this);
            _statusCodeToResponseSuccess = (m, i) => HttpStatusCodeClassifier(m, i);
            _userAgent = Elastic.Transport.UserAgent.Create(_productRegistration.Name, _productRegistration.GetType());

            if (connectionPool is CloudConnectionPool cloudPool)
            {
                _basicAuthCredentials  = cloudPool.BasicCredentials;
                _apiKeyAuthCredentials = cloudPool.ApiKeyCredentials;
                _enableHttpCompression = true;
            }
        }
 /// <summary>
 /// Api Key to send with all requests to Elasticsearch
 /// </summary>
 public T ApiKeyAuthentication(ApiKeyAuthenticationCredentials credentials) =>
 Assign(credentials, (a, v) => a._apiKeyAuthCredentials = v);
 /// <summary>
 /// Sets up the client to communicate to Elastic Cloud using <paramref name="cloudId"/>,
 /// <para><see cref="CloudConnectionPool"/> documentation for more information on how to obtain your Cloud Id</para>
 /// </summary>
 public TransportConfiguration(string cloudId, ApiKeyAuthenticationCredentials credentials) : this(new CloudConnectionPool(cloudId, credentials))
 {
 }