private static ConfigServerClientSettings CreateSettings(IHostingEnvironment environment, IEnumerable<IConfigurationProvider> providers, ILoggerFactory logFactory)
        {
            ConfigServerClientSettings settings = new ConfigServerClientSettings();

            if (providers != null)
            {
                ConfigurationRoot existing = new ConfigurationRoot(new List<IConfigurationProvider>(providers));
                Initialize(settings, environment, existing);
            }
   
            return settings;

        }
        /// <summary>
        /// Initializes a new instance of <see cref="ConfigServerConfigurationProvider"/>.
        /// </summary>
        /// <param name="settings">the configuration settings the provider uses when
        /// accessing the server.</param>
        /// <param name="httpClient">a HttpClient the provider uses to make requests of
        /// the server.</param>
        /// <param name="logFactory">optional logging factory</param>
        /// </summary>
        public ConfigServerConfigurationProvider(ConfigServerClientSettings settings, HttpClient httpClient, ILoggerFactory logFactory = null)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }
            
            if (httpClient == null)
            {
                throw new ArgumentNullException(nameof(httpClient));
            }

            _logger = logFactory?.CreateLogger<ConfigServerConfigurationProvider>();
            _settings = settings;
            _client = httpClient;
        }
 /// <summary>
 /// Initializes a new instance of <see cref="ConfigServerConfigurationProvider"/>.
 /// </summary>
 /// <param name="settings">the configuration settings the provider uses when
 /// accessing the server.</param>
 /// <param name="httpClient">a HttpClient the provider uses to make requests of
 /// the server.</param>
 /// <param name="logFactory">optional logging factory</param>
 /// </summary>
 public ConfigServerConfigurationProvider(ConfigServerClientSettings settings, HttpClient httpClient, ILoggerFactory logFactory = null)
     : base(settings, httpClient, logFactory)
 {
 }
 /// <summary>
 /// Initializes a new instance of <see cref="ConfigServerConfigurationProvider"/>.
 /// </summary>
 /// <param name="settings">the configuration settings the provider uses when
 /// accessing the server.</param>
 /// <param name="logFactory">optional logging factory</param>
 /// </summary>
 public ConfigServerConfigurationProvider(ConfigServerClientSettings settings, ILoggerFactory logFactory = null) :
     this(settings, GetHttpClient(settings), logFactory)
 {
     _client.Timeout = DEFAULT_TIMEOUT;
 }
        private static HttpClient GetHttpClient(ConfigServerClientSettings settings)
        {
#if NET451
            return new HttpClient();
#else
            // TODO: For coreclr, disabling certificate validation only works on windows
            // https://github.com/dotnet/corefx/issues/4476
            if (settings != null && !settings.ValidateCertificates)
            {
                var handler = new WinHttpHandler();
                handler.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
                return new HttpClient(handler);
            } else
            {
                return new HttpClient();
            }
#endif
        }
 internal void AddConfigServerClientSettings(ConfigServerClientSettings settings)
 {
     Data["spring:cloud:config:enabled"] = settings.Enabled.ToString();
     Data["spring:cloud:config:failFast"] = settings.FailFast.ToString();
     Data["spring:cloud:config:env"] = settings.Environment;
     Data["spring:cloud:config:label"] = settings.Label;
     Data["spring:cloud:config:name"] = settings.Name;
     Data["spring:cloud:config:password"] = settings.Password;
     Data["spring:cloud:config:uri"] = settings.Uri;
     Data["spring:cloud:config:username"] = settings.Username;
     Data["spring:cloud:config:access_token_uri"] = settings.AccessTokenUri;
     Data["spring:cloud:config:client_secret"] = settings.ClientSecret;
     Data["spring:cloud:config:client_id"] = settings.ClientId;
     Data["spring:cloud:config:validate_certificates"] = settings.ValidateCertificates.ToString();
 }
        internal async Task<string> GetAccessToken(ConfigServerClientSettings settings)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, settings.AccessTokenUri);
            HttpClient client = GetHttpClient(settings);
#if NET451
            RemoteCertificateValidationCallback prevValidator = null;
            if (!settings.ValidateCertificates)
            {
                prevValidator = ServicePointManager.ServerCertificateValidationCallback;
                ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
            }
#endif      

            AuthenticationHeaderValue auth = new AuthenticationHeaderValue("Basic", GetEncoded(settings.ClientId, settings.ClientSecret));
            request.Headers.Authorization = auth;

            request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                { "grant_type", "client_credentials" }
            });

            try
            {
                using (client)
                {
                    using (HttpResponseMessage response = await client.SendAsync(request))
                    {
                        if (response.StatusCode != HttpStatusCode.OK)
                        {
                            _logger?.LogInformation("Config Server returned status: {0} while obtaining access token from: {1}",
                                response.StatusCode, settings.AccessTokenUri);
                            return null;
                        }

                        var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
                        var token = payload.Value<string>("access_token");
                        return token;
                    }
                }
            }
            catch (Exception e)
            {
                _logger?.LogError("Config Server exception: {0} ,obtaining access token from: {1}", e, settings.AccessTokenUri);
            }
#if NET451
            finally
            {
                ServicePointManager.ServerCertificateValidationCallback = prevValidator;
            }
#endif
            return null;
        }
        private static void Initialize(ConfigServerClientSettings settings, IHostingEnvironment environment, ConfigurationRoot root)
        {

            var clientConfigsection = root.GetSection(PREFIX);

            settings.Name = ResovlePlaceholders(GetApplicationName(clientConfigsection, root), root);
            settings.Environment = ResovlePlaceholders(GetEnvironment(clientConfigsection, environment), root);
            settings.Label = ResovlePlaceholders(GetLabel(clientConfigsection), root);
            settings.Username = ResovlePlaceholders(GetUsername(clientConfigsection), root);
            settings.Password = ResovlePlaceholders(GetPassword(clientConfigsection), root);
            settings.Uri = ResovlePlaceholders(GetUri(clientConfigsection, root), root);
            settings.AccessTokenUri = ResovlePlaceholders(GetAccessTokenUri(clientConfigsection, root), root);
            settings.ClientId = ResovlePlaceholders(GetClientId(clientConfigsection, root), root);
            settings.ClientSecret = ResovlePlaceholders(GetClientSecret(clientConfigsection, root), root);
            settings.Enabled = GetEnabled(clientConfigsection, root);
            settings.FailFast = GetFailFast(clientConfigsection, root);
            settings.ValidateCertificates = GetCertificateValidation(clientConfigsection, root);

    }