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 2015/08/07 09:34:14 UTC

svn commit: r1694620 - in /httpcomponents/httpclient/trunk/httpclient/src: examples/org/apache/http/examples/client/ main/java/org/apache/http/client/ main/java/org/apache/http/client/protocol/ main/java/org/apache/http/impl/client/ main/java/org/apach...

Author: olegk
Date: Fri Aug  7 07:34:13 2015
New Revision: 1694620

URL: http://svn.apache.org/r1694620
Log:
Support for auth exchanges with multiple hosts

Modified:
    httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/UserTokenHandler.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/HttpClientContext.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/RequestAuthCache.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/NoopUserTokenHandler.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/ProxyClient.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/MainClientExec.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/RedirectExec.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRequestAuthCache.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/integration/TestStatefulConnManagement.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestMainClientExec.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestRedirectExec.java

Modified: httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java Fri Aug  7 07:34:13 2015
@@ -257,10 +257,8 @@ public class ClientConfiguration {
                 context.getRequest();
                 // Execution route
                 context.getHttpRoute();
-                // Target auth state
-                context.getTargetAuthState();
-                // Proxy auth state
-                context.getTargetAuthState();
+                // Auth exchanges
+                context.getAuthExchanges();
                 // Cookie origin
                 context.getCookieOrigin();
                 // Cookie spec used

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/UserTokenHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/UserTokenHandler.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/UserTokenHandler.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/UserTokenHandler.java Fri Aug  7 07:34:13 2015
@@ -27,6 +27,7 @@
 
 package org.apache.http.client;
 
+import org.apache.http.conn.routing.HttpRoute;
 import org.apache.http.protocol.HttpContext;
 
 /**
@@ -49,11 +50,12 @@ public interface UserTokenHandler {
      * identify the current user if the context is user specific or to be
      * {@code null} if it is not.
      *
+     * @param route HTTP route
      * @param context the execution context
      *
      * @return user token that uniquely identifies the user or
      * {@code null} if the context is not user specific.
      */
-    Object getUserToken(HttpContext context);
+    Object getUserToken(HttpRoute route, HttpContext context);
 
 }

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/HttpClientContext.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/HttpClientContext.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/HttpClientContext.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/HttpClientContext.java Fri Aug  7 07:34:13 2015
@@ -28,10 +28,14 @@
 package org.apache.http.client.protocol;
 
 import java.net.URI;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.http.HttpHost;
 import org.apache.http.annotation.NotThreadSafe;
 import org.apache.http.auth.AuthExchange;
+import org.apache.http.auth.AuthScheme;
 import org.apache.http.auth.AuthSchemeProvider;
 import org.apache.http.auth.CredentialsProvider;
 import org.apache.http.client.AuthCache;
@@ -106,16 +110,10 @@ public class HttpClientContext extends H
     public static final String AUTH_CACHE            = "http.auth.auth-cache";
 
     /**
-     * Attribute name of a {@link org.apache.http.auth.AuthExchange}
-     * object that represents the actual target authentication state.
+     * Attribute name of a map containing actual {@link AuthExchange}s keyed by their respective
+     * {@link org.apache.http.HttpHost}.
      */
-    public static final String TARGET_AUTH_STATE     = "http.auth.target-scope";
-
-    /**
-     * Attribute name of a {@link org.apache.http.auth.AuthExchange}
-     * object that represents the actual proxy authentication state.
-     */
-    public static final String PROXY_AUTH_STATE      = "http.auth.proxy-scope";
+    public static final String AUTH_EXCHANGE_MAP     = "http.auth.exchanges";
 
     /**
      * Attribute name of a {@link java.lang.Object} object that represents
@@ -217,12 +215,48 @@ public class HttpClientContext extends H
         setAttribute(AUTH_CACHE, authCache);
     }
 
-    public AuthExchange getTargetAuthState() {
-        return getAttribute(TARGET_AUTH_STATE, AuthExchange.class);
+    /**
+     * @since 5.0
+     */
+    @SuppressWarnings("unchecked")
+    public Map<HttpHost, AuthExchange> getAuthExchanges() {
+        Map<HttpHost, AuthExchange> map = (Map<HttpHost, AuthExchange>) getAttribute(AUTH_EXCHANGE_MAP);
+        if (map == null) {
+            map = new HashMap<>();
+            setAttribute(AUTH_EXCHANGE_MAP, map);
+        }
+        return map;
+    }
+
+    /**
+     * @since 5.0
+     */
+    public AuthExchange getAuthExchange(final HttpHost host) {
+        final Map<HttpHost, AuthExchange> authExchangeMap = getAuthExchanges();
+        AuthExchange authExchange = authExchangeMap.get(host);
+        if (authExchange == null) {
+            authExchange = new AuthExchange();
+            authExchangeMap.put(host, authExchange);
+        }
+        return authExchange;
     }
 
-    public AuthExchange getProxyAuthState() {
-        return getAttribute(PROXY_AUTH_STATE, AuthExchange.class);
+    /**
+     * @since 5.0
+     */
+    public void setAuthExchange(final HttpHost host, final AuthExchange authExchange) {
+        final Map<HttpHost, AuthExchange> authExchangeMap = getAuthExchanges();
+        authExchangeMap.put(host, authExchange);
+    }
+
+    /**
+     * @since 5.0
+     */
+    public void resetAuthExchange(final HttpHost host, final AuthScheme authScheme) {
+        final AuthExchange authExchange = new AuthExchange();
+        authExchange.select(authScheme);
+        final Map<HttpHost, AuthExchange> authExchangeMap = getAuthExchanges();
+        authExchangeMap.put(host, authExchange);
     }
 
     public <T> T getUserToken(final Class<T> clazz) {

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/RequestAuthCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/RequestAuthCache.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/RequestAuthCache.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/RequestAuthCache.java Fri Aug  7 07:34:13 2015
@@ -36,8 +36,8 @@ import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpRequestInterceptor;
 import org.apache.http.annotation.Immutable;
-import org.apache.http.auth.AuthScheme;
 import org.apache.http.auth.AuthExchange;
+import org.apache.http.auth.AuthScheme;
 import org.apache.http.auth.CredentialsProvider;
 import org.apache.http.client.AuthCache;
 import org.apache.http.conn.routing.RouteInfo;
@@ -99,26 +99,28 @@ public class RequestAuthCache implements
                     target.getSchemeName());
         }
 
