private static async Task <string> GetPageAsync(string page, string hostname = null, string[] pins = null, byte[] clientCert = null, string certPassword = null, byte[] caCert = null)
        {
            var secureHttpClientHandler = SecureHttpClientHandlerBuilder.Build();

            if (pins != null)
            {
                secureHttpClientHandler.AddCertificatePinner(hostname, pins);
            }
            if (clientCert != null)
            {
                var provider = new ImportedClientCertificateProvider();
                provider.Import(clientCert, certPassword);
                secureHttpClientHandler.SetClientCertificates(provider);
            }
            if (caCert != null)
            {
                secureHttpClientHandler.SetTrustedRoots(caCert);
            }
            string result;

            using (var httpClient = new HttpClient(secureHttpClientHandler))
                using (var response = await httpClient.GetAsync(page).ConfigureAwait(false))
                {
                    result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    if (!response.IsSuccessStatusCode)
                    {
                        throw new HttpResponseException(response.StatusCode, result);
                    }
                }
            return(result);
        }
        public async Task HttpTest_SetCookies()
        {
            const string cookie1 = "k1=v1; Path=/";
            const string cookie2 = "k2=v2; Path=/";
            Dictionary <string, string> cookies;
            IEnumerable <string>        respCookies;
            var secureHttpClientHandler = SecureHttpClientHandlerBuilder.Build();

            using (var httpClient = new HttpClient(secureHttpClientHandler))
            {
                var page1     = $@"https://httpbin.org/response-headers?Set-Cookie={WebUtility.UrlEncode(cookie1)}&Set-Cookie={WebUtility.UrlEncode(cookie2)}";
                var response1 = await httpClient.GetAsync(page1).ConfigureAwait(false);

                response1.Headers.TryGetValues("set-cookie", out respCookies);
                respCookies = respCookies?.SelectMany(c => c.Split(',')).Select(c => c.Trim());
                const string page2  = @"https://httpbin.org/cookies";
                var          result = await GetPageAsync(httpClient, page2).ConfigureAwait(false);

                var json = JToken.Parse(result);
                cookies = json["cookies"].ToObject <Dictionary <string, string> >();
            }
            Assert.Equal(new List <string> {
                cookie1, cookie2
            }, respCookies);
            Assert.Contains(new KeyValuePair <string, string>("k1", "v1"), cookies);
            Assert.Contains(new KeyValuePair <string, string>("k2", "v2"), cookies);
        }
        public async Task CertificatePinnerTest_OneHost_Failure()
        {
            var secureHttpClientHandler = SecureHttpClientHandlerBuilder.Build();

            secureHttpClientHandler.AddCertificatePinner(Hostname, PinsKo);

            await AssertCertificatePinnerFailureAsync(Page, secureHttpClientHandler).ConfigureAwait(false);
        }
        public async Task CertificatePinnerTest_TwoHosts_SecondHostFails()
        {
            var secureHttpClientHandler = SecureHttpClientHandlerBuilder.Build();

            secureHttpClientHandler.AddCertificatePinner(Hostname, PinsOk);
            secureHttpClientHandler.AddCertificatePinner(Hostname2, Pins2Ko);

            await AssertCertificatePinnerSuccessAsync(Page, secureHttpClientHandler).ConfigureAwait(false);
            await AssertCertificatePinnerFailureAsync(Page2, secureHttpClientHandler).ConfigureAwait(false);
        }
        private static async Task <byte[]> GetBytesAsync(string page)
        {
            byte[] result;
            var    secureHttpClientHandler = SecureHttpClientHandlerBuilder.Build();

            using (var httpClient = new HttpClient(secureHttpClientHandler))
                using (var response = await httpClient.GetAsync(page).ConfigureAwait(false))
                {
                    result = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
                }
            return(result);
        }
        public async Task HttpTest_DeleteCookie()
        {
            Dictionary <string, string> cookies;
            var secureHttpClientHandler = SecureHttpClientHandlerBuilder.Build();

            using (var httpClient = new HttpClient(secureHttpClientHandler))
            {
                const string page1 = @"https://httpbin.org/cookies/set?k1=v1";
                await GetPageAsync(httpClient, page1).ConfigureAwait(false);

                const string page2  = @"https://httpbin.org/cookies/delete?k1";
                var          result = await GetPageAsync(httpClient, page2).ConfigureAwait(false);

                var json = JToken.Parse(result);
                cookies = json["cookies"].ToObject <Dictionary <string, string> >();
            }
            Assert.DoesNotContain(new KeyValuePair <string, string>("k1", "v1"), cookies);
        }