public async Task HttpClientPoolAllocatesOneHandlerPerUriAndCredentialSet() { var uri = new Uri("http://localhost/platibus"); var clientPool = new HttpClientPool(); var credentialSet = new IEndpointCredentials[] { new BasicAuthCredentials("user1", "pw1"), new BearerCredentials("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"), new DefaultCredentials() }; var initialSize = clientPool.Size; foreach (var credentials in credentialSet) { await clientPool.GetClient(uri, credentials); } var finalSize = clientPool.Size; clientPool.Dispose(); Assert.Equal(3, finalSize - initialSize); }
public async Task HttpClientPoolAllocatesOneHandlerPerUriAndManyOfTheSameCredential() { var uri = new Uri("http://localhost/platibus"); var clientPool = new HttpClientPool(); var credentialSet = Enumerable.Range(0, 100) .Select(_ => new BasicAuthCredentials("user", "pw")); var initialSize = clientPool.Size; foreach (var credentials in credentialSet) { await clientPool.GetClient(uri, credentials); } var finalSize = clientPool.Size; clientPool.Dispose(); Assert.Equal(1, finalSize - initialSize); }
public async Task MultipleRequestsToSameEndpointWithNtlmShouldNotFail() { var uri = new Uri("http://localhost:52179/platibus/"); var clientPool = new HttpClientPool(); var testCompletionSource = new TaskCompletionSource <int>(); var testComplete = testCompletionSource.Task; var httpListener = new HttpListener { AuthenticationSchemes = AuthenticationSchemes.Ntlm, Prefixes = { uri.ToString() } }; Task httpListenerLoop = null; try { httpListener.Start(); httpListenerLoop = Task.Run(async() => { while (httpListener.IsListening) { var contextReceipt = httpListener.GetContextAsync(); if (await Task.WhenAny(testComplete, contextReceipt) == testComplete) { break; } var context = await contextReceipt; await context.Request.InputStream.CopyToAsync(context.Response.OutputStream); context.Response.StatusCode = 200; context.Response.Close(); } }); var clientTasks = Enumerable.Range(1, 10) .Select(i => Task.Run(async() => { // ReSharper disable once AccessToDisposedClosure using (var client = await clientPool.GetClient(uri, new DefaultCredentials())) { var content = "test" + (i + 1); var response = await client.PostAsync("test", new StringContent(content)); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(content, await response.Content.ReadAsStringAsync()); return(response); } })); var responses = await Task.WhenAll(clientTasks); Assert.Equal(10, responses.Length); } finally { if (httpListenerLoop != null) { testCompletionSource.TrySetResult(0); httpListenerLoop.Wait(TimeSpan.FromSeconds(5)); } if (httpListener.IsListening) { httpListener.Stop(); } httpListener.Close(); clientPool.Dispose(); } }