-        final AuthExchange targetState = clientContext.getTargetAuthState();
-        if (targetState != null && targetState.getState() == AuthExchange.State.UNCHALLENGED) {
+        final AuthExchange targetAuthExchange = clientContext.getAuthExchange(target);
+        if (targetAuthExchange.getState() == AuthExchange.State.UNCHALLENGED) {
             final AuthScheme authScheme = authCache.get(target);
             if (authScheme != null) {
                 if (this.log.isDebugEnabled()) {
                     this.log.debug("Re-using cached '" + authScheme.getName() + "' auth scheme for " + target);
                 }
-                targetState.select(authScheme);
+                targetAuthExchange.select(authScheme);
             }
         }
 
         final HttpHost proxy = route.getProxyHost();
-        final AuthExchange proxyState = clientContext.getProxyAuthState();
-        if (proxy != null && proxyState != null && proxyState.getState() == AuthExchange.State.UNCHALLENGED) {
-            final AuthScheme authScheme = authCache.get(proxy);
-            if (authScheme != null) {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Re-using cached '" + authScheme.getName() + "' auth scheme for " + proxy);
+        if (proxy != null) {
+            final AuthExchange proxyAuthExchange = clientContext.getAuthExchange(proxy);
+            if (proxyAuthExchange.getState() == AuthExchange.State.UNCHALLENGED) {
+                final AuthScheme authScheme = authCache.get(proxy);
+                if (authScheme != null) {
+                    if (this.log.isDebugEnabled()) {
+                        this.log.debug("Re-using cached '" + authScheme.getName() + "' auth scheme for " + proxy);
+                    }
+                    proxyAuthExchange.select(authScheme);
                 }
-                proxyState.select(authScheme);
             }
         }
     }

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultUserTokenHandler.java Fri Aug  7 07:34:13 2015
@@ -32,11 +32,12 @@ import javax.net.ssl.SSLSession;
 
 import org.apache.http.HttpConnection;
 import org.apache.http.annotation.Immutable;
-import org.apache.http.auth.AuthScheme;
 import org.apache.http.auth.AuthExchange;
+import org.apache.http.auth.AuthScheme;
 import org.apache.http.client.UserTokenHandler;
 import org.apache.http.client.protocol.HttpClientContext;
 import org.apache.http.conn.ManagedHttpClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
 import org.apache.http.protocol.HttpContext;
 
 /**
@@ -59,18 +60,18 @@ public class DefaultUserTokenHandler imp
     public static final DefaultUserTokenHandler INSTANCE = new DefaultUserTokenHandler();
 
     @Override
-    public Object getUserToken(final HttpContext context) {
+    public Object getUserToken(final HttpRoute route, final HttpContext context) {
 
         final HttpClientContext clientContext = HttpClientContext.adapt(context);
 
         Principal userPrincipal = null;
 
-        final AuthExchange targetAuthState = clientContext.getTargetAuthState();
-        if (targetAuthState != null) {
-            userPrincipal = getAuthPrincipal(targetAuthState);
-            if (userPrincipal == null) {
-                final AuthExchange proxyAuthState = clientContext.getProxyAuthState();
-                userPrincipal = getAuthPrincipal(proxyAuthState);
+        final AuthExchange targetAuthExchnage = clientContext.getAuthExchange(route.getTargetHost());
+        if (targetAuthExchnage != null) {
+            userPrincipal = getAuthPrincipal(targetAuthExchnage);
+            if (userPrincipal == null && route.getProxyHost() != null) {
+                final AuthExchange proxyAuthExchange = clientContext.getAuthExchange(route.getProxyHost());
+                userPrincipal = getAuthPrincipal(proxyAuthExchange);
             }
         }
 

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java Fri Aug  7 07:34:13 2015
@@ -38,7 +38,6 @@ import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
 import org.apache.http.annotation.ThreadSafe;
 import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.auth.AuthExchange;
 import org.apache.http.auth.CredentialsProvider;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.CookieStore;
@@ -111,12 +110,6 @@ class InternalHttpClient extends Closeab
     }
 
     private void setupContext(final HttpClientContext context) {
-        if (context.getAttribute(HttpClientContext.TARGET_AUTH_STATE) == null) {
-            context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, new AuthExchange());
-        }
-        if (context.getAttribute(HttpClientContext.PROXY_AUTH_STATE) == null) {
-            context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, new AuthExchange());
-        }
         if (context.getAttribute(HttpClientContext.AUTHSCHEME_REGISTRY) == null) {
             context.setAttribute(HttpClientContext.AUTHSCHEME_REGISTRY, this.authSchemeRegistry);
         }

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/NoopUserTokenHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/NoopUserTokenHandler.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/NoopUserTokenHandler.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/NoopUserTokenHandler.java Fri Aug  7 07:34:13 2015
@@ -28,6 +28,7 @@ package org.apache.http.impl.client;
 
 import org.apache.http.annotation.Immutable;
 import org.apache.http.client.UserTokenHandler;
+import org.apache.http.conn.routing.HttpRoute;
 import org.apache.http.protocol.HttpContext;
 
 /**
@@ -41,7 +42,7 @@ public class NoopUserTokenHandler implem
     public static final NoopUserTokenHandler INSTANCE = new NoopUserTokenHandler();
 
     @Override
-    public Object getUserToken(final HttpContext context) {
+    public Object getUserToken(final HttpRoute route, final HttpContext context) {
         return null;
     }
 

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/ProxyClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/ProxyClient.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/ProxyClient.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/ProxyClient.java Fri Aug  7 07:34:13 2015
@@ -38,9 +38,9 @@ import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
+import org.apache.http.auth.AuthExchange;
 import org.apache.http.auth.AuthSchemeProvider;
 import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.AuthExchange;
 import org.apache.http.auth.ChallengeType;
 import org.apache.http.auth.Credentials;
 import org.apache.http.client.AuthenticationStrategy;
@@ -90,7 +90,7 @@ public class ProxyClient {
     private final HttpRequestExecutor requestExec;
     private final AuthenticationStrategy proxyAuthStrategy;
     private final HttpAuthenticator authenticator;
-    private final AuthExchange proxyAuthState;
+    private final AuthExchange proxyAuthExchange;
     private final Lookup<AuthSchemeProvider> authSchemeRegistry;
     private final ConnectionReuseStrategy reuseStrategy;
 
@@ -110,7 +110,7 @@ public class ProxyClient {
         this.requestExec = new HttpRequestExecutor();
         this.proxyAuthStrategy = new DefaultAuthenticationStrategy();
         this.authenticator = new HttpAuthenticator();
-        this.proxyAuthState = new AuthExchange();
+        this.proxyAuthExchange = new AuthExchange();
         this.authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
                 .register(AuthSchemes.BASIC, new BasicSchemeFactory())
                 .register(AuthSchemes.DIGEST, new DigestSchemeFactory())
@@ -164,7 +164,6 @@ public class ProxyClient {
         context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn);
         context.setAttribute(HttpCoreContext.HTTP_REQUEST, connect);
         context.setAttribute(HttpClientContext.HTTP_ROUTE, route);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyAuthState);
         context.setAttribute(HttpClientContext.CREDS_PROVIDER, credsProvider);
         context.setAttribute(HttpClientContext.AUTHSCHEME_REGISTRY, this.authSchemeRegistry);
         context.setAttribute(HttpClientContext.REQUEST_CONFIG, this.requestConfig);
@@ -177,7 +176,7 @@ public class ProxyClient {
                 conn.bind(socket);
             }
 
-            this.authenticator.addAuthResponse(proxy, ChallengeType.PROXY, connect, this.proxyAuthState, context);
+            this.authenticator.addAuthResponse(proxy, ChallengeType.PROXY, connect, this.proxyAuthExchange, context);
 
             response = this.requestExec.execute(connect, conn, context);
 
@@ -186,9 +185,9 @@ public class ProxyClient {
                 throw new HttpException("Unexpected response to CONNECT request: " +
                         response.getStatusLine());
             }
-            if (this.authenticator.isChallenged(proxy, ChallengeType.PROXY, response, this.proxyAuthState, context)) {
+            if (this.authenticator.isChallenged(proxy, ChallengeType.PROXY, response, this.proxyAuthExchange, context)) {
                 if (this.authenticator.prepareAuthResponse(proxy, ChallengeType.PROXY, response,
-                        this.proxyAuthStrategy, this.proxyAuthState, context)) {
+                        this.proxyAuthStrategy, this.proxyAuthExchange, context)) {
                     // Retry request
                     if (this.reuseStrategy.keepAlive(response, context)) {
                         // Consume response content

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/MainClientExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/MainClientExec.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/MainClientExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/MainClientExec.java Fri Aug  7 07:34:13 2015
@@ -154,17 +154,6 @@ public class MainClientExec implements C
         Args.notNull(request, "HTTP request");
         Args.notNull(context, "HTTP context");
 
-        AuthExchange targetAuthState = context.getTargetAuthState();
-        if (targetAuthState == null) {
-            targetAuthState = new AuthExchange();
-            context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, targetAuthState);
-        }
-        AuthExchange proxyAuthState = context.getProxyAuthState();
-        if (proxyAuthState == null) {
-            proxyAuthState = new AuthExchange();
-            context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, proxyAuthState);
-        }
-
         if (request instanceof HttpEntityEnclosingRequest) {
             RequestEntityProxy.enhance((HttpEntityEnclosingRequest) request);
         }
@@ -206,6 +195,10 @@ public class MainClientExec implements C
                 execAware.setCancellable(connHolder);
             }
 
+            final AuthExchange targetAuthExchange = context.getAuthExchange(route.getTargetHost());
+            final AuthExchange proxyAuthExchange = route.getProxyHost() != null ?
+                    context.getAuthExchange(route.getProxyHost()) : new AuthExchange();
+
             HttpResponse response;
             for (int execCount = 1;; execCount++) {
 
@@ -221,7 +214,7 @@ public class MainClientExec implements C
                 if (!managedConn.isOpen()) {
                     this.log.debug("Opening connection " + route);
                     try {
-                        establishRoute(proxyAuthState, managedConn, route, request, context);
+                        establishRoute(managedConn, route, request, context);
                     } catch (final TunnelRefusedException ex) {
                         if (this.log.isDebugEnabled()) {
                             this.log.debug(ex.getMessage());
@@ -245,17 +238,17 @@ public class MainClientExec implements C
 
                 if (!request.containsHeader(HttpHeaders.AUTHORIZATION)) {
                     if (this.log.isDebugEnabled()) {
-                        this.log.debug("Target auth state: " + targetAuthState.getState());
+                        this.log.debug("Target auth state: " + targetAuthExchange.getState());
                     }
                     this.authenticator.addAuthResponse(
-                            route.getTargetHost(), ChallengeType.TARGET, request, targetAuthState, context);
+                            route.getTargetHost(), ChallengeType.TARGET, request, targetAuthExchange, context);
                 }
                 if (!request.containsHeader(HttpHeaders.PROXY_AUTHORIZATION) && !route.isTunnelled()) {
                     if (this.log.isDebugEnabled()) {
-                        this.log.debug("Proxy auth state: " + proxyAuthState.getState());
+                        this.log.debug("Proxy auth state: " + proxyAuthExchange.getState());
                     }
                     this.authenticator.addAuthResponse(
-                            route.getProxyHost(), ChallengeType.PROXY, request, proxyAuthState, context);
+                            route.getProxyHost(), ChallengeType.PROXY, request, proxyAuthExchange, context);
                 }
 
                 response = requestExecutor.execute(request, managedConn, context);
@@ -285,24 +278,24 @@ public class MainClientExec implements C
                 }
 
                 if (needAuthentication(
-                        targetAuthState, proxyAuthState, route, response, context)) {
+                        targetAuthExchange, proxyAuthExchange, route, response, context)) {
                     // Make sure the response body is fully consumed, if present
                     final HttpEntity entity = response.getEntity();
                     if (connHolder.isReusable()) {
                         EntityUtils.consume(entity);
                     } else {
                         managedConn.close();
-                        if (proxyAuthState.getState() == AuthExchange.State.SUCCESS
-                                && proxyAuthState.getAuthScheme() != null
-                                && proxyAuthState.getAuthScheme().isConnectionBased()) {
+                        if (proxyAuthExchange.getState() == AuthExchange.State.SUCCESS
+                                && proxyAuthExchange.getAuthScheme() != null
+                                && proxyAuthExchange.getAuthScheme().isConnectionBased()) {
                             this.log.debug("Resetting proxy auth state");
-                            proxyAuthState.reset();
+                            proxyAuthExchange.reset();
                         }
-                        if (targetAuthState.getState() == AuthExchange.State.SUCCESS
-                                && targetAuthState.getAuthScheme() != null
-                                && targetAuthState.getAuthScheme().isConnectionBased()) {
+                        if (targetAuthExchange.getState() == AuthExchange.State.SUCCESS
+                                && targetAuthExchange.getAuthScheme() != null
+                                && targetAuthExchange.getAuthScheme().isConnectionBased()) {
                             this.log.debug("Resetting target auth state");
-                            targetAuthState.reset();
+                            targetAuthExchange.reset();
                         }
                     }
                     // discard previous auth headers
@@ -319,7 +312,7 @@ public class MainClientExec implements C
             }
 
             if (userToken == null) {
-                userToken = userTokenHandler.getUserToken(context);
+                userToken = userTokenHandler.getUserToken(route, context);
                 context.setAttribute(HttpClientContext.USER_TOKEN, userToken);
             }
             if (userToken != null) {
@@ -350,7 +343,6 @@ public class MainClientExec implements C
      * Establishes the target route.
      */
     void establishRoute(
-            final AuthExchange proxyAuthState,
             final HttpClientConnection managedConn,
             final HttpRoute route,
             final HttpRequest request,
@@ -383,8 +375,7 @@ public class MainClientExec implements C
                 tracker.connectProxy(proxy, false);
                 break;
             case HttpRouteDirector.TUNNEL_TARGET: {
-                final boolean secure = createTunnelToTarget(
-                        proxyAuthState, managedConn, route, request, context);
+                final boolean secure = createTunnelToTarget(managedConn, route, request, context);
                 this.log.debug("Tunnel to target created.");
                 tracker.tunnelTarget(secure);
             }   break;
@@ -428,7 +419,6 @@ public class MainClientExec implements C
      * information about the tunnel, that is left to the caller.
      */
     private boolean createTunnelToTarget(
-            final AuthExchange proxyAuthState,
             final HttpClientConnection managedConn,
             final HttpRoute route,
             final HttpRequest request,
@@ -439,6 +429,7 @@ public class MainClientExec implements C
 
         final HttpHost target = route.getTargetHost();
         final HttpHost proxy = route.getProxyHost();
+        final AuthExchange proxyAuthExchange = context.getAuthExchange(proxy);
         HttpResponse response = null;
 
         final String authority = target.toHostString();
@@ -456,7 +447,7 @@ public class MainClientExec implements C
             }
 
             connect.removeHeaders(HttpHeaders.PROXY_AUTHORIZATION);
-            this.authenticator.addAuthResponse(proxy, ChallengeType.PROXY, connect, proxyAuthState, context);
+            this.authenticator.addAuthResponse(proxy, ChallengeType.PROXY, connect, proxyAuthExchange, context);
 
             response = this.requestExecutor.execute(connect, managedConn, context);
 
@@ -468,9 +459,9 @@ public class MainClientExec implements C
 
             if (config.isAuthenticationEnabled()) {
                 if (this.authenticator.isChallenged(proxy, ChallengeType.PROXY, response,
-                        proxyAuthState, context)) {
+                        proxyAuthExchange, context)) {
                     if (this.authenticator.prepareAuthResponse(proxy, ChallengeType.PROXY, response,
-                            this.proxyAuthStrategy, proxyAuthState, context)) {
+                            this.proxyAuthStrategy, proxyAuthExchange, context)) {
                         // Retry request
                         if (this.reuseStrategy.keepAlive(response, context)) {
                             this.log.debug("Connection kept alive");
@@ -531,8 +522,8 @@ public class MainClientExec implements C
     }
 
     private boolean needAuthentication(
-            final AuthExchange targetAuthState,
-            final AuthExchange proxyAuthState,
+            final AuthExchange targetAuthExchange,
+            final AuthExchange proxyAuthExchange,
             final HttpRoute route,
             final HttpResponse response,
             final HttpClientContext context) {
@@ -549,7 +540,7 @@ public class MainClientExec implements C
                         target.getSchemeName());
             }
             final boolean targetAuthRequested = this.authenticator.isChallenged(
-                    target, ChallengeType.TARGET, response, targetAuthState, context);
+                    target, ChallengeType.TARGET, response, targetAuthExchange, context);
 
             HttpHost proxy = route.getProxyHost();
             // if proxy is not set use target host instead
@@ -557,15 +548,15 @@ public class MainClientExec implements C
                 proxy = route.getTargetHost();
             }
             final boolean proxyAuthRequested = this.authenticator.isChallenged(
-                    proxy, ChallengeType.PROXY, response, proxyAuthState, context);
+                    proxy, ChallengeType.PROXY, response, proxyAuthExchange, context);
 
             if (targetAuthRequested) {
                 return this.authenticator.prepareAuthResponse(target, ChallengeType.TARGET, response,
-                        this.targetAuthStrategy, targetAuthState, context);
+                        this.targetAuthStrategy, targetAuthExchange, context);
             }
             if (proxyAuthRequested) {
                 return this.authenticator.prepareAuthResponse(proxy, ChallengeType.PROXY, response,
-                        this.proxyAuthStrategy, proxyAuthState, context);
+                        this.proxyAuthStrategy, proxyAuthExchange, context);
             }
         }
         return false;

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/RedirectExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/RedirectExec.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/RedirectExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/execchain/RedirectExec.java Fri Aug  7 07:34:13 2015
@@ -139,17 +139,15 @@ public class RedirectExec implements Cli
 
                     // Reset virtual host and auth states if redirecting to another host
                     if (!currentRoute.getTargetHost().equals(newTarget)) {
-                        final AuthExchange targetAuthState = context.getTargetAuthState();
-                        if (targetAuthState != null) {
-                            this.log.debug("Resetting target auth state");
-                            targetAuthState.reset();
-                        }
-                        final AuthExchange proxyAuthState = context.getProxyAuthState();
-                        if (proxyAuthState != null) {
-                            final AuthScheme authScheme = proxyAuthState.getAuthScheme();
+                        final AuthExchange targetAuthExchange = context.getAuthExchange(currentRoute.getTargetHost());
+                        this.log.debug("Resetting target auth state");
+                        targetAuthExchange.reset();
+                        if (currentRoute.getProxyHost() != null) {
+                            final AuthExchange proxyAuthExchange = context.getAuthExchange(currentRoute.getProxyHost());
+                            final AuthScheme authScheme = proxyAuthExchange.getAuthScheme();
                             if (authScheme != null && authScheme.isConnectionBased()) {
                                 this.log.debug("Resetting proxy auth state");
-                                proxyAuthState.reset();
+                                proxyAuthExchange.reset();
                             }
                         }
                     }

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRequestAuthCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRequestAuthCache.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRequestAuthCache.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestRequestAuthCache.java Fri Aug  7 07:34:13 2015
@@ -29,8 +29,8 @@ package org.apache.http.client.protocol;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.auth.AuthScope;
 import org.apache.http.auth.AuthExchange;
+import org.apache.http.auth.AuthScope;
 import org.apache.http.auth.Credentials;
 import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.http.client.AuthCache;
@@ -55,8 +55,6 @@ public class TestRequestAuthCache {
     private BasicScheme authscheme1;
     private BasicScheme authscheme2;
     private BasicCredentialsProvider credProvider;
-    private AuthExchange targetState;
-    private AuthExchange proxyState;
 
     @Before
     public void setUp() {
@@ -73,9 +71,6 @@ public class TestRequestAuthCache {
 
         this.credProvider.setCredentials(this.authscope1, this.creds1);
         this.credProvider.setCredentials(this.authscope2, this.creds2);
-
-        this.targetState = new AuthExchange();
-        this.proxyState = new AuthExchange();
     }
 
     @Test(expected=IllegalArgumentException.class)
@@ -100,8 +95,6 @@ public class TestRequestAuthCache {
         context.setAttribute(HttpClientContext.CREDS_PROVIDER, this.credProvider);
         context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
         context.setAttribute(HttpClientContext.HTTP_ROUTE, new HttpRoute(this.target, null, this.proxy, false));
-        context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, this.targetState);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyState);
 
         final AuthCache authCache = new BasicAuthCache();
         authCache.put(this.target, this.authscheme1);
@@ -111,8 +104,14 @@ public class TestRequestAuthCache {
 
         final HttpRequestInterceptor interceptor = new RequestAuthCache();
         interceptor.process(request, context);
-        Assert.assertNotNull(this.targetState.getAuthScheme());
-        Assert.assertNotNull(this.proxyState.getAuthScheme());
+
+        final AuthExchange targetAuthExchange = context.getAuthExchange(this.target);
+        final AuthExchange proxyAuthExchange = context.getAuthExchange(this.proxy);
+
+        Assert.assertNotNull(targetAuthExchange);
+        Assert.assertNotNull(targetAuthExchange.getAuthScheme());
+        Assert.assertNotNull(proxyAuthExchange);
+        Assert.assertNotNull(proxyAuthExchange.getAuthScheme());
     }
 
     @Test
@@ -123,8 +122,6 @@ public class TestRequestAuthCache {
         context.setAttribute(HttpClientContext.CREDS_PROVIDER, null);
         context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
         context.setAttribute(HttpClientContext.HTTP_ROUTE, new HttpRoute(this.target, null, this.proxy, false));
-        context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, this.targetState);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyState);
 
         final AuthCache authCache = new BasicAuthCache();
         authCache.put(this.target, this.authscheme1);
@@ -134,8 +131,14 @@ public class TestRequestAuthCache {
 
         final HttpRequestInterceptor interceptor = new RequestAuthCache();
         interceptor.process(request, context);
-        Assert.assertNull(this.targetState.getAuthScheme());
-        Assert.assertNull(this.proxyState.getAuthScheme());
+
+        final AuthExchange targetAuthExchange = context.getAuthExchange(this.target);
+        final AuthExchange proxyAuthExchange = context.getAuthExchange(this.proxy);
+
+        Assert.assertNotNull(targetAuthExchange);
+        Assert.assertNull(targetAuthExchange.getAuthScheme());
+        Assert.assertNotNull(proxyAuthExchange);
+        Assert.assertNull(proxyAuthExchange.getAuthScheme());
     }
 
     @Test
@@ -146,14 +149,18 @@ public class TestRequestAuthCache {
         context.setAttribute(HttpClientContext.CREDS_PROVIDER, this.credProvider);
         context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
         context.setAttribute(HttpClientContext.HTTP_ROUTE, new HttpRoute(this.target, null, this.proxy, false));
-        context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, this.targetState);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyState);
         context.setAttribute(HttpClientContext.AUTH_CACHE, null);
 
         final HttpRequestInterceptor interceptor = new RequestAuthCache();
         interceptor.process(request, context);
