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 2011/10/12 20:33:15 UTC
svn commit: r1182515 - in /httpcomponents/httpclient/trunk/httpclient/src:
main/java/org/apache/http/client/ main/java/org/apache/http/client/protocol/
main/java/org/apache/http/impl/client/
test/java/org/apache/http/client/protocol/ test/java/org/apac...
Author: olegk
Date: Wed Oct 12 18:33:15 2011
New Revision: 1182515
URL: http://svn.apache.org/viewvc?rev=1182515&view=rev
Log:
Redesigned auth caching
Modified:
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/AuthenticationStrategy.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/client/protocol/ResponseAuthCache.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyAdaptor.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyImpl.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpClient.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/HttpAuthenticator.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/ProxyClient.java
httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestResponseAuthCache.java
httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAuthenticationStrategy.java
httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestClientAuthentication.java
httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestHttpAuthenticator.java
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/AuthenticationStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/AuthenticationStrategy.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/AuthenticationStrategy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/AuthenticationStrategy.java Wed Oct 12 18:33:15 2011
@@ -34,6 +34,7 @@ import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthOption;
+import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.MalformedChallengeException;
import org.apache.http.protocol.HttpContext;
@@ -52,13 +53,16 @@ public interface AuthenticationStrategy
/**
* Determines if the given HTTP response response represents
* an authentication challenge that was sent back as a result
- * of authentication failure
+ * of authentication failure.
+ *
+ * @param authhost authentication host.
* @param response HTTP response.
* @param context HTTP context.
* @return <code>true</code> if user authentication is required,
* <code>false</code> otherwise.
*/
boolean isAuthenticationRequested(
+ HttpHost authhost,
HttpResponse response,
HttpContext context);
@@ -67,6 +71,7 @@ public interface AuthenticationStrategy
* challenges, each of which represents an authentication scheme supported
* by the authentication host.
*
+ * @param authhost authentication host.
* @param response HTTP response.
* @param context HTTP context.
* @return a collection of challenges keyed by names of corresponding
@@ -75,6 +80,7 @@ public interface AuthenticationStrategy
* challenges is not valid or malformed.
*/
Map<String, Header> getChallenges(
+ HttpHost authhost,
HttpResponse response,
HttpContext context) throws MalformedChallengeException;
@@ -82,7 +88,9 @@ public interface AuthenticationStrategy
* Selects one authentication challenge out of all available and
* creates and generates {@link AuthOption} instance capable of
* processing that challenge.
+ *
* @param challenges collection of challenges.
+ * @param authhost authentication host.
* @param response HTTP response.
* @param context HTTP context.
* @return authentication auth schemes that can be used for authentication. Can be empty.
@@ -95,4 +103,28 @@ public interface AuthenticationStrategy
HttpResponse response,
HttpContext context) throws MalformedChallengeException;
+ /**
+ * Callback invoked in case of successful authentication.
+ *
+ * @param authhost authentication host.
+ * @param authScheme authentication scheme used.
+ * @param context HTTP context.
+ */
+ void authSucceeded(
+ HttpHost authhost,
+ AuthScheme authScheme,
+ HttpContext context);
+
+ /**
+ * Callback invoked in case of unsuccessful authentication.
+ *
+ * @param authhost authentication host.
+ * @param authScheme authentication scheme used.
+ * @param context HTTP context.
+ */
+ void authFailed(
+ HttpHost authhost,
+ AuthScheme authScheme,
+ HttpContext context);
+
}
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=1182515&r1=1182514&r2=1182515&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 Wed Oct 12 18:33:15 2011
@@ -127,6 +127,7 @@ public class RequestAuthCache implements
Credentials creds = credsProvider.getCredentials(authScope);
if (creds != null) {
+ authState.setState(AuthProtocolState.SUCCESS);
authState.update(authScheme, creds);
} else {
this.log.debug("No credentials for preemptive authentication");
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/ResponseAuthCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/ResponseAuthCache.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/ResponseAuthCache.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/protocol/ResponseAuthCache.java Wed Oct 12 18:33:15 2011
@@ -39,6 +39,7 @@ import org.apache.http.annotation.Immuta
import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthState;
import org.apache.http.client.AuthCache;
+import org.apache.http.client.AuthenticationStrategy;
import org.apache.http.client.params.AuthPolicy;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
@@ -53,8 +54,11 @@ import org.apache.http.protocol.HttpCont
* additional authentication round-trips.
*
* @since 4.1
+ *
+ * @deprecated use {@link AuthenticationStrategy}
*/
@Immutable
+@Deprecated
public class ResponseAuthCache implements HttpResponseInterceptor {
private final Log log = LogFactory.getLog(getClass());
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyAdaptor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyAdaptor.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyAdaptor.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyAdaptor.java Wed Oct 12 18:33:15 2011
@@ -44,9 +44,11 @@ import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthenticationException;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.MalformedChallengeException;
+import org.apache.http.client.AuthCache;
import org.apache.http.client.AuthenticationHandler;
import org.apache.http.client.AuthenticationStrategy;
import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.params.AuthPolicy;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.protocol.HttpContext;
@@ -68,11 +70,15 @@ class AuthenticationStrategyAdaptor impl
this.handler = handler;
}
- public boolean isAuthenticationRequested(final HttpResponse response, final HttpContext context) {
+ public boolean isAuthenticationRequested(
+ final HttpHost authhost,
+ final HttpResponse response,
+ final HttpContext context) {
return this.handler.isAuthenticationRequested(response, context);
}
public Map<String, Header> getChallenges(
+ final HttpHost authhost,
final HttpResponse response,
final HttpContext context) throws MalformedChallengeException {
return this.handler.getChallenges(response, context);
@@ -130,6 +136,44 @@ class AuthenticationStrategyAdaptor impl
return options;
}
+ public void authSucceeded(
+ final HttpHost authhost, final AuthScheme authScheme, final HttpContext context) {
+ AuthCache authCache = (AuthCache) context.getAttribute(ClientContext.AUTH_CACHE);
+ if (isCachable(authScheme)) {
+ if (authCache == null) {
+ authCache = new BasicAuthCache();
+ context.setAttribute(ClientContext.AUTH_CACHE, authCache);
+ }
+ if (this.log.isDebugEnabled()) {
+ this.log.debug("Caching '" + authScheme.getSchemeName() +
+ "' auth scheme for " + authhost);
+ }
+ authCache.put(authhost, authScheme);
+ }
+ }
+
+ public void authFailed(
+ final HttpHost authhost, final AuthScheme authScheme, final HttpContext context) {
+ AuthCache authCache = (AuthCache) context.getAttribute(ClientContext.AUTH_CACHE);
+ if (authCache == null) {
+ return;
+ }
+ if (this.log.isDebugEnabled()) {
+ this.log.debug("Removing from cache '" + authScheme.getSchemeName() +
+ "' auth scheme for " + authhost);
+ }
+ authCache.remove(authhost);
+ }
+
+ private boolean isCachable(final AuthScheme authScheme) {
+ if (authScheme == null || !authScheme.isComplete()) {
+ return false;
+ }
+ String schemeName = authScheme.getSchemeName();
+ return schemeName.equalsIgnoreCase(AuthPolicy.BASIC) ||
+ schemeName.equalsIgnoreCase(AuthPolicy.DIGEST);
+ }
+
public AuthenticationHandler getHandler() {
return this.handler;
}
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyImpl.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyImpl.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/AuthenticationStrategyImpl.java Wed Oct 12 18:33:15 2011
@@ -49,6 +49,7 @@ import org.apache.http.auth.AuthSchemeRe
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.MalformedChallengeException;
+import org.apache.http.client.AuthCache;
import org.apache.http.client.AuthenticationStrategy;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.params.AuthPolicy;
@@ -81,7 +82,10 @@ class AuthenticationStrategyImpl impleme
this.prefParamName = prefParamName;
}
- public boolean isAuthenticationRequested(final HttpResponse response, final HttpContext context) {
+ public boolean isAuthenticationRequested(
+ final HttpHost authhost,
+ final HttpResponse response,
+ final HttpContext context) {
if (response == null) {
throw new IllegalArgumentException("HTTP response may not be null");
}
@@ -90,6 +94,7 @@ class AuthenticationStrategyImpl impleme
}
public Map<String, Header> getChallenges(
+ final HttpHost authhost,
final HttpResponse response,
final HttpContext context) throws MalformedChallengeException {
if (response == null) {
@@ -200,4 +205,59 @@ class AuthenticationStrategyImpl impleme
return options;
}
+ public void authSucceeded(
+ final HttpHost authhost, final AuthScheme authScheme, final HttpContext context) {
+ if (authhost == null) {
+ throw new IllegalArgumentException("Host may not be null");
+ }
+ if (authScheme == null) {
+ throw new IllegalArgumentException("Auth scheme may not be null");
+ }
+ if (context == null) {
+ throw new IllegalArgumentException("HTTP context may not be null");
+ }
+ if (isCachable(authScheme)) {
+ AuthCache authCache = (AuthCache) context.getAttribute(ClientContext.AUTH_CACHE);
+ if (authCache == null) {
+ authCache = new BasicAuthCache();
+ context.setAttribute(ClientContext.AUTH_CACHE, authCache);
+ }
+ if (this.log.isDebugEnabled()) {
+ this.log.debug("Caching '" + authScheme.getSchemeName() +
+ "' auth scheme for " + authhost);
+ }
+ authCache.put(authhost, authScheme);
+ }
+ }
+
+ protected boolean isCachable(final AuthScheme authScheme) {
+ if (authScheme == null || !authScheme.isComplete()) {
+ return false;
+ }
+ String schemeName = authScheme.getSchemeName();
+ return schemeName.equalsIgnoreCase(AuthPolicy.BASIC) ||
+ schemeName.equalsIgnoreCase(AuthPolicy.DIGEST);
+ }
+
+ public void authFailed(
+ final HttpHost authhost, final AuthScheme authScheme, final HttpContext context) {
+ if (authhost == null) {
+ throw new IllegalArgumentException("Host may not be null");
+ }
+ if (authScheme == null) {
+ throw new IllegalArgumentException("Auth scheme may not be null");
+ }
+ if (context == null) {
+ throw new IllegalArgumentException("HTTP context may not be null");
+ }
+ AuthCache authCache = (AuthCache) context.getAttribute(ClientContext.AUTH_CACHE);
+ if (authCache != null) {
+ if (this.log.isDebugEnabled()) {
+ this.log.debug("Removing from cache '" + authScheme.getSchemeName() +
+ "' auth scheme for " + authhost);
+ }
+ authCache.remove(authhost);
+ }
+ }
+
}
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpClient.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpClient.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultHttpClient.java Wed Oct 12 18:33:15 2011
@@ -36,7 +36,6 @@ import org.apache.http.client.protocol.R
import org.apache.http.client.protocol.RequestDefaultHeaders;
import org.apache.http.client.protocol.RequestProxyAuthentication;
import org.apache.http.client.protocol.RequestTargetAuthentication;
-import org.apache.http.client.protocol.ResponseAuthCache;
import org.apache.http.client.protocol.ResponseProcessCookies;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.params.CoreConnectionPNames;
@@ -198,7 +197,6 @@ public class DefaultHttpClient extends A
* <li>{@link RequestAddCookies}</li>
* <li>{@link ResponseProcessCookies}</li>
* <li>{@link RequestAuthCache}</li>
- * <li>{@link ResponseAuthCache}</li>
* <li>{@link RequestTargetAuthentication}</li>
* <li>{@link RequestProxyAuthentication}</li>
* </ul>
@@ -221,7 +219,6 @@ public class DefaultHttpClient extends A
httpproc.addInterceptor(new ResponseProcessCookies());
// HTTP authentication interceptors
httpproc.addInterceptor(new RequestAuthCache());
- httpproc.addInterceptor(new ResponseAuthCache());
httpproc.addInterceptor(new RequestTargetAuthentication());
httpproc.addInterceptor(new RequestProxyAuthentication());
return httpproc;
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java Wed Oct 12 18:33:15 2011
@@ -184,9 +184,9 @@ public class DefaultRequestDirector impl
/** The currently allocated connection. */
protected ManagedClientConnection managedConn;
- protected AuthState targetAuthState;
+ protected final AuthState targetAuthState;
- protected AuthState proxyAuthState;
+ protected final AuthState proxyAuthState;
private final HttpAuthenticator authenticator;
@@ -351,6 +351,8 @@ public class DefaultRequestDirector impl
this.execCount = 0;
this.redirectCount = 0;
+ this.targetAuthState = new AuthState();
+ this.proxyAuthState = new AuthState();
this.maxRedirects = this.params.getIntParameter(ClientPNames.MAX_REDIRECTS, 100);
}
@@ -400,16 +402,8 @@ public class DefaultRequestDirector impl
HttpContext context)
throws HttpException, IOException {
- targetAuthState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
- if (targetAuthState == null) {
- targetAuthState = new AuthState();
- context.setAttribute(ClientContext.TARGET_AUTH_STATE, targetAuthState);
- }
- proxyAuthState = (AuthState) context.getAttribute(ClientContext.PROXY_AUTH_STATE);
- if (proxyAuthState == null) {
- proxyAuthState = new AuthState();
- context.setAttribute(ClientContext.PROXY_AUTH_STATE, proxyAuthState);
- }
+ context.setAttribute(ClientContext.TARGET_AUTH_STATE, targetAuthState);
+ context.setAttribute(ClientContext.PROXY_AUTH_STATE, proxyAuthState);
HttpRequest orig = request;
RequestWrapper origWrapper = wrapRequest(orig);
@@ -910,7 +904,7 @@ public class DefaultRequestDirector impl
}
if (HttpClientParams.isAuthenticating(this.params)) {
- if (this.authenticator.isAuthenticationRequested(response,
+ if (this.authenticator.isAuthenticationRequested(proxy, response,
this.proxyAuthStrategy, this.proxyAuthState, context)) {
if (this.authenticator.authenticate(proxy, response,
this.proxyAuthStrategy, this.proxyAuthState, context)) {
@@ -1107,19 +1101,16 @@ public class DefaultRequestDirector impl
}
if (HttpClientParams.isAuthenticating(params)) {
- if (this.authenticator.isAuthenticationRequested(response,
+ HttpHost target = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
+ if (target == null) {
+ target = route.getTargetHost();
+ }
+ if (target.getPort() < 0) {
+ Scheme scheme = connManager.getSchemeRegistry().getScheme(target);
+ target = new HttpHost(target.getHostName(), scheme.getDefaultPort(), target.getSchemeName());
+ }
+ if (this.authenticator.isAuthenticationRequested(target, response,
this.targetAuthStrategy, this.targetAuthState, context)) {
-
- HttpHost target = (HttpHost)
- context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
- if (target == null) {
- target = route.getTargetHost();
- }
- if (target.getPort() < 0) {
- Scheme scheme = connManager.getSchemeRegistry().getScheme(target);
- target = new HttpHost(
- target.getHostName(), scheme.getDefaultPort(), target.getSchemeName());
- }
if (this.authenticator.authenticate(target, response,
this.targetAuthStrategy, this.targetAuthState, context)) {
// Re-try the same request via the same route
@@ -1129,9 +1120,9 @@ public class DefaultRequestDirector impl
}
}
- if (this.authenticator.isAuthenticationRequested(response,
+ HttpHost proxy = route.getProxyHost();
+ if (this.authenticator.isAuthenticationRequested(proxy, response,
this.proxyAuthStrategy, this.proxyAuthState, context)) {
- HttpHost proxy = route.getProxyHost();
if (this.authenticator.authenticate(proxy, response,
this.proxyAuthStrategy, this.proxyAuthState, context)) {
// Re-try the same request via the same route
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/HttpAuthenticator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/HttpAuthenticator.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/HttpAuthenticator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/HttpAuthenticator.java Wed Oct 12 18:33:15 2011
@@ -58,17 +58,19 @@ public class HttpAuthenticator {
}
public boolean isAuthenticationRequested(
+ final HttpHost host,
final HttpResponse response,
final AuthenticationStrategy authStrategy,
final AuthState authState,
final HttpContext context) {
- if (authStrategy.isAuthenticationRequested(response, context)) {
+ if (authStrategy.isAuthenticationRequested(host, response, context)) {
return true;
} else {
switch (authState.getState()) {
case CHALLENGED:
case HANDSHAKE:
authState.setState(AuthProtocolState.SUCCESS);
+ authStrategy.authSucceeded(host, authState.getAuthScheme(), context);
break;
case SUCCESS:
break;
@@ -89,7 +91,7 @@ public class HttpAuthenticator {
if (this.log.isDebugEnabled()) {
this.log.debug(host.toHostString() + " requested authentication");
}
- Map<String, Header> challenges = authStrategy.getChallenges(response, context);
+ Map<String, Header> challenges = authStrategy.getChallenges(host, response, context);
if (challenges.isEmpty()) {
this.log.debug("Response contains no authentication challenges");
return false;
@@ -105,6 +107,7 @@ public class HttpAuthenticator {
case CHALLENGED:
if (authScheme == null) {
this.log.debug("Auth scheme is null");
+ authStrategy.authFailed(host, authState.getAuthScheme(), context);
authState.reset();
authState.setState(AuthProtocolState.FAILURE);
return false;
@@ -118,6 +121,7 @@ public class HttpAuthenticator {
authScheme.processChallenge(challenge);
if (authScheme.isComplete()) {
this.log.debug("Authentication failed");
+ authStrategy.authFailed(host, authState.getAuthScheme(), context);
authState.reset();
authState.setState(AuthProtocolState.FAILURE);
return false;
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=1182515&r1=1182514&r2=1182515&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 Wed Oct 12 18:33:15 2011
@@ -176,7 +176,7 @@ public class ProxyClient {
}
if (HttpClientParams.isAuthenticating(this.params)) {
- if (this.authenticator.isAuthenticationRequested(response,
+ if (this.authenticator.isAuthenticationRequested(proxy, response,
this.proxyAuthStrategy, this.proxyAuthState, context)) {
if (this.authenticator.authenticate(proxy, response,
this.proxyAuthStrategy, this.proxyAuthState, context)) {
Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestResponseAuthCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestResponseAuthCache.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestResponseAuthCache.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/protocol/TestResponseAuthCache.java Wed Oct 12 18:33:15 2011
@@ -48,6 +48,7 @@ import org.apache.http.protocol.HttpCont
import org.junit.Before;
import org.junit.Test;
+@Deprecated
public class TestResponseAuthCache {
private HttpHost target;
Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAuthenticationStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAuthenticationStrategy.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAuthenticationStrategy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestAuthenticationStrategy.java Wed Oct 12 18:33:15 2011
@@ -37,10 +37,12 @@ import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.auth.AUTH;
import org.apache.http.auth.AuthOption;
+import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthSchemeRegistry;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.auth.params.AuthPNames;
+import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.params.AuthPolicy;
import org.apache.http.client.protocol.ClientContext;
@@ -54,6 +56,7 @@ import org.apache.http.protocol.BasicHtt
import org.apache.http.protocol.HttpContext;
import org.junit.Assert;
import org.junit.Test;
+import org.mockito.Mockito;
/**
* Simple tests for {@link AuthenticationStrategyImpl}.
@@ -63,37 +66,42 @@ public class TestAuthenticationStrategy
@Test(expected=IllegalArgumentException.class)
public void testIsAuthenticationRequestedInvalidInput() throws Exception {
TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost host = new HttpHost("localhost", 80);
HttpContext context = new BasicHttpContext();
- authStrategy.isAuthenticationRequested(null, context);
+ authStrategy.isAuthenticationRequested(host, null, context);
}
@Test
public void testTargetAuthRequested() throws Exception {
TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
+ HttpHost host = new HttpHost("localhost", 80);
HttpContext context = new BasicHttpContext();
- Assert.assertTrue(authStrategy.isAuthenticationRequested(response, context));
+ Assert.assertTrue(authStrategy.isAuthenticationRequested(host, response, context));
}
@Test
public void testProxyAuthRequested() throws Exception {
ProxyAuthenticationStrategy authStrategy = new ProxyAuthenticationStrategy();
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED, "UNAUTHORIZED");
+ HttpHost host = new HttpHost("localhost", 80);
HttpContext context = new BasicHttpContext();
- Assert.assertTrue(authStrategy.isAuthenticationRequested(response, context));
+ Assert.assertTrue(authStrategy.isAuthenticationRequested(host, response, context));
}
@Test(expected=IllegalArgumentException.class)
public void testGetChallengesInvalidInput() throws Exception {
TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost host = new HttpHost("localhost", 80);
HttpContext context = new BasicHttpContext();
- authStrategy.getChallenges(null, context);
+ authStrategy.getChallenges(host, null, context);
}
@Test
public void testGetChallenges() throws Exception {
TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
HttpContext context = new BasicHttpContext();
+ HttpHost host = new HttpHost("localhost", 80);
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
Header h1 = new BasicHeader(AUTH.WWW_AUTH, " Basic realm=\"test\"");
Header h2 = new BasicHeader(AUTH.WWW_AUTH, "\t\tDigest realm=\"realm1\", nonce=\"1234\"");
@@ -102,7 +110,7 @@ public class TestAuthenticationStrategy
response.addHeader(h2);
response.addHeader(h3);
- Map<String, Header> challenges = authStrategy.getChallenges(response, context);
+ Map<String, Header> challenges = authStrategy.getChallenges(host, response, context);
Assert.assertNotNull(challenges);
Assert.assertEquals(3, challenges.size());
@@ -290,4 +298,141 @@ public class TestAuthenticationStrategy
Assert.assertTrue(option1.getAuthScheme() instanceof BasicScheme);
}
+ @Test
+ public void testAuthSucceededInvalidInput() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("locahost", 80);
+ BasicScheme authScheme = new BasicScheme();
+ HttpContext context = new BasicHttpContext();
+ try {
+ authStrategy.authSucceeded(null, authScheme, context);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ }
+ try {
+ authStrategy.authSucceeded(authhost, null, context);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ }
+ try {
+ authStrategy.authSucceeded(authhost, authScheme, null);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ }
+ }
+
+ @Test
+ public void testAuthSucceeded() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("somehost", 80);
+ BasicScheme authScheme = new BasicScheme();
+ authScheme.processChallenge(new BasicHeader(AUTH.WWW_AUTH, "Basic realm=test"));
+
+ AuthCache authCache = Mockito.mock(AuthCache.class);
+
+ HttpContext context = new BasicHttpContext();
+ context.setAttribute(ClientContext.AUTH_CACHE, authCache);
+
+ authStrategy.authSucceeded(authhost, authScheme, context);
+ Mockito.verify(authCache).put(authhost, authScheme);
+ }
+
+ @Test
+ public void testAuthSucceededNoCache() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("somehost", 80);
+ BasicScheme authScheme = new BasicScheme();
+ authScheme.processChallenge(new BasicHeader(AUTH.WWW_AUTH, "Basic realm=test"));
+
+ HttpContext context = new BasicHttpContext();
+ context.setAttribute(ClientContext.AUTH_CACHE, null);
+
+ authStrategy.authSucceeded(authhost, authScheme, context);
+ AuthCache authCache = (AuthCache) context.getAttribute(ClientContext.AUTH_CACHE);
+ Assert.assertNotNull(authCache);
+ }
+
+ @Test
+ public void testAuthScemeNotCompleted() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("somehost", 80);
+ BasicScheme authScheme = new BasicScheme();
+
+ AuthCache authCache = Mockito.mock(AuthCache.class);
+
+ HttpContext context = new BasicHttpContext();
+ context.setAttribute(ClientContext.AUTH_CACHE, authCache);
+
+ authStrategy.authSucceeded(authhost, authScheme, context);
+ Mockito.verify(authCache, Mockito.never()).put(authhost, authScheme);
+ }
+
+ @Test
+ public void testAuthScemeNonCacheable() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("somehost", 80);
+ AuthScheme authScheme = Mockito.mock(AuthScheme.class);
+ Mockito.when(authScheme.isComplete()).thenReturn(true);
+ Mockito.when(authScheme.getSchemeName()).thenReturn("whatever");
+
+ AuthCache authCache = Mockito.mock(AuthCache.class);
+
+ HttpContext context = new BasicHttpContext();
+ context.setAttribute(ClientContext.AUTH_CACHE, authCache);
+
+ authStrategy.authSucceeded(authhost, authScheme, context);
+ Mockito.verify(authCache, Mockito.never()).put(authhost, authScheme);
+ }
+
+ @Test
+ public void testAuthFailedInvalidInput() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("locahost", 80);
+ BasicScheme authScheme = new BasicScheme();
+ HttpContext context = new BasicHttpContext();
+ try {
+ authStrategy.authFailed(null, authScheme, context);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ }
+ try {
+ authStrategy.authFailed(authhost, null, context);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ }
+ try {
+ authStrategy.authFailed(authhost, authScheme, null);
+ Assert.fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ }
+ }
+
+ @Test
+ public void testAuthFailed() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("somehost", 80);
+ BasicScheme authScheme = new BasicScheme();
+ authScheme.processChallenge(new BasicHeader(AUTH.WWW_AUTH, "Basic realm=test"));
+
+ AuthCache authCache = Mockito.mock(AuthCache.class);
+
+ HttpContext context = new BasicHttpContext();
+ context.setAttribute(ClientContext.AUTH_CACHE, authCache);
+
+ authStrategy.authFailed(authhost, authScheme, context);
+ Mockito.verify(authCache).remove(authhost);
+ }
+
+ @Test
+ public void testAuthFailedNoCache() throws Exception {
+ TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
+ HttpHost authhost = new HttpHost("somehost", 80);
+ BasicScheme authScheme = new BasicScheme();
+
+ HttpContext context = new BasicHttpContext();
+ context.setAttribute(ClientContext.AUTH_CACHE, null);
+
+ authStrategy.authFailed(authhost, authScheme, context);
+ }
+
}
Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestClientAuthentication.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestClientAuthentication.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestClientAuthentication.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestClientAuthentication.java Wed Oct 12 18:33:15 2011
@@ -345,9 +345,10 @@ public class TestClientAuthentication ex
@Override
public boolean isAuthenticationRequested(
+ final HttpHost host,
final HttpResponse response,
final HttpContext context) {
- boolean res = super.isAuthenticationRequested(response, context);
+ boolean res = super.isAuthenticationRequested(host, response, context);
if (res == true) {
synchronized (this) {
this.count++;
Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestHttpAuthenticator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestHttpAuthenticator.java?rev=1182515&r1=1182514&r2=1182515&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestHttpAuthenticator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestHttpAuthenticator.java Wed Oct 12 18:33:15 2011
@@ -36,11 +36,13 @@ import org.apache.http.HttpVersion;
import org.apache.http.auth.AUTH;
import org.apache.http.auth.AuthOption;
import org.apache.http.auth.AuthProtocolState;
+import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthSchemeRegistry;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.MalformedChallengeException;
+import org.apache.http.client.AuthCache;
import org.apache.http.client.AuthenticationStrategy;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
@@ -51,6 +53,7 @@ import org.apache.http.impl.auth.NTLMSch
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.junit.Assert;
import org.junit.Before;
@@ -61,17 +64,27 @@ public class TestHttpAuthenticator {
private AuthenticationStrategy authStrategy;
private AuthState authState;
+ private AuthScheme authScheme;
private HttpContext context;
+ private HttpHost host;
+ private HttpHost proxy;
private Credentials credentials;
private BasicCredentialsProvider credentialsProvider;
private AuthSchemeRegistry authSchemeRegistry;
+ private AuthCache authCache;
private HttpAuthenticator httpAuthenticator;
@Before
- public void setUp() {
+ public void setUp() throws Exception {
this.authStrategy = Mockito.mock(AuthenticationStrategy.class);
this.authState = new AuthState();
+ this.authScheme = new BasicScheme();
+ this.authScheme.processChallenge(new BasicHeader(AUTH.WWW_AUTH, "Basic realm=test"));
this.context = new BasicHttpContext();
+ this.host = new HttpHost("localhost", 80);
+ this.proxy = new HttpHost("localhost", 8888);
+ this.context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, this.host);
+ this.context.setAttribute(ExecutionContext.HTTP_PROXY_HOST, this.proxy);
this.credentials = Mockito.mock(Credentials.class);
this.credentialsProvider = new BasicCredentialsProvider();
this.credentialsProvider.setCredentials(AuthScope.ANY, this.credentials);
@@ -81,6 +94,8 @@ public class TestHttpAuthenticator {
this.authSchemeRegistry.register("digest", new DigestSchemeFactory());
this.authSchemeRegistry.register("ntlm", new NTLMSchemeFactory());
this.context.setAttribute(ClientContext.AUTHSCHEME_REGISTRY, this.authSchemeRegistry);
+ this.authCache = Mockito.mock(AuthCache.class);
+ this.context.setAttribute(ClientContext.AUTH_CACHE, this.authCache);
this.httpAuthenticator = new HttpAuthenticator();
}
@@ -88,53 +103,65 @@ public class TestHttpAuthenticator {
public void testAuthenticationRequested() throws Exception {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
Mockito.when(this.authStrategy.isAuthenticationRequested(
- Mockito.any(HttpResponse.class), Mockito.any(HttpContext.class))).thenReturn(Boolean.TRUE);
+ Mockito.any(HttpHost.class),
+ Mockito.any(HttpResponse.class),
+ Mockito.any(HttpContext.class))).thenReturn(Boolean.TRUE);
Assert.assertTrue(this.httpAuthenticator.isAuthenticationRequested(
- response, this.authStrategy, this.authState, this.context));
+ this.host, response, this.authStrategy, this.authState, this.context));
- Mockito.verify(this.authStrategy).isAuthenticationRequested(response, this.context);
+ Mockito.verify(this.authStrategy).isAuthenticationRequested(this.host, response, this.context);
}
@Test
public void testAuthenticationNotRequestedUnchallenged() throws Exception {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
Mockito.when(this.authStrategy.isAuthenticationRequested(
- Mockito.any(HttpResponse.class), Mockito.any(HttpContext.class))).thenReturn(Boolean.FALSE);
+ Mockito.any(HttpHost.class),
+ Mockito.any(HttpResponse.class),
+ Mockito.any(HttpContext.class))).thenReturn(Boolean.FALSE);
Assert.assertFalse(this.httpAuthenticator.isAuthenticationRequested(
- response, this.authStrategy, this.authState, this.context));
+ this.host, response, this.authStrategy, this.authState, this.context));
Assert.assertEquals(AuthProtocolState.UNCHALLENGED, this.authState.getState());
- Mockito.verify(this.authStrategy).isAuthenticationRequested(response, this.context);
+ Mockito.verify(this.authStrategy).isAuthenticationRequested(this.host, response, this.context);
}
@Test
public void testAuthenticationNotRequestedSuccess1() throws Exception {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
Mockito.when(this.authStrategy.isAuthenticationRequested(
- Mockito.any(HttpResponse.class), Mockito.any(HttpContext.class))).thenReturn(Boolean.FALSE);
+ Mockito.any(HttpHost.class),
+ Mockito.any(HttpResponse.class),
+ Mockito.any(HttpContext.class))).thenReturn(Boolean.FALSE);
+ this.authState.update(this.authScheme, this.credentials);
this.authState.setState(AuthProtocolState.CHALLENGED);
Assert.assertFalse(this.httpAuthenticator.isAuthenticationRequested(
- response, this.authStrategy, this.authState, this.context));
+ this.host, response, this.authStrategy, this.authState, this.context));
Assert.assertEquals(AuthProtocolState.SUCCESS, this.authState.getState());
- Mockito.verify(this.authStrategy).isAuthenticationRequested(response, this.context);
+ Mockito.verify(this.authStrategy).isAuthenticationRequested(this.host, response, this.context);
+ Mockito.verify(this.authStrategy).authSucceeded(this.host, this.authScheme, this.context);
}
@Test
public void testAuthenticationNotRequestedSuccess2() throws Exception {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
Mockito.when(this.authStrategy.isAuthenticationRequested(
- Mockito.any(HttpResponse.class), Mockito.any(HttpContext.class))).thenReturn(Boolean.FALSE);
+ Mockito.any(HttpHost.class),
+ Mockito.any(HttpResponse.class),
+ Mockito.any(HttpContext.class))).thenReturn(Boolean.FALSE);
+ this.authState.update(this.authScheme, this.credentials);
this.authState.setState(AuthProtocolState.HANDSHAKE);
Assert.assertFalse(this.httpAuthenticator.isAuthenticationRequested(
- response, this.authStrategy, this.authState, this.context));
+ this.host, response, this.authStrategy, this.authState, this.context));
Assert.assertEquals(AuthProtocolState.SUCCESS, this.authState.getState());
- Mockito.verify(this.authStrategy).isAuthenticationRequested(response, this.context);
+ Mockito.verify(this.authStrategy).isAuthenticationRequested(this.host, response, this.context);
+ Mockito.verify(this.authStrategy).authSucceeded(this.host, this.authScheme, this.context);
}
@Test
@@ -168,6 +195,7 @@ public class TestHttpAuthenticator {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
Mockito.when(this.authStrategy.getChallenges(
+ Mockito.any(HttpHost.class),
Mockito.any(HttpResponse.class),
Mockito.any(HttpContext.class))).thenReturn(new HashMap<String, Header>());
@@ -228,6 +256,7 @@ public class TestHttpAuthenticator {
response.addHeader(new BasicHeader(AUTH.WWW_AUTH, "Digest realm=\"realm1\", nonce=\"1234\""));
this.authState.setState(AuthProtocolState.CHALLENGED);
+ this.authState.update(this.authScheme, this.credentials);
TargetAuthenticationStrategy authStrategy = new TargetAuthenticationStrategy();
@@ -235,6 +264,8 @@ public class TestHttpAuthenticator {
response, authStrategy, this.authState, this.context));
Assert.assertEquals(AuthProtocolState.FAILURE, this.authState.getState());
+
+ Mockito.verify(this.authCache).remove(host);
}
@Test
@@ -271,6 +302,7 @@ public class TestHttpAuthenticator {
Assert.assertTrue(this.httpAuthenticator.authenticate(host,
response, authStrategy, this.authState, this.context));
+
Assert.assertEquals(AuthProtocolState.HANDSHAKE, this.authState.getState());
}
@@ -306,7 +338,9 @@ public class TestHttpAuthenticator {
this.authState.setState(AuthProtocolState.CHALLENGED);
Mockito.doThrow(new MalformedChallengeException()).when(this.authStrategy).getChallenges(
- Mockito.any(HttpResponse.class), Mockito.any(HttpContext.class));
+ Mockito.any(HttpHost.class),
+ Mockito.any(HttpResponse.class),
+ Mockito.any(HttpContext.class));
Assert.assertFalse(this.httpAuthenticator.authenticate(host,
response, this.authStrategy, this.authState, this.context));