internal static HttpClient CreatHttpClient()

in Darabonba/Utils/HttpClientUtils.cs [44:135]


        internal static HttpClient CreatHttpClient(Dictionary<string, object> options)
        {
            HttpClient httpClient;
            string proxyUrl = options.Get("httpProxy") != null ? options.Get("httpProxy").ToSafeString() : options.Get("httpsProxy").ToSafeString();
            bool ignoreSSL = options.Get("ignoreSSL").ToSafeBool(false);

#if NET45
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
                                       | SecurityProtocolType.Tls
                                       | SecurityProtocolType.Tls11
                                       | SecurityProtocolType.Tls12;
            var handler = new WebRequestHandler();
            if(!string.IsNullOrWhiteSpace(proxyUrl))
            {
                handler.Proxy = new WebProxy(new Uri(proxyUrl));
            }
            else
            {
                handler.UseProxy = false;
            }

            if(ignoreSSL)
            {
                handler.ServerCertificateValidationCallback = delegate { return true; };
            }
            else
            {
                string ca = options.Get("ca") != null ? options.Get("ca").ToSafeString() : options.Get("ca").ToSafeString();
                if (!string.IsNullOrWhiteSpace(ca))
                {

                    handler.ServerCertificateValidationCallback = (message, cert, chain, sslPolicyErrors) =>
                    {
                        var collection = new X509Certificate2Collection();
                        byte[] certBytes = Encoding.UTF8.GetBytes(ca);
                        X509Certificate2 cacert = new X509Certificate2(certBytes);
                        collection.Add(cacert);
                        if (ServerCertificateCustomValidationCallback != null)
                        {
                            return ServerCertificateCustomValidationCallback(message, collection, cert, chain, sslPolicyErrors);
                        }
                        return CertificateValidationCallBack(message, collection, cert, chain, sslPolicyErrors);
                    };

                }

            }

            httpClient = new HttpClient(handler);
#else
            HttpClientHandler httpClientHandler = new HttpClientHandler();
            if (!string.IsNullOrWhiteSpace(proxyUrl))
            {
                httpClientHandler.Proxy = new WebProxy(new Uri(proxyUrl));
            }
            else
            {
                httpClientHandler.UseProxy = false;
            }
            
            if (ignoreSSL)
            {
                httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true;
            }
            else
            {
                string ca = options.Get("ca") != null ? options.Get("ca").ToSafeString() : options.Get("ca").ToSafeString();
                if(!string.IsNullOrWhiteSpace(ca))
                {

                    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
                    {
                   
                        var collection = new X509Certificate2Collection();
                        byte[] certBytes = Encoding.UTF8.GetBytes(ca);
                        X509Certificate2 cacert = new X509Certificate2(certBytes);
                        collection.Add(cacert);
                        if (ServerCertificateCustomValidationCallback != null)
                        {
                            return ServerCertificateCustomValidationCallback(message, collection, cert, chain, sslPolicyErrors);
                        }
                        return CertificateValidationCallBack(message, collection, cert, chain, sslPolicyErrors);
                    };

                }

            }
            httpClient = new HttpClient(httpClientHandler);
#endif
            return httpClient;

        }