You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ol...@apache.org on 2005/09/19 22:37:57 UTC

svn commit: r290260 - in /jakarta/commons/proper/httpclient/trunk/src: java/org/apache/commons/httpclient/ java/org/apache/commons/httpclient/auth/ test/org/apache/commons/httpclient/auth/

Author: olegk
Date: Mon Sep 19 13:37:48 2005
New Revision: 290260

URL: http://svn.apache.org/viewcvs?rev=290260&view=rev
Log:
PR #36339 (Request is retried if preemptive authentication fails)

Contributed by Oleg Kalnichevski
Reviewed by Michael Becke

Modified:
    jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
    jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthChallengeProcessor.java
    jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java
    jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java

Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java?rev=290260&r1=290259&r2=290260&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java Mon Sep 19 13:37:48 2005
@@ -159,8 +159,10 @@
                     {
                         LOG.debug("Preemptively sending default basic credentials");
                         method.getHostAuthState().setPreemptive();
+                        method.getHostAuthState().setAuthAttempted(true);
                         if (this.conn.isProxied()) {
                             method.getProxyAuthState().setPreemptive();
+                            method.getProxyAuthState().setAuthAttempted(true);
                         }
                     }
                 }
@@ -665,10 +667,6 @@
         throws MalformedChallengeException, AuthenticationException  
     {
         AuthState authstate = method.getHostAuthState();
-        if (authstate.isPreemptive()) {
-            authstate.invalidate();
-            authstate.setAuthRequested(true);
-        }
         Map challenges = AuthChallengeParser.parseChallenges(
             method.getResponseHeaders(WWW_AUTH_CHALLENGE));
         if (challenges.isEmpty()) {
@@ -733,10 +731,6 @@
         throws MalformedChallengeException, AuthenticationException
     {  
         AuthState authstate = method.getProxyAuthState();
-        if (authstate.isPreemptive()) {
-            authstate.invalidate();
-            authstate.setAuthRequested(true);
-        }
         Map proxyChallenges = AuthChallengeParser.parseChallenges(
             method.getResponseHeaders(PROXY_AUTH_CHALLENGE));
         if (proxyChallenges.isEmpty()) {

Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthChallengeProcessor.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthChallengeProcessor.java?rev=290260&r1=290259&r2=290260&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthChallengeProcessor.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthChallengeProcessor.java Mon Sep 19 13:37:48 2005
@@ -143,7 +143,8 @@
         if (challenges == null) {
             throw new IllegalArgumentException("Challenge map may not be null"); 
         }
-        if (state.getAuthScheme() == null) {
+        
+        if (state.isPreemptive() || state.getAuthScheme() == null) {
             // Authentication not attempted before
             state.setAuthScheme(selectAuthScheme(challenges));
         }

Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java?rev=290260&r1=290259&r2=290260&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java Mon Sep 19 13:37:48 2005
@@ -38,6 +38,8 @@
  */
 public class AuthState {
 
+    public static final String PREEMPTIVE_AUTH_SCHEME = "basic";
+    
     /** Actual authentication scheme */
     private AuthScheme authScheme = null;
 
@@ -116,7 +118,7 @@
             if (this.authScheme != null) {
                 throw new IllegalStateException("Authentication state already initialized");
             }
-            this.authScheme = AuthPolicy.getAuthScheme("basic");
+            this.authScheme = AuthPolicy.getAuthScheme(PREEMPTIVE_AUTH_SCHEME);
             this.preemptive = true;
         }
     }
@@ -137,8 +139,15 @@
      * @param authScheme the {@link AuthScheme authentication scheme}
      */
     public void setAuthScheme(final AuthScheme authScheme) {
+        if (authScheme == null) {
+            invalidate();
+            return;
+        }
+        if (this.preemptive && !(this.authScheme.getClass().isInstance(authScheme))) {
+            this.preemptive = false;
+            this.authAttempted = false;
+        }
         this.authScheme = authScheme;
-        this.preemptive = false;
     }
 
     /**

Modified: jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java?rev=290260&r1=290259&r2=290260&view=diff
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java Mon Sep 19 13:37:48 2005
@@ -410,7 +410,7 @@
         assertNotNull(authstate.getAuthScheme());
         assertTrue(authstate.getAuthScheme() instanceof BasicScheme);
         assertNotNull(authstate.getRealm());
-        assertFalse(authstate.isPreemptive());
+        assertTrue(authstate.isPreemptive());
     }
 
     public void testCustomAuthorizationHeader() throws Exception {
@@ -551,4 +551,36 @@
         assertEquals("test", authstate.getRealm());
     }
 
+    public void testPreemptiveAuthorizationFailure() throws Exception {
+        UsernamePasswordCredentials creds = 
+            new UsernamePasswordCredentials("testuser", "testpass");
+        UsernamePasswordCredentials wrongcreds = 
+            new UsernamePasswordCredentials("testuser", "garbage");
+        
+        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
+        handlerchain.appendHandler(new AuthRequestHandler(creds));
+        handlerchain.appendHandler(new HttpServiceHandler(new FeedbackService()));
+
+        HttpState state = new HttpState();
+        state.setCredentials(AuthScope.ANY, wrongcreds);
+        this.client.setState(state);
+        this.client.getParams().setAuthenticationPreemptive(true);
+        
+        this.server.setRequestHandler(handlerchain);
+
+        GetMethod httpget = new GetMethod("/test/");
+        try {
+            this.client.executeMethod(httpget);
+        } finally {
+            httpget.releaseConnection();
+        }
+        assertNotNull(httpget.getStatusLine());
+        assertEquals(HttpStatus.SC_UNAUTHORIZED, httpget.getStatusLine().getStatusCode());
+        AuthState authstate = httpget.getHostAuthState();
+        assertNotNull(authstate.getAuthScheme());
+        assertTrue(authstate.getAuthScheme() instanceof BasicScheme);
+        assertEquals("test", authstate.getRealm());
+        assertTrue(authstate.isPreemptive());
+    }
+    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org