internal HttpSourceAuthenticationHandler(
     Uri source,
     DefaultHttpClientHandler clientHandler,
     ICredentialService credentialService)
     : this(source, clientHandler, clientHandler, credentialService)
 {
 }
Beispiel #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);
        }
Beispiel #3
0
        public async Task SendAsync_WhenCredentialServiceThrows_Returns401()
        {
            // Arrange
            var packageSource = new Uri("http://package.source.net");
            var clientHandler = new DefaultHttpClientHandler(null, new HttpClientSettings());

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

            Mock.Get(credentialService)
            .Setup(
                x => x.GetCredentialsAsync(
                    packageSource,
                    It.IsAny <IWebProxy> (),
                    CredentialType.RequestCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()))
            .Throws(new InvalidOperationException("Credential service failed acquring user credentials"));

            var handler = new HttpSourceAuthenticationHandler(packageSource, clientHandler, credentialService);

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

            handler.InnerHandler = innerHandler;

            // Act
            var response = await SendAsync(handler);

            // Assert
            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode);

            Assert.AreEqual(1, retryCount);

            Mock.Get(credentialService)
            .Verify(
                x => x.GetCredentialsAsync(
                    packageSource,
                    It.IsAny <IWebProxy> (),
                    CredentialType.RequestCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Once());
        }
Beispiel #4
0
        public async Task SendAsync_WithWrongCredentials_StopsRetryingAfter3Times()
        {
            // Arrange
            var packageSource = new Uri("http://package.source.net");
            var clientHandler = new DefaultHttpClientHandler(null, new HttpClientSettings());

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

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

            var handler = new HttpSourceAuthenticationHandler(packageSource, clientHandler, credentialService);

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

            handler.InnerHandler = innerHandler;

            // Act
            var response = await SendAsync(handler);

            // Assert
            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode);

            Assert.AreEqual(HttpSourceAuthenticationHandler.MaxAuthRetries + 1, retryCount);

            Mock.Get(credentialService)
            .Verify(
                x => x.GetCredentialsAsync(
                    packageSource,
                    It.IsAny <IWebProxy> (),
                    CredentialType.RequestCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Exactly(HttpSourceAuthenticationHandler.MaxAuthRetries));
        }
Beispiel #5
0
        public async Task SendAsync_WhenOperationCanceledExceptionThrownDuringAcquiringCredentials_Throws()
        {
            // Arrange
            var packageSource = new Uri("http://package.source.net");
            var clientHandler = new DefaultHttpClientHandler(null, new HttpClientSettings());

            var cts = new CancellationTokenSource();

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

            Mock.Get(credentialService)
            .Setup(
                x => x.GetCredentialsAsync(
                    packageSource,
                    It.IsAny <IWebProxy> (),
                    CredentialType.RequestCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()))
            .ThrowsAsync(new OperationCanceledException())
            .Callback(() => cts.Cancel());

            var handler = new HttpSourceAuthenticationHandler(packageSource, clientHandler, credentialService);

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

            handler.InnerHandler = innerHandler;

            // Act & Assert
            await AssertThrowsAsync <OperationCanceledException> (
                () => SendAsync (handler));

            Assert.AreEqual(1, retryCount);

            Mock.Get(credentialService)
            .Verify(
                x => x.GetCredentialsAsync(
                    packageSource,
                    It.IsAny <IWebProxy> (),
                    CredentialType.RequestCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Once);
        }
Beispiel #6
0
        public async Task SendAsync_WithUnauthenticatedSource_PassesThru()
        {
            var packageSource = new Uri("http://package.source.net");
            var clientHandler = new DefaultHttpClientHandler(null, new HttpClientSettings());

            var credentialService = new Mock <ICredentialService> (MockBehavior.Strict);
            var handler           = new HttpSourceAuthenticationHandler(packageSource, clientHandler, credentialService.Object)
            {
                InnerHandler = GetLambdaMessageHandler(HttpStatusCode.OK)
            };

            var response = await SendAsync(handler);

            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
Beispiel #7
0
        public async Task SendAsync_WithAcquiredCredentialsOn403_RetriesRequest()
        {
            // Arrange
            var packageSource = new Uri("http://package.source.net");
            var clientHandler = new DefaultHttpClientHandler(null, new HttpClientSettings());

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

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

            var handler = new HttpSourceAuthenticationHandler(packageSource, clientHandler, credentialService)
            {
                InnerHandler = GetLambdaMessageHandler(
                    HttpStatusCode.Forbidden, HttpStatusCode.OK)
            };

            // Act
            var response = await SendAsync(handler);

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

            Mock.Get(credentialService)
            .Verify(
                x => x.GetCredentialsAsync(
                    packageSource,
                    It.IsAny <IWebProxy> (),
                    CredentialType.RequestCredentials,
                    It.IsAny <bool> (),
                    It.IsAny <CancellationToken> ()),
                Times.Once());
        }
Beispiel #8
0
        public void Constructor_WithSourceCredentials_InitializesClientHandler()
        {
            if (CredentialCache.DefaultNetworkCredentials == null)
            {
                Assert.Ignore("No default network credentials");
            }

            var packageSource = new Uri("http://package.source.net");
            var credentials   = new NetworkCredential("user", "password");
            var a             = CredentialCache.DefaultNetworkCredentials;

            var clientHandler     = new DefaultHttpClientHandler(null, new HttpClientSettings());
            var credentialService = Mock.Of <ICredentialService> ();

            var handler = new HttpSourceAuthenticationHandler(packageSource, clientHandler, credentialService);

            Assert.NotNull(clientHandler.Credentials);

            var actualCredentials = clientHandler.Credentials.GetCredential(packageSource, "Basic");

            Assert.AreEqual(CredentialCache.DefaultNetworkCredentials, actualCredentials);
        }