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 2010/06/12 00:10:52 UTC

svn commit: r953890 - in /httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http: impl/client/TestClientAuthentication.java localserver/BasicAuthTokenExtractor.java localserver/LocalTestServer.java localserver/RequestBasicAuth.java

Author: olegk
Date: Fri Jun 11 22:10:52 2010
New Revision: 953890

URL: http://svn.apache.org/viewvc?rev=953890&view=rev
Log:
HTTPCLIENT-951: Test cases
Contributed by Thierry Guérin <thi.guerin at laposte.net>


Added:
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java
Modified:
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestClientAuthentication.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/LocalTestServer.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java

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=953890&r1=953889&r2=953890&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 Fri Jun 11 22:10:52 2010
@@ -41,16 +41,20 @@ import org.apache.http.client.Credential
 import org.apache.http.client.NonRepeatableRequestException;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
 import org.apache.http.entity.InputStreamEntity;
 import org.apache.http.entity.StringEntity;
+import org.apache.http.localserver.BasicAuthTokenExtractor;
 import org.apache.http.localserver.BasicServerTestBase;
 import org.apache.http.localserver.LocalTestServer;
 import org.apache.http.localserver.RequestBasicAuth;
 import org.apache.http.localserver.ResponseBasicUnauthorized;
+import org.apache.http.params.CoreProtocolPNames;
 import org.apache.http.protocol.BasicHttpContext;
 import org.apache.http.protocol.BasicHttpProcessor;
 import org.apache.http.protocol.HTTP;
 import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpExpectationVerifier;
 import org.apache.http.protocol.HttpRequestHandler;
 import org.apache.http.protocol.ResponseConnControl;
 import org.apache.http.protocol.ResponseContent;
@@ -58,6 +62,7 @@ import org.apache.http.protocol.Response
 import org.apache.http.protocol.ResponseServer;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -96,6 +101,29 @@ public class TestClientAuthentication ex
 
     }
 
+    static class AuthExpectationVerifier implements HttpExpectationVerifier {
+
+        private final BasicAuthTokenExtractor authTokenExtractor;
+        
+        public AuthExpectationVerifier() {
+            super();
+            this.authTokenExtractor = new BasicAuthTokenExtractor();
+        }
+        
+        public void verify(
+                final HttpRequest request,
+                final HttpResponse response,
+                final HttpContext context) throws HttpException {
+            String creds = this.authTokenExtractor.extract(request);
+            if (creds == null || !creds.equals("test:test")) {
+                response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
+            } else {
+                response.setStatusCode(HttpStatus.SC_CONTINUE);
+            }
+        }
+
+    }
+
     static class TestCredentialsProvider implements CredentialsProvider {
 
         private final Credentials creds;
@@ -191,6 +219,68 @@ public class TestClientAuthentication ex
         Assert.assertEquals("test realm", authscope.getRealm());
     }
 