-        Assert.assertNull(this.targetState.getAuthScheme());
-        Assert.assertNull(this.proxyState.getAuthScheme());
+
+        final AuthExchange targetAuthExchange = context.getAuthExchange(this.target);
+        final AuthExchange proxyAuthExchange = context.getAuthExchange(this.proxy);
+
+        Assert.assertNotNull(targetAuthExchange);
+        Assert.assertNull(targetAuthExchange.getAuthScheme());
+        Assert.assertNotNull(proxyAuthExchange);
+        Assert.assertNull(proxyAuthExchange.getAuthScheme());
     }
 
     @Test
@@ -164,44 +171,20 @@ public class TestRequestAuthCache {
         context.setAttribute(HttpClientContext.CREDS_PROVIDER, this.credProvider);
         context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
         context.setAttribute(HttpClientContext.HTTP_ROUTE, new HttpRoute(this.target, null, this.proxy, false));
-        context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, this.targetState);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyState);
 
         final AuthCache authCache = new BasicAuthCache();
         context.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
 
         final HttpRequestInterceptor interceptor = new RequestAuthCache();
         interceptor.process(request, context);
-        Assert.assertNull(this.targetState.getAuthScheme());
-        Assert.assertNull(this.proxyState.getAuthScheme());
-    }
-
-    @Test
-    public void testAuthSchemeAlreadySet() throws Exception {
-        final HttpRequest request = new BasicHttpRequest("GET", "/");
 
-        final HttpClientContext context = HttpClientContext.create();
-        context.setAttribute(HttpClientContext.CREDS_PROVIDER, this.credProvider);
-        context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
-        context.setAttribute(HttpClientContext.HTTP_ROUTE, new HttpRoute(this.target, null, this.proxy, false));
-        context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, this.targetState);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyState);
+        final AuthExchange targetAuthExchange = context.getAuthExchange(this.target);
+        final AuthExchange proxyAuthExchange = context.getAuthExchange(this.proxy);
 
