You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2016/08/13 19:55:43 UTC

svn commit: r1756293 - in /httpcomponents/httpclient/trunk: httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/ httpclient5-osgi/src/main/java/org/apache/hc/client5/http/osgi/impl/ httpclient5/src/main/java/org/apache/hc/client5/http/au...

Author: olegk
Date: Sat Aug 13 19:55:43 2016
New Revision: 1756293

URL: http://svn.apache.org/viewvc?rev=1756293&view=rev
Log:
HTTPCLIENT-1748: Improved compatibility with system authentication API in applets

Added:
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java   (with props)
Modified:
    httpcomponents/httpclient/trunk/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java
    httpcomponents/httpclient/trunk/httpclient5-osgi/src/main/java/org/apache/hc/client5/http/osgi/impl/OSGiCredentialsProvider.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsProvider.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsStore.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/GGSSchemeBase.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/NTLMScheme.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/SystemDefaultCredentialsProvider.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java
    httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/BasicCredentialsProvider.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestBasicCredentialsProvider.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestHttpAuthenticator.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthentication.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthenticationFallBack.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientReauthentication.java
    httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestProtocolExec.java

Modified: httpcomponents/httpclient/trunk/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Executor.java Sat Aug 13 19:55:43 2016
@@ -146,7 +146,7 @@ public class Executor {
 
     public Executor authPreemptive(final HttpHost host) {
         if (this.credentialsStore != null) {
-            final Credentials credentials = this.credentialsStore.getCredentials(new AuthScope(host));
+            final Credentials credentials = this.credentialsStore.getCredentials(new AuthScope(host), null);
             if (credentials == null) {
                 final BasicScheme basicScheme = new BasicScheme();
                 basicScheme.initPreemptive(credentials);
@@ -165,7 +165,7 @@ public class Executor {
 
     public Executor authPreemptiveProxy(final HttpHost proxy) {
         if (this.credentialsStore != null) {
-            final Credentials credentials = this.credentialsStore.getCredentials(new AuthScope(proxy));
+            final Credentials credentials = this.credentialsStore.getCredentials(new AuthScope(proxy), null);
             if (credentials == null) {
                 final BasicScheme basicScheme = new BasicScheme();
                 basicScheme.initPreemptive(credentials);

Modified: httpcomponents/httpclient/trunk/httpclient5-osgi/src/main/java/org/apache/hc/client5/http/osgi/impl/OSGiCredentialsProvider.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5-osgi/src/main/java/org/apache/hc/client5/http/osgi/impl/OSGiCredentialsProvider.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5-osgi/src/main/java/org/apache/hc/client5/http/osgi/impl/OSGiCredentialsProvider.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5-osgi/src/main/java/org/apache/hc/client5/http/osgi/impl/OSGiCredentialsProvider.java Sat Aug 13 19:55:43 2016
@@ -33,6 +33,7 @@ import org.apache.hc.client5.http.auth.C
 import org.apache.hc.client5.http.auth.CredentialsStore;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
 import org.apache.hc.client5.http.osgi.services.ProxyConfiguration;
+import org.apache.hc.core5.http.protocol.HttpContext;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
@@ -64,7 +65,7 @@ final class OSGiCredentialsProvider impl
      * {@inheritDoc}
      */
     @Override
-    public Credentials getCredentials(final AuthScope authscope) {
+    public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
         // iterate over all active proxy configurations at the moment of getting the credential
         for (final ServiceRegistration<ProxyConfiguration> registration : registeredConfigurations.values()) {
             final ProxyConfiguration proxyConfiguration = bundleContext.getService(registration.getReference());

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsProvider.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsProvider.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsProvider.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsProvider.java Sat Aug 13 19:55:43 2016
@@ -26,6 +26,8 @@
  */
 package org.apache.hc.client5.http.auth;
 
+import org.apache.hc.core5.http.protocol.HttpContext;
+
 /**
  * Provider of authentication credentials.
  * <p>
@@ -42,8 +44,10 @@ public interface CredentialsProvider {
      * if available.
      *
      * @param authscope the {@link AuthScope authentication scope}
+     * @param context the {@link HttpContext http context}
      * @return the credentials
+     * @since 5.0
      */
-    Credentials getCredentials(AuthScope authscope);
+    Credentials getCredentials(AuthScope authscope, HttpContext context);
 
 }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsStore.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsStore.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsStore.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/auth/CredentialsStore.java Sat Aug 13 19:55:43 2016
@@ -45,7 +45,7 @@ public interface CredentialsStore extend
      * @param credentials the authentication {@link Credentials credentials}
      * for the given scope.
      *
-     * @see #getCredentials(AuthScope)
+     * @see #getCredentials(AuthScope, HttpContext)
      */
     void setCredentials(AuthScope authscope, Credentials credentials);
 

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java Sat Aug 13 19:55:43 2016
@@ -140,7 +140,8 @@ public class BasicScheme implements Auth
         Args.notNull(host, "Auth host");
         Args.notNull(credentialsProvider, "CredentialsProvider");
 
-        final Credentials credentials = credentialsProvider.getCredentials(new AuthScope(host, getRealm(), getName()));
+        final Credentials credentials = credentialsProvider.getCredentials(
+                new AuthScope(host, getRealm(), getName()), context);
         if (credentials != null) {
             this.username = credentials.getUserPrincipal().getName();
             this.password = credentials.getPassword();

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java Sat Aug 13 19:55:43 2016
@@ -172,7 +172,8 @@ public class DigestScheme implements Aut
         Args.notNull(host, "Auth host");
         Args.notNull(credentialsProvider, "CredentialsProvider");
 
-        final Credentials credentials = credentialsProvider.getCredentials(new AuthScope(host, getRealm(), getName()));
+        final Credentials credentials = credentialsProvider.getCredentials(
+                new AuthScope(host, getRealm(), getName()), context);
         if (credentials != null) {
             this.username = credentials.getUserPrincipal().getName();
             this.password = credentials.getPassword();

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/GGSSchemeBase.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/GGSSchemeBase.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/GGSSchemeBase.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/GGSSchemeBase.java Sat Aug 13 19:55:43 2016
@@ -175,7 +175,8 @@ public abstract class GGSSchemeBase impl
         Args.notNull(host, "Auth host");
         Args.notNull(credentialsProvider, "CredentialsProvider");
 
-        final Credentials credentials = credentialsProvider.getCredentials(new AuthScope(host, null, getName()));
+        final Credentials credentials = credentialsProvider.getCredentials(
+                new AuthScope(host, null, getName()), context);
         if (credentials instanceof KerberosCredentials) {
             this.gssCredential = ((KerberosCredentials) credentials).getGSSCredential();
         } else {

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/NTLMScheme.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/NTLMScheme.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/NTLMScheme.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/NTLMScheme.java Sat Aug 13 19:55:43 2016
@@ -129,7 +129,8 @@ public class NTLMScheme implements AuthS
         Args.notNull(host, "Auth host");
         Args.notNull(credentialsProvider, "CredentialsProvider");
 
-        final Credentials credentials = credentialsProvider.getCredentials(new AuthScope(host, null, getName()));
+        final Credentials credentials = credentialsProvider.getCredentials(
+                new AuthScope(host, null, getName()), context);
         if (credentials instanceof NTCredentials) {
             this.credentials = (NTCredentials) credentials;
             return true;

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/SystemDefaultCredentialsProvider.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/SystemDefaultCredentialsProvider.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/SystemDefaultCredentialsProvider.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/SystemDefaultCredentialsProvider.java Sat Aug 13 19:55:43 2016
@@ -27,7 +27,9 @@
 package org.apache.hc.client5.http.impl.auth;
 
 import java.net.Authenticator;
+import java.net.MalformedURLException;
 import java.net.PasswordAuthentication;
+import java.net.URL;
 import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -41,6 +43,9 @@ import org.apache.hc.client5.http.config
 import org.apache.hc.client5.http.impl.sync.BasicCredentialsProvider;
 import org.apache.hc.core5.annotation.ThreadSafe;
 import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.util.Args;
 
 /**
@@ -88,35 +93,52 @@ public class SystemDefaultCredentialsPro
 
     private static PasswordAuthentication getSystemCreds(
             final AuthScope authscope,
-            final Authenticator.RequestorType requestorType) {
+            final Authenticator.RequestorType requestorType,
+            final HttpContext context) {
         final String hostname = authscope.getHost();
         final int port = authscope.getPort();
         final HttpHost origin = authscope.getOrigin();
         final String protocol = origin != null ? origin.getSchemeName() :
                 (port == 443 ? "https" : "http");
+
+        final URL targetHostURL = getTargetHostURL(context);
+        // use null addr, because the authentication fails if it does not exactly match the expected realm's host
         return Authenticator.requestPasswordAuthentication(
                 hostname,
                 null,
                 port,
                 protocol,
-                null,
+                authscope.getRealm(),
                 translateScheme(authscope.getScheme()),
-                null,
+                targetHostURL,
                 requestorType);
     }
 
+    private static URL getTargetHostURL(final HttpContext context) {
+        if (context == null) {
+            return null;
+        }
+        final HttpRequest httpRequest = (HttpRequest)context.getAttribute(HttpCoreContext.HTTP_REQUEST);
+        final String uri = httpRequest.getRequestLine().getUri();
+        try {
+            return new URL(uri);
+        } catch (final MalformedURLException e) {
+            return null;
+        }
+    }
+
     @Override
-    public Credentials getCredentials(final AuthScope authscope) {
+    public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
         Args.notNull(authscope, "Auth scope");
-        final Credentials localcreds = internal.getCredentials(authscope);
+        final Credentials localcreds = internal.getCredentials(authscope, context);
         if (localcreds != null) {
             return localcreds;
         }
         final String host = authscope.getHost();
         if (host != null) {
-            PasswordAuthentication systemcreds = getSystemCreds(authscope, Authenticator.RequestorType.SERVER);
+            PasswordAuthentication systemcreds = getSystemCreds(authscope, Authenticator.RequestorType.SERVER, context);
             if (systemcreds == null) {
-                systemcreds = getSystemCreds(authscope, Authenticator.RequestorType.PROXY);
+                systemcreds = getSystemCreds(authscope, Authenticator.RequestorType.PROXY, context);
             }
             if (systemcreds == null) {
                 final String proxyHost = System.getProperty("http.proxyHost");
@@ -143,7 +165,7 @@ public class SystemDefaultCredentialsPro
                     return new NTCredentials(systemcreds.getUserName(), systemcreds.getPassword(), null, domain);
                 }
                 if (AuthSchemes.NTLM.equalsIgnoreCase(authscope.getScheme())) {
-                    // Domian may be specified in a fully qualified user name
+                    // Domain may be specified in a fully qualified user name
                     return new NTCredentials(
                             systemcreds.getUserName(), systemcreds.getPassword(), null, null);
                 }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java Sat Aug 13 19:55:43 2016
@@ -86,22 +86,12 @@ public class SystemDefaultRoutePlanner e
             }
             final InetSocketAddress isa = (InetSocketAddress) p.address();
             // assume default scheme (http)
-            result = new HttpHost(getHost(isa), isa.getPort());
+            result = new HttpHost(isa.getAddress(), isa.getHostString(), isa.getPort(), null);
         }
 
         return result;
     }
 
-    private String getHost(final InetSocketAddress isa) {
-
-        //@@@ Will this work with literal IPv6 addresses, or do we
-        //@@@ need to wrap these in [] for the string representation?
-        //@@@ Having it in this method at least allows for easy workarounds.
-       return isa.isUnresolved() ?
-            isa.getHostName() : isa.getAddress().getHostAddress();
-
-    }
-
     private Proxy chooseProxy(final List<Proxy> proxies) {
         Proxy result = null;
         // check the list for one we can use

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/BasicCredentialsProvider.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/BasicCredentialsProvider.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/BasicCredentialsProvider.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/BasicCredentialsProvider.java Sat Aug 13 19:55:43 2016
@@ -33,6 +33,7 @@ import org.apache.hc.client5.http.auth.A
 import org.apache.hc.client5.http.auth.Credentials;
 import org.apache.hc.client5.http.auth.CredentialsStore;
 import org.apache.hc.core5.annotation.ThreadSafe;
+import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.util.Args;
 
 /**
@@ -94,7 +95,8 @@ public class BasicCredentialsProvider im
     }
 
     @Override
-    public Credentials getCredentials(final AuthScope authscope) {
+    public Credentials getCredentials(final AuthScope authscope,
+                                      final HttpContext httpContext) {
         Args.notNull(authscope, "Authentication scope");
         return matchCredentials(this.credMap, authscope);
     }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestBasicCredentialsProvider.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestBasicCredentialsProvider.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestBasicCredentialsProvider.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestBasicCredentialsProvider.java Sat Aug 13 19:55:43 2016
@@ -58,14 +58,14 @@ public class TestBasicCredentialsProvide
         final BasicCredentialsProvider state = new BasicCredentialsProvider();
         state.setCredentials(SCOPE1, CREDS1);
         state.setCredentials(SCOPE2, CREDS2);
-        Assert.assertEquals(CREDS1, state.getCredentials(SCOPE1));
-        Assert.assertEquals(CREDS2, state.getCredentials(SCOPE2));
+        Assert.assertEquals(CREDS1, state.getCredentials(SCOPE1, null));
+        Assert.assertEquals(CREDS2, state.getCredentials(SCOPE2, null));
     }
 
     @Test
     public void testBasicCredentialsProviderNoCredentials() {
         final BasicCredentialsProvider state = new BasicCredentialsProvider();
-        Assert.assertEquals(null, state.getCredentials(BOGUS));
+        Assert.assertEquals(null, state.getCredentials(BOGUS, null));
     }
 
     @Test
@@ -73,7 +73,7 @@ public class TestBasicCredentialsProvide
         final BasicCredentialsProvider state = new BasicCredentialsProvider();
         state.setCredentials(AuthScope.ANY, CREDS1);
         state.setCredentials(SCOPE2, CREDS2);
-        Assert.assertEquals(CREDS1, state.getCredentials(BOGUS));
+        Assert.assertEquals(CREDS1, state.getCredentials(BOGUS, null));
     }
 
     @Test
@@ -81,7 +81,7 @@ public class TestBasicCredentialsProvide
         final BasicCredentialsProvider state = new BasicCredentialsProvider();
         final Credentials expected = new UsernamePasswordCredentials("name", "pass".toCharArray());
         state.setCredentials(AuthScope.ANY, expected);
-        final Credentials got = state.getCredentials(DEFSCOPE);
+        final Credentials got = state.getCredentials(DEFSCOPE, null);
         Assert.assertEquals(got, expected);
     }
 
@@ -90,7 +90,7 @@ public class TestBasicCredentialsProvide
         final BasicCredentialsProvider state = new BasicCredentialsProvider();
         final Credentials expected = new UsernamePasswordCredentials("name", "pass".toCharArray());
         state.setCredentials(DEFSCOPE, expected);
-        final Credentials got = state.getCredentials(DEFSCOPE);
+        final Credentials got = state.getCredentials(DEFSCOPE, null);
         Assert.assertEquals(expected, got);
     }
 
@@ -100,7 +100,7 @@ public class TestBasicCredentialsProvide
         final Credentials expected = new UsernamePasswordCredentials("name", "pass".toCharArray());
         state.setCredentials(
             new AuthScope("host", AuthScope.ANY_PORT, AuthScope.ANY_REALM), expected);
-        final Credentials got = state.getCredentials(DEFSCOPE);
+        final Credentials got = state.getCredentials(DEFSCOPE, null);
         Assert.assertEquals(expected, got);
     }
 
@@ -111,7 +111,7 @@ public class TestBasicCredentialsProvide
         state.setCredentials(
             new AuthScope("host1", AuthScope.ANY_PORT, "realm"), expected);
         final Credentials got = state.getCredentials(
-            new AuthScope("host2", AuthScope.ANY_PORT, "realm"));
+            new AuthScope("host2", AuthScope.ANY_PORT, "realm"), null);
         Assert.assertNotSame(expected, got);
     }
 
@@ -122,7 +122,7 @@ public class TestBasicCredentialsProvide
         state.setCredentials(
             new AuthScope("host", AuthScope.ANY_PORT, "realm1"), cred);
         final Credentials got = state.getCredentials(
-            new AuthScope("host", AuthScope.ANY_PORT, "realm2"));
+            new AuthScope("host", AuthScope.ANY_PORT, "realm2"), null);
         Assert.assertNotSame(cred, got);
     }
 
@@ -132,7 +132,7 @@ public class TestBasicCredentialsProvide
         final BasicCredentialsProvider state = new BasicCredentialsProvider();
         final Credentials expected = new UsernamePasswordCredentials("name", "pass".toCharArray());
         state.setCredentials(new AuthScope(httpHost), expected);
-        final Credentials got = state.getCredentials(DEFSCOPE);
+        final Credentials got = state.getCredentials(DEFSCOPE, null);
         Assert.assertEquals(expected, got);
     }
 
@@ -152,17 +152,17 @@ public class TestBasicCredentialsProvide
         state.setCredentials(scope3, creds3);
 
         Credentials got = state.getCredentials(
-            new AuthScope("someotherhost", 80, "someotherrealm", "basic"));
+            new AuthScope("someotherhost", 80, "someotherrealm", "basic"), null);
         Credentials expected = creds1;
         Assert.assertEquals(expected, got);
 
         got = state.getCredentials(
-            new AuthScope("someotherhost", 80, "somerealm", "basic"));
+            new AuthScope("someotherhost", 80, "somerealm", "basic"), null);
         expected = creds2;
         Assert.assertEquals(expected, got);
 
         got = state.getCredentials(
-            new AuthScope("somehost", 80, "someotherrealm", "basic"));
+            new AuthScope("somehost", 80, "someotherrealm", "basic"), null);
         expected = creds3;
         Assert.assertEquals(expected, got);
     }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestHttpAuthenticator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestHttpAuthenticator.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestHttpAuthenticator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestHttpAuthenticator.java Sat Aug 13 19:55:43 2016
@@ -160,12 +160,13 @@ public class TestHttpAuthenticator {
         response.addHeader(new BasicHeader(HttpHeaders.WWW_AUTHENTICATE, "whatever realm=\"realm1\", stuff=\"1234\""));
 
         final Credentials credentials = new UsernamePasswordCredentials("user", "pass".toCharArray());
-        Mockito.when(this.credentialsProvider.getCredentials(Mockito.<AuthScope>any())).thenReturn(credentials);
+        Mockito.when(this.credentialsProvider.getCredentials(Mockito.<AuthScope>any(),
+                                                             Mockito.<HttpContext>any())).thenReturn(credentials);
 
         final DefaultAuthenticationStrategy authStrategy = new DefaultAuthenticationStrategy();
 
-        Assert.assertTrue(this.httpAuthenticator.prepareAuthResponse(
-                host, ChallengeType.TARGET, response, authStrategy, this.authExchange, this.context));
+        Assert.assertTrue(this.httpAuthenticator.prepareAuthResponse(host, ChallengeType.TARGET, response, authStrategy,
+                                                                     this.authExchange, this.context));
         Assert.assertEquals(AuthExchange.State.CHALLENGED, this.authExchange.getState());
 
         final Queue<AuthScheme> options = this.authExchange.getAuthOptions();
@@ -182,17 +183,19 @@ public class TestHttpAuthenticator {
     @Test
     public void testAuthenticationCredentialsForBasic() throws Exception {
         final HttpHost host = new HttpHost("somehost", 80);
-        final HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
+        final HttpResponse response =
+            new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
         response.addHeader(new BasicHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"test\""));
         response.addHeader(new BasicHeader(HttpHeaders.WWW_AUTHENTICATE, "Digest realm=\"realm1\", nonce=\"1234\""));
 
         final Credentials credentials = new UsernamePasswordCredentials("user", "pass".toCharArray());
-        Mockito.when(this.credentialsProvider.getCredentials(new AuthScope(host, "test", "basic"))).thenReturn(credentials);
+        Mockito.when(this.credentialsProvider.getCredentials(Mockito.eq(new AuthScope(host, "test", "basic")),
+                                                             Mockito.<HttpContext>any())).thenReturn(credentials);
 
         final DefaultAuthenticationStrategy authStrategy = new DefaultAuthenticationStrategy();
 
-        Assert.assertTrue(this.httpAuthenticator.prepareAuthResponse(
-                host, ChallengeType.TARGET, response, authStrategy, this.authExchange, this.context));
+        Assert.assertTrue(this.httpAuthenticator.prepareAuthResponse(host, ChallengeType.TARGET, response, authStrategy,
+                                                                     this.authExchange, this.context));
         Assert.assertEquals(AuthExchange.State.CHALLENGED, this.authExchange.getState());
 
         final Queue<AuthScheme> options = this.authExchange.getAuthOptions();
@@ -322,7 +325,8 @@ public class TestHttpAuthenticator {
         response.addHeader(new BasicHeader(HttpHeaders.WWW_AUTHENTICATE, "whatever realm=\"realm1\", stuff=\"1234\""));
 
         final Credentials credentials = new UsernamePasswordCredentials("user", "pass".toCharArray());
-        Mockito.when(this.credentialsProvider.getCredentials(new AuthScope(host, "realm1", "digest"))).thenReturn(credentials);
+        Mockito.when(this.credentialsProvider.getCredentials(Mockito.eq(new AuthScope(host, "realm1", "digest")),
+                                                             Mockito.<HttpContext>any())).thenReturn(credentials);
 
         final DefaultAuthenticationStrategy authStrategy = new DefaultAuthenticationStrategy();
 

Added: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java?rev=1756293&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java (added)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java Sat Aug 13 19:55:43 2016
@@ -0,0 +1,142 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.hc.client5.http.impl.auth;
+
+import java.net.Authenticator;
+import java.net.Authenticator.RequestorType;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.PasswordAuthentication;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.methods.HttpGet;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpCoreContext;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * Simple tests for {@link SystemDefaultCredentialsProvider}.
+ */
+public class TestSystemDefaultCredentialsProvider {
+
+    private final static String PROXY_PROTOCOL1 = "http";
+    private final static String PROXY_HOST1 = "proxyhost1";
+    private final static int PROXY_PORT1 = 3128;
+    private final static String PROMPT1 = "HttpClient authentication test prompt";
+    private final static String TARGET_SCHEME1 = "https";
+    private final static String TARGET_HOST1 = "targethost1";
+    private final static int TARGET_PORT1 = 80;
+    private final static PasswordAuthentication AUTH1 =
+        new PasswordAuthentication("testUser", "testPassword".toCharArray());
+
+    // It's not possible to mock static Authenticator methods. So we mock a delegate
+    private final class DelegatedAuthenticator extends Authenticator {
+        private final AuthenticatorDelegate authenticatorDelegate;
+
+        private DelegatedAuthenticator(final AuthenticatorDelegate authenticatorDelegate) {
+            this.authenticatorDelegate = authenticatorDelegate;
+        }
+
+        @Override
+        protected PasswordAuthentication getPasswordAuthentication() {
+            return authenticatorDelegate.getPasswordAuthentication(getRequestingHost(), getRequestingSite(),
+                                                                   getRequestingPort(), getRequestingProtocol(),
+                                                                   getRequestingPrompt(), getRequestingScheme(),
+                                                                   getRequestingURL(), getRequestorType());
+        }
+    }
+
+    private interface AuthenticatorDelegate {
+        PasswordAuthentication getPasswordAuthentication(
+            String host,
+            InetAddress addr,
+            int port,
+            String protocol,
+            String prompt,
+            String scheme,
+            URL url,
+            RequestorType reqType);
+    }
+
+    @Test
+    public void testSystemCredentialsProviderCredentials() throws MalformedURLException,
+        URISyntaxException {
+
+        final AuthenticatorDelegate authenticatorDelegate = installAuthenticator(AUTH1);
+
+        final URL httpRequestUrl = new URL(TARGET_SCHEME1, TARGET_HOST1, TARGET_PORT1, "");
+        final AuthScope authScope = new AuthScope(PROXY_HOST1, PROXY_PORT1, PROMPT1, "BASIC");
+        final HttpCoreContext coreContext = new HttpCoreContext();
+        coreContext.setTargetHost(new HttpHost(TARGET_HOST1, TARGET_PORT1, TARGET_SCHEME1));
+        coreContext.setAttribute(HttpCoreContext.HTTP_REQUEST, new HttpGet(httpRequestUrl.toURI()));
+
+        final Credentials receivedCredentials =
+            new SystemDefaultCredentialsProvider().getCredentials(authScope, coreContext);
+
+        Mockito.verify(authenticatorDelegate).getPasswordAuthentication(PROXY_HOST1, null, PROXY_PORT1, PROXY_PROTOCOL1,
+                                                                        PROMPT1, "Basic", httpRequestUrl,
+                                                                        RequestorType.SERVER);
+        Assert.assertNotNull(receivedCredentials);
+        Assert.assertEquals(AUTH1.getUserName(), receivedCredentials.getUserPrincipal().getName());
+        Assert.assertEquals(AUTH1.getPassword(), receivedCredentials.getPassword());
+    }
+
+    @Test
+    public void testSystemCredentialsProviderNoContext() throws MalformedURLException,
+        URISyntaxException {
+
+        final AuthenticatorDelegate authenticatorDelegate = installAuthenticator(AUTH1);
+
+        final AuthScope authScope = new AuthScope(PROXY_HOST1, PROXY_PORT1, PROMPT1, "BASIC");
+
+        final Credentials receivedCredentials =
+            new SystemDefaultCredentialsProvider().getCredentials(authScope, null);
+
+        Mockito.verify(authenticatorDelegate).getPasswordAuthentication(PROXY_HOST1, null, PROXY_PORT1, PROXY_PROTOCOL1,
+                                                                        PROMPT1, "Basic", null,
+                                                                        RequestorType.SERVER);
+        Assert.assertNotNull(receivedCredentials);
+        Assert.assertEquals(AUTH1.getUserName(), receivedCredentials.getUserPrincipal().getName());
+        Assert.assertEquals(AUTH1.getPassword(), receivedCredentials.getPassword());
+    }
+
+    private AuthenticatorDelegate installAuthenticator(final PasswordAuthentication returedAuthentication) {
+        final AuthenticatorDelegate authenticatorDelegate = Mockito.mock(AuthenticatorDelegate.class);
+        Mockito.when(authenticatorDelegate.getPasswordAuthentication(Mockito.anyString(),
+                                                                     Mockito.any(InetAddress.class), Mockito.anyInt(),
+                                                                     Mockito.anyString(), Mockito.anyString(),
+                                                                     Mockito.anyString(), Mockito.any(URL.class),
+                                                                     Mockito.any(RequestorType.class))).thenReturn(returedAuthentication);
+        Authenticator.setDefault(new DelegatedAuthenticator(authenticatorDelegate));
+        return authenticatorDelegate;
+    }
+}

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/auth/TestSystemDefaultCredentialsProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthentication.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthentication.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthentication.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthentication.java Sat Aug 13 19:55:43 2016
@@ -156,7 +156,7 @@ public class TestClientAuthentication ex
         }
 
         @Override
-        public Credentials getCredentials(final AuthScope authscope) {
+        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
             this.authscope = authscope;
             return this.creds;
         }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthenticationFallBack.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthenticationFallBack.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthenticationFallBack.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientAuthenticationFallBack.java Sat Aug 13 19:55:43 2016
@@ -118,7 +118,7 @@ public class TestClientAuthenticationFal
         }
 
         @Override
-        public Credentials getCredentials(final AuthScope authscope) {
+        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
             this.authscope = authscope;
             return this.creds;
         }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientReauthentication.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientReauthentication.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientReauthentication.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/integration/TestClientReauthentication.java Sat Aug 13 19:55:43 2016
@@ -134,7 +134,7 @@ public class TestClientReauthentication
         }
 
         @Override
-        public Credentials getCredentials(final AuthScope authscope) {
+        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
             this.authscope = authscope;
             return this.creds;
         }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestProtocolExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestProtocolExec.java?rev=1756293&r1=1756292&r2=1756293&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestProtocolExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/test/java/org/apache/hc/client5/http/impl/sync/TestProtocolExec.java Sat Aug 13 19:55:43 2016
@@ -190,7 +190,7 @@ public class TestProtocolExec {
         Assert.assertEquals(new URI("/test"), request.getURI());
         Assert.assertEquals(new HttpHost("bar", -1), context.getTargetHost());
         final CredentialsProvider credentialsProvider = context.getCredentialsProvider();
-        final Credentials creds = credentialsProvider.getCredentials(new AuthScope("bar", -1, null));
+        final Credentials creds = credentialsProvider.getCredentials(new AuthScope("bar", -1, null), null);
         Assert.assertNotNull(creds);
         Assert.assertEquals("somefella", creds.getUserPrincipal().getName());
     }