public async Task SendAsync_WithMissingCredentials_Returns407()
        {
            var defaultClientHandler = GetDefaultClientHandler();

            var service = Mock.Of <ICredentialService> ();
            var handler = new ProxyAuthenticationHandler(defaultClientHandler, service, new ProxyCache())
            {
                InnerHandler = GetLambdaHandler(HttpStatusCode.ProxyAuthenticationRequired)
            };

            var response = await SendAsync(handler);

            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.ProxyAuthenticationRequired, response.StatusCode);

            Mock.Get(service)
            .Verify(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Once());
        }
示例#2
0
        public override HttpMessageHandler CreateHttpMessageHandler(Uri uri, HttpClientSettings settings)
        {
            var proxy         = WebRequestHelper.ProxyCache.GetProxy(uri);
            var clientHandler = new DefaultHttpClientHandler(proxy, settings);

            HttpMessageHandler messageHandler = clientHandler;

            if (proxy != null)
            {
                messageHandler = new ProxyAuthenticationHandler(clientHandler, HttpClientProvider.CredentialService, WebRequestHelper.ProxyCache)
                {
                    NonInteractive = settings.NonInteractive
                };
            }

            if (settings.SourceAuthenticationRequired)
            {
                var innerHandler = messageHandler;

                messageHandler = new HttpSourceAuthenticationHandler(uri, clientHandler, HttpClientProvider.CredentialService)
                {
                    InnerHandler = innerHandler
                };
            }

            return(messageHandler);
        }
        public async Task SendAsync_WithUnauthenticatedProxy_PassesThru()
        {
            var defaultClientHandler = GetDefaultClientHandler();

            var service = Mock.Of <ICredentialService> ();
            var handler = new ProxyAuthenticationHandler(defaultClientHandler, service, new ProxyCache())
            {
                InnerHandler = GetLambdaHandler(HttpStatusCode.OK)
            };

            var response = await SendAsync(handler);

            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
        public async Task SendAsync_WhenCancelledDuringAcquiringCredentials_Throws()
        {
            // Arrange
            var defaultClientHandler = GetDefaultClientHandler();

            var cts = new CancellationTokenSource();

            var service = Mock.Of <ICredentialService> ();

            Mock.Get(service)
            .Setup(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()))
            .ThrowsAsync(new TaskCanceledException())
            .Callback(() => cts.Cancel());

            var handler = new ProxyAuthenticationHandler(defaultClientHandler, service, new ProxyCache());

            var responses = new Queue <HttpStatusCode> (
                new [] { HttpStatusCode.ProxyAuthenticationRequired, HttpStatusCode.OK });
            var innerHandler = new LambdaMessageHandler(
                _ => new HttpResponseMessage(responses.Dequeue()));

            handler.InnerHandler = innerHandler;

            // Act
            await AssertThrowsAsync <TaskCanceledException> (
                () => SendAsync (handler, cancellationToken : cts.Token));

            Mock.Get(service)
            .Verify(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Once);
        }
        public async Task SendAsync_WithWrongCredentials_StopsRetryingAfter3Times()
        {
            var defaultClientHandler = GetDefaultClientHandler();

            var service = Mock.Of <ICredentialService> ();

            Mock.Get(service)
            .Setup(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()))
            .Returns(() => Task.FromResult <ICredentials> (new NetworkCredential()));

            var handler = new ProxyAuthenticationHandler(defaultClientHandler, service, new ProxyCache());

            int retryCount   = 0;
            var innerHandler = new LambdaMessageHandler(
                _ => { retryCount++; return(new HttpResponseMessage(HttpStatusCode.ProxyAuthenticationRequired)); });

            handler.InnerHandler = innerHandler;

            var response = await SendAsync(handler);

            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.ProxyAuthenticationRequired, response.StatusCode);

            Assert.AreEqual(ProxyAuthenticationHandler.MaxAuthRetries, retryCount);

            Mock.Get(service)
            .Verify(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Exactly(2));
        }
        public async Task SendAsync_WithAcquiredCredentials_RetriesRequest()
        {
            var defaultClientHandler = GetDefaultClientHandler();

            var service = Mock.Of <ICredentialService> ();

            Mock.Get(service)
            .Setup(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()))
            .Returns(() => Task.FromResult <ICredentials> (new NetworkCredential()));

            var handler = new ProxyAuthenticationHandler(defaultClientHandler, service, new ProxyCache());

            var responses = new Queue <HttpStatusCode> (
                new [] { HttpStatusCode.ProxyAuthenticationRequired, HttpStatusCode.OK });
            var innerHandler = new LambdaMessageHandler(
                _ => new HttpResponseMessage(responses.Dequeue()));

            handler.InnerHandler = innerHandler;

            var response = await SendAsync(handler);

            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            Mock.Get(service)
            .Verify(
                x => x.GetCredentialsAsync(
                    ProxyAddress,
                    It.IsAny <IWebProxy> (),
                    CredentialType.ProxyCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Once());
        }