-        final AuthCache authCache = new BasicAuthCache();
-        authCache.put(this.target, this.authscheme1);
-        authCache.put(this.proxy, this.authscheme2);
-
-        context.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
-
-        this.targetState.setState(AuthExchange.State.CHALLENGED);
-        this.targetState.select(new BasicScheme());
-        this.proxyState.setState(AuthExchange.State.CHALLENGED);
-        this.proxyState.select(new BasicScheme());
-
-        final HttpRequestInterceptor interceptor = new RequestAuthCache();
-        interceptor.process(request, context);
-        Assert.assertNotSame(this.authscheme1, this.targetState.getAuthScheme());
-        Assert.assertNotSame(this.authscheme2, this.proxyState.getAuthScheme());
+        Assert.assertNotNull(targetAuthExchange);
+        Assert.assertNull(targetAuthExchange.getAuthScheme());
+        Assert.assertNotNull(proxyAuthExchange);
+        Assert.assertNull(proxyAuthExchange.getAuthScheme());
     }
 
 }

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/integration/TestStatefulConnManagement.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/integration/TestStatefulConnManagement.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/integration/TestStatefulConnManagement.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/integration/TestStatefulConnManagement.java Fri Aug  7 07:34:13 2015
@@ -38,6 +38,7 @@ import org.apache.http.client.HttpClient
 import org.apache.http.client.UserTokenHandler;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.conn.routing.HttpRoute;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.localserver.LocalServerTestBase;
 import org.apache.http.protocol.BasicHttpContext;