+    @Test @Ignore
+    public void testBasicAuthenticationSuccessOnNonRepeatablePutExpectContinue() throws Exception {
+        BasicHttpProcessor httpproc = new BasicHttpProcessor();
+        httpproc.addInterceptor(new ResponseDate());
+        httpproc.addInterceptor(new ResponseServer());
+        httpproc.addInterceptor(new ResponseContent());
+        httpproc.addInterceptor(new ResponseConnControl());
+        httpproc.addInterceptor(new RequestBasicAuth());
+        httpproc.addInterceptor(new ResponseBasicUnauthorized());
+        localServer = new LocalTestServer(
+                httpproc, null, null, new AuthExpectationVerifier(), null, null);
+        localServer.register("*", new AuthHandler());
+        localServer.start();
+
+        TestCredentialsProvider credsProvider = new TestCredentialsProvider(
+                new UsernamePasswordCredentials("test", "test"));
+
+        DefaultHttpClient httpclient = new DefaultHttpClient();
+        httpclient.setCredentialsProvider(credsProvider);
+
+        HttpPut httpput = new HttpPut("/");
+        httpput.setEntity(new InputStreamEntity(
+                new ByteArrayInputStream(
+                        new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
+                        -1));
+        httpput.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
+
+        HttpResponse response = httpclient.execute(getServerHttp(), httpput);
+        HttpEntity entity = response.getEntity();
+        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        Assert.assertNotNull(entity);
+    }
+
+    @Test(expected=ClientProtocolException.class)
+    public void testBasicAuthenticationFailureOnNonRepeatablePutDontExpectContinue() throws Exception {
+        localServer.register("*", new AuthHandler());
+        localServer.start();
+
+        TestCredentialsProvider credsProvider = new TestCredentialsProvider(
+                new UsernamePasswordCredentials("test", "test"));
+
+        DefaultHttpClient httpclient = new DefaultHttpClient();
+        httpclient.setCredentialsProvider(credsProvider);
+
+        HttpPut httpput = new HttpPut("/");
+        httpput.setEntity(new InputStreamEntity(
+                new ByteArrayInputStream(
+                        new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
+                        -1));
+        httpput.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
+
+        try {
+            httpclient.execute(getServerHttp(), httpput);
+            Assert.fail("ClientProtocolException should have been thrown");
+        } catch (ClientProtocolException ex) {
+            Throwable cause = ex.getCause();
+            Assert.assertNotNull(cause);
+            Assert.assertTrue(cause instanceof NonRepeatableRequestException);
+            throw ex;
+        }
+    }
+
     @Test
     public void testBasicAuthenticationSuccessOnRepeatablePost() throws Exception {
         localServer.register("*", new AuthHandler());

Added: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java?rev=953890&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java (added)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java Fri Jun 11 22:10:52 2010
@@ -0,0 +1,73 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.localserver;
+
+import org.apache.commons.codec.BinaryDecoder;
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.Header;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.ProtocolException;
+import org.apache.http.auth.AUTH;
+import org.apache.http.util.EncodingUtils;
+
+public class BasicAuthTokenExtractor {
+
+    public String extract(final HttpRequest request) throws HttpException {
+        String auth = null;
+
+        Header h = request.getFirstHeader(AUTH.WWW_AUTH_RESP);
+        if (h != null) {
+            String s = h.getValue();
+            if (s != null) {
+                auth = s.trim();
+            }
+        }
+
+        if (auth != null) {
+            int i = auth.indexOf(' ');
+            if (i == -1) {
+                throw new ProtocolException("Invalid Authorization header: " + auth);
+            }
+            String authscheme = auth.substring(0, i);
+            if (authscheme.equalsIgnoreCase("basic")) {
+                String s = auth.substring(i + 1).trim();
+                try {
+                    byte[] credsRaw = EncodingUtils.getAsciiBytes(s);
+                    BinaryDecoder codec = new Base64();
+                    auth = EncodingUtils.getAsciiString(codec.decode(credsRaw));
+                } catch (DecoderException ex) {
+                    throw new ProtocolException("Malformed BASIC credentials");
+                }
+            }
+        }
+        return auth;
+    }
+
+}

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/LocalTestServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/LocalTestServer.java?rev=953890&r1=953889&r2=953890&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/LocalTestServer.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/LocalTestServer.java Fri Jun 11 22:10:52 2010
@@ -54,6 +54,7 @@ import org.apache.http.params.SyncBasicH
 import org.apache.http.protocol.BasicHttpProcessor;
 import org.apache.http.protocol.HttpContext;
 import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.HttpExpectationVerifier;
 import org.apache.http.protocol.HttpProcessor;
 import org.apache.http.protocol.HttpRequestHandler;
 import org.apache.http.protocol.HttpRequestHandlerRegistry;
@@ -119,6 +120,7 @@ public class LocalTestServer {
             final BasicHttpProcessor proc,
             final ConnectionReuseStrategy reuseStrat,
             final HttpResponseFactory responseFactory,
+            final HttpExpectationVerifier expectationVerifier,
             final HttpParams params,
             final SSLContext sslcontext) {
         super();
@@ -129,7 +131,7 @@ public class LocalTestServer {
             reuseStrat != null ? reuseStrat: newConnectionReuseStrategy(),
             responseFactory != null ? responseFactory: newHttpResponseFactory(),
             handlerRegistry,
-            null,
+            expectationVerifier,
             params != null ? params : newDefaultParams());
         this.sslcontext = sslcontext;
     }
@@ -140,7 +142,7 @@ public class LocalTestServer {
      * @param sslcontext SSL context
      */
     public LocalTestServer(final SSLContext sslcontext) {
-        this(null, null, null, null, sslcontext);
+        this(null, null, null, null, null, sslcontext);
     }
 
     /**
@@ -156,7 +158,7 @@ public class LocalTestServer {
     public LocalTestServer(
             BasicHttpProcessor proc,
             HttpParams params) {
-        this(proc, null, null, params, null);
+        this(proc, null, null, null, params, null);
     }
 
     /**

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java?rev=953890&r1=953889&r2=953890&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java Fri Jun 11 22:10:52 2010
@@ -29,54 +29,24 @@ package org.apache.http.localserver;
 
 import java.io.IOException;
 
-import org.apache.commons.codec.BinaryDecoder;
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.http.Header;
 import org.apache.http.HttpException;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.ProtocolException;
-import org.apache.http.auth.AUTH;
-import org.apache.http.protocol.HTTP;
 import org.apache.http.protocol.HttpContext;
 
 public class RequestBasicAuth implements HttpRequestInterceptor {
 
+    private final BasicAuthTokenExtractor authTokenExtractor;
+    
+    public RequestBasicAuth() {
+        super();
+        this.authTokenExtractor = new BasicAuthTokenExtractor();
+    }
+    
     public void process(
             final HttpRequest request,
             final HttpContext context) throws HttpException, IOException {
-
-        context.removeAttribute("creds");
-
-        String auth = null;
-
-        Header h = request.getFirstHeader(AUTH.WWW_AUTH_RESP);
-        if (h != null) {
-            String s = h.getValue();
-            if (s != null) {
-                auth = s.trim();
-            }
-        }
-
-        if (auth != null) {
-            int i = auth.indexOf(' ');
-            if (i == -1) {
-                throw new ProtocolException("Invalid Authorization header: " + auth);
-            }
-            String authscheme = auth.substring(0, i);
-            if (authscheme.equalsIgnoreCase("basic")) {
-                String s = auth.substring(i + 1).trim();
-                byte[] credsRaw = s.getBytes(HTTP.ASCII);
-                BinaryDecoder codec = new Base64();
-                try {
-                    String creds = new String(codec.decode(credsRaw), HTTP.ASCII);
-                    context.setAttribute("creds", creds);
-                } catch (DecoderException ex) {
-                    throw new ProtocolException("Malformed BASIC credentials");
-                }
-            }
-        }
+        context.setAttribute("creds", this.authTokenExtractor.extract(request));
     }
 
 }