@@ -83,7 +84,7 @@ public class TestStatefulConnManagement
         final UserTokenHandler userTokenHandler = new UserTokenHandler() {
 
             @Override
-            public Object getUserToken(final HttpContext context) {
+            public Object getUserToken(final HttpRoute route, final HttpContext context) {
                 final String id = (String) context.getAttribute("user");
                 return id;
             }
@@ -209,7 +210,7 @@ public class TestStatefulConnManagement
         final UserTokenHandler userTokenHandler = new UserTokenHandler() {
 
             @Override
-            public Object getUserToken(final HttpContext context) {
+            public Object getUserToken(final HttpRoute route, final HttpContext context) {
                 return context.getAttribute("user");
             }
 

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestMainClientExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestMainClientExec.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestMainClientExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestMainClientExec.java Fri Aug  7 07:34:13 2015
@@ -46,9 +46,9 @@ import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
 import org.apache.http.auth.AuthChallenge;
+import org.apache.http.auth.AuthExchange;
 import org.apache.http.auth.AuthScheme;
 import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.AuthExchange;
 import org.apache.http.auth.ChallengeType;
 import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.http.client.AuthenticationStrategy;
@@ -162,8 +162,6 @@ public class TestMainClientExec {
         Mockito.verify(managedConn, Mockito.times(1)).close();
         Mockito.verify(connManager).releaseConnection(managedConn, null, 0, TimeUnit.MILLISECONDS);
 
-        Assert.assertNotNull(context.getTargetAuthState());
-        Assert.assertNotNull(context.getProxyAuthState());
         Assert.assertSame(managedConn, context.getConnection());
         Assert.assertNull(context.getUserToken());
         Assert.assertNotNull(finalResponse);
@@ -219,6 +217,7 @@ public class TestMainClientExec {
                 Mockito.same(response),
                 Mockito.<HttpClientContext>any())).thenReturn(Boolean.TRUE);
         Mockito.when(userTokenHandler.getUserToken(
+                Mockito.same(route),
                 Mockito.<HttpClientContext>any())).thenReturn("this and that");
 
         mainClientExec.execute(route, request, context, execAware);
@@ -424,7 +423,7 @@ public class TestMainClientExec {
 
     @Test
     public void testExecEntityEnclosingRequestRetryOnAuthChallenge() throws Exception {
-        final HttpRoute route = new HttpRoute(target);
+        final HttpRoute route = new HttpRoute(target, proxy);
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
         final HttpResponse response1 = new BasicHttpResponse(HttpVersion.HTTP_1_1, 401, "Huh?");
         response1.setHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=test");
@@ -438,12 +437,12 @@ public class TestMainClientExec {
                 .setStream(instream2)
                 .build());
 
-        final AuthExchange proxyAuthState = new AuthExchange();
-        proxyAuthState.setState(AuthExchange.State.SUCCESS);
-        proxyAuthState.select(new NTLMScheme());
-
         final HttpClientContext context = new HttpClientContext();
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, proxyAuthState);
+
+        final AuthExchange proxyAuthExchange = new AuthExchange();
+        proxyAuthExchange.setState(AuthExchange.State.SUCCESS);
+        proxyAuthExchange.select(new NTLMScheme());
+        context.setAuthExchange(proxy, proxyAuthExchange);
 
         final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
         credentialsProvider.setCredentials(new AuthScope(target), new UsernamePasswordCredentials("user:pass"));
@@ -472,7 +471,7 @@ public class TestMainClientExec {
 
         Assert.assertNotNull(finalResponse);
         Assert.assertEquals(200, finalResponse.getStatusLine().getStatusCode());
-        Assert.assertNull(proxyAuthState.getAuthScheme());
+        Assert.assertNull(proxyAuthExchange.getAuthScheme());
     }
 
     @Test(expected = NonRepeatableRequestException.class)
@@ -601,14 +600,13 @@ public class TestMainClientExec {
 
     @Test
     public void testEstablishDirectRoute() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target);
         final HttpClientContext context = new HttpClientContext();
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
 
         Mockito.when(managedConn.isOpen()).thenReturn(Boolean.TRUE);
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
 
         Mockito.verify(connManager).connect(managedConn, route, 0, context);
         Mockito.verify(connManager).routeComplete(managedConn, route, context);
@@ -616,14 +614,13 @@ public class TestMainClientExec {
 
     @Test
     public void testEstablishRouteDirectProxy() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target, null, proxy, false);
         final HttpClientContext context = new HttpClientContext();
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
 
         Mockito.when(managedConn.isOpen()).thenReturn(Boolean.TRUE);
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
 
         Mockito.verify(connManager).connect(managedConn, route, 0, context);
         Mockito.verify(connManager).routeComplete(managedConn, route, context);
@@ -631,7 +628,6 @@ public class TestMainClientExec {
 
     @Test
     public void testEstablishRouteViaProxyTunnel() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target, null, proxy, true);
         final HttpClientContext context = new HttpClientContext();
         final RequestConfig config = RequestConfig.custom()
@@ -647,7 +643,7 @@ public class TestMainClientExec {
                 Mockito.<HttpClientConnection>any(),
                 Mockito.<HttpClientContext>any())).thenReturn(response);
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
 
         Mockito.verify(connManager).connect(managedConn, route, 321, context);
         Mockito.verify(connManager).routeComplete(managedConn, route, context);
@@ -665,7 +661,6 @@ public class TestMainClientExec {
 
     @Test(expected = HttpException.class)
     public void testEstablishRouteViaProxyTunnelUnexpectedResponse() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target, null, proxy, true);
         final HttpClientContext context = new HttpClientContext();
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
@@ -677,12 +672,11 @@ public class TestMainClientExec {
                 Mockito.<HttpClientConnection>any(),
                 Mockito.<HttpClientContext>any())).thenReturn(response);
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
     }
 
     @Test(expected = HttpException.class)
     public void testEstablishRouteViaProxyTunnelFailure() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target, null, proxy, true);
         final HttpClientContext context = new HttpClientContext();
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
@@ -696,7 +690,7 @@ public class TestMainClientExec {
                 Mockito.<HttpClientContext>any())).thenReturn(response);
 
         try {
-            mainClientExec.establishRoute(authState, managedConn, route, request, context);
+            mainClientExec.establishRoute(managedConn, route, request, context);
         } catch (final TunnelRefusedException ex) {
             final HttpResponse r = ex.getResponse();
             Assert.assertEquals("Ka-boom", EntityUtils.toString(r.getEntity()));
@@ -709,7 +703,6 @@ public class TestMainClientExec {
 
     @Test
     public void testEstablishRouteViaProxyTunnelRetryOnAuthChallengePersistentConnection() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target, null, proxy, true);
         final HttpClientContext context = new HttpClientContext();
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
@@ -739,7 +732,7 @@ public class TestMainClientExec {
                 Mockito.<Map<String, AuthChallenge>>any(),
                 Mockito.<HttpClientContext>any())).thenReturn(Collections.<AuthScheme>singletonList(new BasicScheme()));
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
 
         Mockito.verify(connManager).connect(managedConn, route, 0, context);
         Mockito.verify(connManager).routeComplete(managedConn, route, context);
@@ -748,7 +741,6 @@ public class TestMainClientExec {
 
     @Test
     public void testEstablishRouteViaProxyTunnelRetryOnAuthChallengeNonPersistentConnection() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpRoute route = new HttpRoute(target, null, proxy, true);
         final HttpClientContext context = new HttpClientContext();
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(new HttpGet("http://bar/test"));
@@ -778,7 +770,7 @@ public class TestMainClientExec {
                 Mockito.<Map<String, AuthChallenge>>any(),
                 Mockito.<HttpClientContext>any())).thenReturn(Collections.<AuthScheme>singletonList(new BasicScheme()));
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
 
         Mockito.verify(connManager).connect(managedConn, route, 0, context);
         Mockito.verify(connManager).routeComplete(managedConn, route, context);
@@ -788,7 +780,6 @@ public class TestMainClientExec {
 
     @Test(expected = HttpException.class)
     public void testEstablishRouteViaProxyTunnelMultipleHops() throws Exception {
-        final AuthExchange authState = new AuthExchange();
         final HttpHost proxy1 = new HttpHost("this", 8888);
         final HttpHost proxy2 = new HttpHost("that", 8888);
         final HttpRoute route = new HttpRoute(target, null, new HttpHost[] {proxy1, proxy2},
@@ -798,7 +789,7 @@ public class TestMainClientExec {
 
         Mockito.when(managedConn.isOpen()).thenReturn(Boolean.TRUE);
 
-        mainClientExec.establishRoute(authState, managedConn, route, request, context);
+        mainClientExec.establishRoute(managedConn, route, request, context);
     }
 
 }
\ No newline at end of file

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestRedirectExec.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestRedirectExec.java?rev=1694620&r1=1694619&r2=1694620&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestRedirectExec.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/execchain/TestRedirectExec.java Fri Aug  7 07:34:13 2015
@@ -230,19 +230,21 @@ public class TestRedirectExec {
 
     @Test
     public void testCrossSiteRedirect() throws Exception {
-        final HttpRoute route = new HttpRoute(target);
+
+        final HttpHost proxy = new HttpHost("proxy");
+        final HttpRoute route = new HttpRoute(target, proxy);
         final HttpGet get = new HttpGet("/test");
         final HttpRequestWrapper request = HttpRequestWrapper.wrap(get);
         final HttpClientContext context = HttpClientContext.create();
 
-        final AuthExchange targetAuthState = new AuthExchange();
-        targetAuthState.setState(AuthExchange.State.SUCCESS);
-        targetAuthState.select(new BasicScheme());
-        final AuthExchange proxyAuthState = new AuthExchange();
-        proxyAuthState.setState(AuthExchange.State.SUCCESS);
-        proxyAuthState.select(new NTLMScheme());
-        context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, targetAuthState);
-        context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, proxyAuthState);
+        final AuthExchange targetAuthExchange = new AuthExchange();
+        targetAuthExchange.setState(AuthExchange.State.SUCCESS);
+        targetAuthExchange.select(new BasicScheme());
+        final AuthExchange proxyAuthExchange = new AuthExchange();
+        proxyAuthExchange.setState(AuthExchange.State.SUCCESS);
+        proxyAuthExchange.select(new NTLMScheme());
+        context.setAuthExchange(target, targetAuthExchange);
+        context.setAuthExchange(proxy, proxyAuthExchange);
 
         final CloseableHttpResponse response1 = Mockito.mock(CloseableHttpResponse.class);
         final CloseableHttpResponse response2 = Mockito.mock(CloseableHttpResponse.class);
@@ -272,12 +274,14 @@ public class TestRedirectExec {
 
         redirectExec.execute(route, request, context, execAware);
 
-        Assert.assertNotNull(context.getTargetAuthState());
-        Assert.assertEquals(AuthExchange.State.UNCHALLENGED, context.getTargetAuthState().getState());
-        Assert.assertEquals(null, context.getTargetAuthState().getAuthScheme());
-        Assert.assertNotNull(context.getProxyAuthState());
-        Assert.assertEquals(AuthExchange.State.UNCHALLENGED, context.getProxyAuthState().getState());
-        Assert.assertEquals(null, context.getProxyAuthState().getAuthScheme());
+        final AuthExchange authExchange1 = context.getAuthExchange(target);
+        Assert.assertNotNull(authExchange1);
+        Assert.assertEquals(AuthExchange.State.UNCHALLENGED, authExchange1.getState());
+        Assert.assertEquals(null, authExchange1.getAuthScheme());
+        final AuthExchange authExchange2 = context.getAuthExchange(proxy);
+        Assert.assertNotNull(authExchange2);
+        Assert.assertEquals(AuthExchange.State.UNCHALLENGED, authExchange2.getState());
+        Assert.assertEquals(null, authExchange2.getAuthScheme());
     }
 
     @Test(expected = RuntimeException.class)