olegk       2004/11/20 09:56:40

  Modified:    httpclient/src/test/org/apache/commons/httpclient
                        EchoService.java TestNoHost.java TestProxy.java
                        TestWebapp.java
               httpclient/src/test/org/apache/commons/httpclient/auth
                        TestBasicAuth.java
               httpclient/src/test/org/apache/commons/httpclient/server
                        SimpleConnManager.java
  Added:       httpclient/src/test/org/apache/commons/httpclient
                        FeedbackService.java
               httpclient/src/test/org/apache/commons/httpclient/server
                        AuthRequestHandler.java
  Log:
  * Proxy test cases ported to the SimpleHttpServer/SimpleProxy framework and 
no longer require the test webapp
  * Basic authentication test cases refactored
  
  Contributed by Oleg Kalnichevski
  
  Revision  Changes    Path
  1.2       +4 -4      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/EchoService.java
  
  Index: EchoService.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/EchoService.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- EchoService.java  6 Oct 2004 03:39:58 -0000       1.1
  +++ EchoService.java  20 Nov 2004 17:56:39 -0000      1.2
  @@ -38,7 +38,7 @@
   /**
    * A service that echos the request body.
    */
  -class EchoService implements HttpService {
  +public class EchoService implements HttpService {
   
       public EchoService() {
           super();
  
  
  
  1.48      +7 -5      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestNoHost.java
  
  Index: TestNoHost.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestNoHost.java,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- TestNoHost.java   20 Nov 2004 11:16:48 -0000      1.47
  +++ TestNoHost.java   20 Nov 2004 17:56:39 -0000      1.48
  @@ -97,8 +97,10 @@
           suite.addTest(TestPostMethod.suite());
           suite.addTest(TestPartsNoHost.suite());
           suite.addTest(TestMultipartPost.suite());
  -        
  +        // Non compliant behaviour
           suite.addTest(TestNoncompliant.suite());
  +        // Proxy
  +        suite.addTest(TestProxy.suite());
           return suite;
       }
   
  
  
  
  1.8       +90 -66    
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestProxy.java
  
  Index: TestProxy.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestProxy.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TestProxy.java    13 Nov 2004 12:21:28 -0000      1.7
  +++ TestProxy.java    20 Nov 2004 17:56:39 -0000      1.8
  @@ -32,6 +32,10 @@
   import org.apache.commons.httpclient.methods.PostMethod;
   import org.apache.commons.httpclient.methods.StringRequestEntity;
   import org.apache.commons.httpclient.protocol.Protocol;
  +import org.apache.commons.httpclient.server.AuthRequestHandler;
  +import org.apache.commons.httpclient.server.HttpRequestHandlerChain;
  +import org.apache.commons.httpclient.server.HttpServiceHandler;
  +import org.apache.commons.httpclient.server.SimpleHttpServer;
   import org.apache.commons.httpclient.server.SimpleProxy;
   
   import junit.framework.Test;
  @@ -45,8 +49,9 @@
    */
   public class TestProxy extends TestCase {
   
  -    private static String TARGET_HOST = null;
  -    private static int TARGET_PORT = -1;
  +    private SimpleProxy proxy = null;
  +    private SimpleHttpServer httpserver = null;
  +    private HttpClient httpclient = null;
   
       public TestProxy(String testName) {
           super(testName);
  @@ -58,75 +63,94 @@
   
       protected void setUp() throws Exception {
           super.setUp();
  -        TARGET_HOST = System.getProperty("httpclient.test.localHost", 
"localhost");
  -        TARGET_PORT = 
Integer.parseInt(System.getProperty("httpclient.test.localPort", "8080")); 
  +        this.proxy = new SimpleProxy();
  +        this.httpserver = new SimpleHttpServer();
  +        this.httpclient = new HttpClient();
  +        this.httpclient.getHostConfiguration().setHost(
  +                this.httpserver.getLocalAddress(), 
  +                this.httpserver.getLocalPort(),
  +                Protocol.getProtocol("http"));
  +        this.httpclient.getHostConfiguration().setProxy(
  +                this.proxy.getLocalAddress(), 
  +                this.proxy.getLocalPort());                
  +    }
  +
  +    protected void tearDown() throws Exception {
  +        this.httpclient = null;
  +        this.proxy.destroy();
  +        this.proxy = null;
  +        this.httpserver.destroy();
  +        this.httpserver = null;
  +        super.tearDown();
       }
  -
  +    
       public void testSimpleGet() throws Exception {
  -        SimpleProxy proxy = new SimpleProxy();
  -
  -        HttpClient client = new HttpClient();
  -        HostConfiguration hc = new HostConfiguration();
  -        hc.setHost(TARGET_HOST, TARGET_PORT, Protocol.getProtocol("http"));
  -        hc.setProxy(proxy.getLocalAddress(), proxy.getLocalPort());
  -        client.setHostConfiguration(hc);
  -
  +        this.httpserver.setHttpService(new FeedbackService());
           GetMethod get = new GetMethod("/");
  -        client.executeMethod(get);
  -        assertEquals(200, get.getStatusCode());
  -        get.releaseConnection();
  -    }
  -
  -    public void testAuthGet() throws Exception {
  -        Credentials creds = new UsernamePasswordCredentials("user", 
"password");
  -        SimpleProxy proxy = new SimpleProxy();
  -        proxy.requireCredentials(creds);
  -
  -        HttpClient client = new HttpClient();
  -        HostConfiguration hc = new HostConfiguration();
  -        hc.setHost(TARGET_HOST, TARGET_PORT, Protocol.getProtocol("http"));
  -        hc.setProxy(proxy.getLocalAddress(), proxy.getLocalPort());
  -        client.setHostConfiguration(hc);
  -        client.getState().setProxyCredentials(AuthScope.ANY, creds);
  -
  +        try {
  +            this.httpclient.executeMethod(get);
  +            assertEquals(200, get.getStatusCode());
  +        } finally {
  +            get.releaseConnection();
  +        }
  +    }
  +
  +    public void testAuthHostGet() throws Exception {
  +
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        this.httpclient.getState().setCredentials(AuthScope.ANY, creds);
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +        
  +        this.httpserver.setRequestHandler(handlerchain);
  +        
           GetMethod get = new GetMethod("/");
  -        client.executeMethod(get);
  -        assertEquals(200, get.getStatusCode());
  -        get.releaseConnection();
  -    }
  -
  -        public void testSimplePost() throws Exception {
  -        SimpleProxy proxy = new SimpleProxy();
  -
  -        HttpClient client = new HttpClient();
  -        HostConfiguration hc = new HostConfiguration();
  -        hc.setHost(TARGET_HOST, TARGET_PORT, Protocol.getProtocol("http"));
  -        hc.setProxy(proxy.getLocalAddress(), proxy.getLocalPort());
  -        client.setHostConfiguration(hc);
  -
  -        PostMethod post = new PostMethod("/httpclienttest/body");
  +        try {
  +            this.httpclient.executeMethod(get);
  +            assertEquals(200, get.getStatusCode());
  +        } finally {
  +            get.releaseConnection();
  +        }
  +    }
  +    
  +    public void testSimplePost() throws Exception {
  +        this.httpserver.setHttpService(new FeedbackService());
  +        PostMethod post = new PostMethod("/");
           post.setRequestEntity(new StringRequestEntity("Like tons of stuff"));
  -        client.executeMethod(post);
  -        assertEquals(200, post.getStatusCode());
  -        post.releaseConnection();
  +        try {
  +            this.httpclient.executeMethod(post);
  +            assertEquals(200, post.getStatusCode());
  +            assertNotNull(post.getResponseBodyAsString());
  +        } finally {
  +            post.releaseConnection();
  +        }
       }
   
       public void testAuthPost() throws Exception {
  -        Credentials creds = new UsernamePasswordCredentials("user", 
"password");
  -        SimpleProxy proxy = new SimpleProxy();
  -        proxy.requireCredentials(creds);
  -
  -        HttpClient client = new HttpClient();
  -        HostConfiguration hc = new HostConfiguration();
  -        hc.setHost(TARGET_HOST, TARGET_PORT, Protocol.getProtocol("http"));
  -        hc.setProxy(proxy.getLocalAddress(), proxy.getLocalPort());
  -        client.setHostConfiguration(hc);
  -        client.getState().setProxyCredentials(AuthScope.ANY, creds);
  -
  -        PostMethod post = new PostMethod("/httpclienttest/body");
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        this.httpclient.getState().setCredentials(AuthScope.ANY, creds);
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +        
  +        this.httpserver.setRequestHandler(handlerchain);
  +        
  +        PostMethod post = new PostMethod("/");
           post.setRequestEntity(new StringRequestEntity("Like tons of stuff"));
  -        client.executeMethod(post);
  -        assertEquals(200, post.getStatusCode());
  -        post.releaseConnection();
  +        try {
  +            this.httpclient.executeMethod(post);
  +            assertEquals(200, post.getStatusCode());
  +            assertNotNull(post.getResponseBodyAsString());
  +        } finally {
  +            post.releaseConnection();
  +        }
       }
  +
   }
  
  
  
  1.15      +4 -5      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestWebapp.java
  
  Index: TestWebapp.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestWebapp.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- TestWebapp.java   14 Nov 2004 23:38:00 -0000      1.14
  +++ TestWebapp.java   20 Nov 2004 17:56:39 -0000      1.15
  @@ -65,7 +65,6 @@
           suite.addTest(TestWebappParameters.suite());
           suite.addTest(TestWebappHeaders.suite());
           suite.addTest(TestWebappPostMethod.suite());
  -        suite.addTest(TestProxy.suite());
           return suite;
       }
   
  
  
  
  1.1                  
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/FeedbackService.java
  
  Index: FeedbackService.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/FeedbackService.java,v
 1.1 2004/11/20 17:56:39 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2004/11/20 17:56:39 $
   *
   * ====================================================================
   *
   *  Copyright 2002-2004 The Apache Software Foundation
   *
   *  Licensed 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.commons.httpclient;
  
  import java.io.IOException;
  import java.io.StringWriter;
  
  import org.apache.commons.httpclient.server.HttpService;
  import org.apache.commons.httpclient.server.RequestLine;
  import org.apache.commons.httpclient.server.SimpleRequest;
  import org.apache.commons.httpclient.server.SimpleResponse;
  
  
  public class FeedbackService implements HttpService {
  
      public FeedbackService() {
          super();
      }
  
      public boolean process(final SimpleRequest request, final SimpleResponse 
response)
          throws IOException
      {
          RequestLine requestline = request.getRequestLine();
          HttpVersion httpversion = requestline.getHttpVersion();
  
          StringWriter buffer = new StringWriter(100);
          buffer.write("Method type: ");
          buffer.write(requestline.getMethod());
          buffer.write("\r\n");
          buffer.write("Requested resource: ");
          buffer.write(requestline.getUri());
          buffer.write("\r\n");
          buffer.write("Protocol version: ");
          buffer.write(httpversion.toString());
          buffer.write("\r\n");
          
          String requestbody = request.getBodyString();
          if (requestbody != null && !requestbody.equals("")) {
              buffer.write("\r\n");
              buffer.write("Request body: ");
              buffer.write(requestbody);
              buffer.write("\r\n");
          }
          
          response.setStatusLine(httpversion, HttpStatus.SC_OK);
          response.setBodyString(buffer.toString());
          return true;
      }
  }
  
  
  
  1.9       +158 -216  
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java
  
  Index: TestBasicAuth.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/auth/TestBasicAuth.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TestBasicAuth.java        9 Nov 2004 04:25:05 -0000       1.8
  +++ TestBasicAuth.java        20 Nov 2004 17:56:40 -0000      1.9
  @@ -24,8 +24,6 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * [Additional notices, if required by prior licensing conditions]
  - *
    */
   
   package org.apache.commons.httpclient.auth;
  @@ -36,11 +34,12 @@
   import junit.framework.TestSuite;
   
   import org.apache.commons.codec.binary.Base64;
  +import org.apache.commons.httpclient.EchoService;
  +import org.apache.commons.httpclient.FeedbackService;
   import org.apache.commons.httpclient.Header;
   import org.apache.commons.httpclient.HttpClientTestBase;
   import org.apache.commons.httpclient.HttpState;
   import org.apache.commons.httpclient.HttpStatus;
  -import org.apache.commons.httpclient.HttpVersion;
   import org.apache.commons.httpclient.ProxyTestDecorator;
   import org.apache.commons.httpclient.UsernamePasswordCredentials;
   import org.apache.commons.httpclient.methods.GetMethod;
  @@ -48,10 +47,9 @@
   import org.apache.commons.httpclient.methods.PostMethod;
   import org.apache.commons.httpclient.methods.PutMethod;
   import org.apache.commons.httpclient.methods.StringRequestEntity;
  -import org.apache.commons.httpclient.server.HttpService;
  -import org.apache.commons.httpclient.server.RequestLine;
  -import org.apache.commons.httpclient.server.SimpleRequest;
  -import org.apache.commons.httpclient.server.SimpleResponse;
  +import org.apache.commons.httpclient.server.AuthRequestHandler;
  +import org.apache.commons.httpclient.server.HttpRequestHandlerChain;
  +import org.apache.commons.httpclient.server.HttpServiceHandler;
   import org.apache.commons.httpclient.util.EncodingUtil;
   
   /**
  @@ -82,152 +80,16 @@
           return suite;
       }
   
  -    private class BasicAuthService implements HttpService {
  -
  -        public BasicAuthService() {
  -            super();
  -        }
  -
  -        public boolean process(final SimpleRequest request, final 
SimpleResponse response)
  -            throws IOException
  -        {
  -            Header challenge = new Header("WWW-Authenticate", "Basic 
realm=\"test\"");
  -            RequestLine requestLine = request.getRequestLine();
  -             HttpVersion ver = requestLine.getHttpVersion();
  -            Header auth = request.getFirstHeader("Authorization");
  -            if (auth == null) { 
  -                response.setStatusLine(ver, HttpStatus.SC_UNAUTHORIZED);
  -                response.addHeader(challenge);
  -                response.setBodyString("Authorization required");
  -                return true;
  -            }
  -            boolean pass = false;
  -            String s = auth.getValue();
  -            int i = s.indexOf(" ");
  -            if (i != -1) {
  -                String authtype = s.substring(0, i);
  -                if ("BASIC".equalsIgnoreCase(authtype)) {
  -                    String creds = s.substring(i + 1, s.length());
  -                    creds = EncodingUtil.getAsciiString(
  -                        Base64.decodeBase64(
  -                            EncodingUtil.getAsciiBytes(creds)));
  -                    if (creds.equals("test:test")) {
  -                        pass = true;    
  -                    }
  -                }
  -            }
  -            if (!pass) {
  -                response.setStatusLine(ver, HttpStatus.SC_FORBIDDEN);
  -                response.addHeader(challenge);
  -                response.setBodyString("Access forbidden");
  -                return true;
  -            }
  -            response.setStatusLine(ver, HttpStatus.SC_OK);
  -            String requestBody = request.getBodyString();
  -            if (requestBody != null && requestBody.length() > 0) {
  -                // echo the body if there is one
  -                response.setBodyString(requestBody);
  -            } else {
  -                response.setBodyString("Authorization successful");
  -            }
  -            return true;
  -        }
  -    }
  -    
  -    private class BasicAuthService2 implements HttpService {
  -
  -        public BasicAuthService2() {
  -            super();
  -        }
  -
  -        public boolean process(final SimpleRequest request, final 
SimpleResponse response)
  -            throws IOException
  -        {
  -            Header challenge = new Header("WWW-Authenticate", "Basic 
realm=\"test2\"");
  -            RequestLine requestLine = request.getRequestLine();
  -             HttpVersion ver = requestLine.getHttpVersion();
  -            Header auth = request.getFirstHeader("Authorization");
  -            if (auth == null) { 
  -                response.setStatusLine(ver, HttpStatus.SC_UNAUTHORIZED);
  -                response.addHeader(challenge);
  -                response.setBodyString("Authorization required");
  -                return true;
  -            }
  -            boolean pass = false;
  -            String s = auth.getValue();
  -            int i = s.indexOf(" ");
  -            if (i != -1) {
  -                String authtype = s.substring(0, i);
  -                if ("BASIC".equalsIgnoreCase(authtype)) {
  -                    String creds = s.substring(i + 1, s.length());
  -                    creds = EncodingUtil.getAsciiString(
  -                        Base64.decodeBase64(
  -                            EncodingUtil.getAsciiBytes(creds)));
  -                    if (creds.equals("test2:test2")) {
  -                        pass = true;    
  -                    }
  -                }
  -            }
  -            if (!pass) {
  -                response.setStatusLine(ver, HttpStatus.SC_FORBIDDEN);
  -                response.addHeader(challenge);
  -                response.setBodyString("Access forbidden");
  -                return true;
  -            }
  -            response.setStatusLine(ver, HttpStatus.SC_OK);
  -            response.setBodyString("Authorization successful");
  -            return true;
  -        }
  -    }
  -
  -    private class BasicAuthService3 implements HttpService {
  -
  -        public BasicAuthService3() {
  -            super();
  -        }
  -
  -        public boolean process(final SimpleRequest request, final 
SimpleResponse response)
  -            throws IOException
  -        {
  -            Header challenge = new Header("WwW-AuThEnTiCaTe", "bAsIc 
ReAlM=\"test\"");
  -            RequestLine requestLine = request.getRequestLine();
  -             HttpVersion ver = requestLine.getHttpVersion();
  -            Header auth = request.getFirstHeader("Authorization");
  -            if (auth == null) { 
  -                response.setStatusLine(ver, HttpStatus.SC_UNAUTHORIZED);
  -                response.addHeader(challenge);
  -                response.setBodyString("Authorization required");
  -                return true;
  -            }
  -            boolean pass = false;
  -            String s = auth.getValue();
  -            int i = s.indexOf(" ");
  -            if (i != -1) {
  -                String authtype = s.substring(0, i);
  -                if ("BASIC".equalsIgnoreCase(authtype)) {
  -                    String creds = s.substring(i + 1, s.length());
  -                    creds = EncodingUtil.getAsciiString(
  -                        Base64.decodeBase64(
  -                            EncodingUtil.getAsciiBytes(creds)));
  -                    if (creds.equals("test:test")) {
  -                        pass = true;    
  -                    }
  -                }
  -            }
  -            if (!pass) {
  -                response.setStatusLine(ver, HttpStatus.SC_FORBIDDEN);
  -                response.addHeader(challenge);
  -                response.setBodyString("Access forbidden");
  -                return true;
  -            }
  -            response.setStatusLine(ver, HttpStatus.SC_OK);
  -            response.setBodyString("Authorization successful");
  -            return true;
  -        }
  -    }
  -
       public void testBasicAuthenticationWithNoCreds() throws IOException {
  -        this.server.setHttpService(new BasicAuthService());
  +
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +        
  +        this.server.setRequestHandler(handlerchain);
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -243,7 +105,15 @@
       }
   
       public void testBasicAuthenticationWithNoCredsRetry() throws IOException 
{
  -        this.server.setHttpService(new BasicAuthService());
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +        
  +        this.server.setRequestHandler(handlerchain);
  +
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -259,7 +129,7 @@
           // now try with credentials
           httpget = new GetMethod("/test/");
           try {
  -            this.client.getState().setCredentials(AuthScope.ANY, new 
UsernamePasswordCredentials("test", "test"));
  +            this.client.getState().setCredentials(AuthScope.ANY, creds);
               this.client.executeMethod(httpget);
               assertNotNull(httpget.getStatusLine());
               assertEquals(HttpStatus.SC_OK, 
httpget.getStatusLine().getStatusCode());
  @@ -292,10 +162,19 @@
       }
       
       public void testBasicAuthenticationWithDefaultCreds() throws Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
  -        state.setCredentials(AuthScope.ANY, new 
UsernamePasswordCredentials("test", "test"));
  +        state.setCredentials(AuthScope.ANY, creds);
           this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService());
  +        
  +        this.server.setRequestHandler(handlerchain);
  +
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -307,7 +186,7 @@
           Header auth = httpget.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = httpget.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
  @@ -316,14 +195,23 @@
       }
   
       public void testBasicAuthentication() throws Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
           AuthScope authscope = new AuthScope(
               this.server.getLocalAddress(), 
               this.server.getLocalPort(),
               "test");
  -        state.setCredentials(authscope, new 
UsernamePasswordCredentials("test", "test"));
  +        state.setCredentials(authscope, creds);
           this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService());
  +
  +        this.server.setRequestHandler(handlerchain);
  +
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -335,7 +223,7 @@
           Header auth = httpget.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = httpget.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
  @@ -344,6 +232,13 @@
       }
   
       public void testBasicAuthenticationWithInvalidCredentials() throws 
Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
           AuthScope authscope = new AuthScope(
               this.server.getLocalAddress(), 
  @@ -351,7 +246,9 @@
               "test");
           state.setCredentials(authscope, new 
UsernamePasswordCredentials("test", "stuff"));
           this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService());
  +
  +        this.server.setRequestHandler(handlerchain);
  +        
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -359,7 +256,7 @@
               httpget.releaseConnection();
           }
           assertNotNull(httpget.getStatusLine());
  -        assertEquals(HttpStatus.SC_FORBIDDEN, 
httpget.getStatusLine().getStatusCode());
  +        assertEquals(HttpStatus.SC_UNAUTHORIZED, 
httpget.getStatusLine().getStatusCode());
           AuthState authstate = httpget.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
           assertTrue(authstate.getAuthScheme() instanceof BasicScheme);
  @@ -367,6 +264,13 @@
       }
   
       public void testBasicAuthenticationWithMutlipleRealms1() throws 
Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
           AuthScope realm1 = new AuthScope(
               this.server.getLocalAddress(), 
  @@ -376,11 +280,12 @@
               this.server.getLocalAddress(), 
               this.server.getLocalPort(),
               "test2");
  -        state.setCredentials(realm1, new 
UsernamePasswordCredentials("test","test"));
  -        state.setCredentials(realm2, new 
UsernamePasswordCredentials("test2","test2"));
  +        state.setCredentials(realm1, new 
UsernamePasswordCredentials("testuser","testpass"));
  +        state.setCredentials(realm2, new 
UsernamePasswordCredentials("testuser2","testpass2"));
           this.client.setState(state);
   
  -        this.server.setHttpService(new BasicAuthService());
  +        this.server.setRequestHandler(handlerchain);
  +        
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -392,7 +297,7 @@
           Header auth = httpget.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = httpget.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
  @@ -401,6 +306,13 @@
       }
   
       public void testBasicAuthenticationWithMutlipleRealms2() throws 
Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser2", "testpass2");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds, "test2"));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
           AuthScope realm1 = new AuthScope(
               this.server.getLocalAddress(), 
  @@ -410,11 +322,12 @@
               this.server.getLocalAddress(), 
               this.server.getLocalPort(),
               "test2");
  -        state.setCredentials(realm1, new 
UsernamePasswordCredentials("test","test"));
  -        state.setCredentials(realm2, new 
UsernamePasswordCredentials("test2","test2"));
  +        state.setCredentials(realm1, new 
UsernamePasswordCredentials("testuser","testpass"));
  +        state.setCredentials(realm2, new 
UsernamePasswordCredentials("testuser2","testpass2"));
           this.client.setState(state);
   
  -        this.server.setHttpService(new BasicAuthService2());
  +        this.server.setRequestHandler(handlerchain);
  +        
           GetMethod httpget = new GetMethod("/test2/");
           try {
               this.client.executeMethod(httpget);
  @@ -426,7 +339,7 @@
           Header auth = httpget.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test2:test2")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser2:testpass2")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = httpget.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
  @@ -435,11 +348,20 @@
       }
   
       public void testPreemptiveAuthorizationTrueWithCreds() throws Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
  -        state.setCredentials(AuthScope.ANY, new 
UsernamePasswordCredentials("test", "test"));
  +        state.setCredentials(AuthScope.ANY, creds);
           this.client.setState(state);
           this.client.getParams().setAuthenticationPreemptive(true);
  -        this.server.setHttpService(new BasicAuthService());
  +        
  +        this.server.setRequestHandler(handlerchain);
  +
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -451,7 +373,7 @@
           Header auth = httpget.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = httpget.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
  @@ -461,10 +383,19 @@
       }
   
       public void testPreemptiveAuthorizationTrueWithoutCreds() throws 
Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
           this.client.setState(state);
           this.client.getParams().setAuthenticationPreemptive(true);
  -        this.server.setHttpService(new BasicAuthService());
  +        
  +        this.server.setRequestHandler(handlerchain);
  +
           GetMethod httpget = new GetMethod("/test/");
           try {
               this.client.executeMethod(httpget);
  @@ -482,35 +413,19 @@
           assertFalse(authstate.isPreemptive());
       }
   
  -    public void testBasicAuthenticationCaseInsensitivity() throws Exception {
  -        HttpState state = new HttpState();
  -        AuthScope authscope = new AuthScope(
  -            this.server.getLocalAddress(), 
  -            this.server.getLocalPort(),
  -            "test");
  -        state.setCredentials(authscope, new 
UsernamePasswordCredentials("test", "test"));
  -        this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService3());
  -        GetMethod httpget = new GetMethod("/test/");
  -        try {
  -            this.client.executeMethod(httpget);
  -        } finally {
  -            httpget.releaseConnection();
  -        }
  -        assertNotNull(httpget.getStatusLine());
  -        assertEquals(HttpStatus.SC_OK, 
httpget.getStatusLine().getStatusCode());
  -        Header auth = httpget.getRequestHeader("Authorization");
  -        assertNotNull(auth);
  -        String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  -        assertEquals(expected, auth.getValue());
  -    }
  -
       public void testCustomAuthorizationHeader() throws Exception {
  -        String authResponse = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  -        this.server.setHttpService(new BasicAuthService());
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
  +        this.server.setRequestHandler(handlerchain);
  +
           GetMethod httpget = new GetMethod("/test/");
  +        String authResponse = "Basic " + EncodingUtil.getAsciiString(
  +                
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           httpget.addRequestHeader(new Header("Authorization", authResponse));
           try {
               this.client.executeMethod(httpget);
  @@ -522,14 +437,23 @@
       }
       
       public void testHeadBasicAuthentication() throws Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
FeedbackService()));
  +
           HttpState state = new HttpState();
           AuthScope authscope = new AuthScope(
               this.server.getLocalAddress(), 
               this.server.getLocalPort(),
               "test");
  -        state.setCredentials(authscope, new 
UsernamePasswordCredentials("test", "test"));
  +        state.setCredentials(authscope, creds);
           this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService());
  +
  +        this.server.setRequestHandler(handlerchain);
  +
           HeadMethod head = new HeadMethod("/test/");
           try {
               this.client.executeMethod(head);
  @@ -541,23 +465,32 @@
           Header auth = head.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = head.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
           assertTrue(authstate.getAuthScheme() instanceof BasicScheme);
           assertEquals("test", authstate.getRealm());
       }
  -    
  +
       public void testPostBasicAuthentication() throws Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
EchoService()));
  +
           HttpState state = new HttpState();
           AuthScope authscope = new AuthScope(
               this.server.getLocalAddress(), 
               this.server.getLocalPort(),
               "test");
  -        state.setCredentials(authscope, new 
UsernamePasswordCredentials("test", "test"));
  +        state.setCredentials(authscope, creds);
           this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService());
  +
  +        this.server.setRequestHandler(handlerchain);
  +
           PostMethod post = new PostMethod("/test/");
           post.setRequestEntity(new StringRequestEntity("Test body"));
           try {
  @@ -571,7 +504,7 @@
           Header auth = post.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = post.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
  @@ -580,14 +513,23 @@
       }
       
       public void testPutBasicAuthentication() throws Exception {
  +        UsernamePasswordCredentials creds = 
  +            new UsernamePasswordCredentials("testuser", "testpass");
  +        
  +        HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
  +        handlerchain.appendHandler(new AuthRequestHandler(creds));
  +        handlerchain.appendHandler(new HttpServiceHandler(new 
EchoService()));
  +
           HttpState state = new HttpState();
           AuthScope authscope = new AuthScope(
               this.server.getLocalAddress(), 
               this.server.getLocalPort(),
               "test");
  -        state.setCredentials(authscope, new 
UsernamePasswordCredentials("test", "test"));
  +        state.setCredentials(authscope, creds);
           this.client.setState(state);
  -        this.server.setHttpService(new BasicAuthService());
  +
  +        this.server.setRequestHandler(handlerchain);
  +
           PutMethod put = new PutMethod("/test/");
           put.setRequestEntity(new StringRequestEntity("Test body"));
           try {
  @@ -601,12 +543,12 @@
           Header auth = put.getRequestHeader("Authorization");
           assertNotNull(auth);
           String expected = "Basic " + EncodingUtil.getAsciiString(
  -            Base64.encodeBase64(EncodingUtil.getAsciiBytes("test:test")));
  +            
Base64.encodeBase64(EncodingUtil.getAsciiBytes("testuser:testpass")));
           assertEquals(expected, auth.getValue());
           AuthState authstate = put.getHostAuthState();
           assertNotNull(authstate.getAuthScheme());
           assertTrue(authstate.getAuthScheme() instanceof BasicScheme);
           assertEquals("test", authstate.getRealm());
       }
  -    
  +
   }
  
  
  
  1.2       +4 -4      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleConnManager.java
  
  Index: SimpleConnManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleConnManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SimpleConnManager.java    13 Nov 2004 12:21:28 -0000      1.1
  +++ SimpleConnManager.java    20 Nov 2004 17:56:40 -0000      1.2
  @@ -62,7 +62,7 @@
           SimpleConnList connlist = (SimpleConnList)this.connsets.get(host);
           if (connlist != null) {
               conn = connlist.removeFirst();
  -            if (!conn.isOpen()) {
  +            if (conn != null && !conn.isOpen()) {
                   conn = null;
               }
           }
  
  
  
  1.1                  
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/AuthRequestHandler.java
  
  Index: AuthRequestHandler.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/AuthRequestHandler.java,v
 1.1 2004/11/20 17:56:40 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2004/11/20 17:56:40 $
   *
   * ====================================================================
   *
   *  Copyright 1999-2004 The Apache Software Foundation
   *
   *  Licensed 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.commons.httpclient.server;
  
  import java.io.IOException;
  
  import org.apache.commons.httpclient.Credentials;
  import org.apache.commons.httpclient.Header;
  import org.apache.commons.httpclient.HttpStatus;
  import org.apache.commons.httpclient.UsernamePasswordCredentials;
  import org.apache.commons.httpclient.auth.BasicScheme;
  
  /**
   * This request handler guards access to the http server when used in a 
request handler
   * chain. It checks the headers for valid credentials and performs the
   * authentication handshake if necessary.
   * 
   * @author Ortwin Glueck
   * @author Oleg Kalnichevski
   */
  public class AuthRequestHandler implements HttpRequestHandler {
      
      private Credentials credentials = null;
      private String realm = null;
      private boolean keepalive = true;
  
      /**
       * The authenticate response header.
       */
      public static final String AUTH_RESP = "Authorization";
  
      /**
       * TODO replace creds parameter with a class specific to an auth scheme
       * encapsulating all required information for a specific scheme
       * 
       * @param creds
       */
      public AuthRequestHandler(final Credentials creds, final String realm, 
boolean keepalive) {
          if (creds == null)
              throw new IllegalArgumentException("Credentials may not be null");
          this.credentials = creds;
          this.keepalive = keepalive;
          if (realm != null) {
              this.realm = realm;
          } else {
              this.realm = "test";
          }
      }
  
      public AuthRequestHandler(final Credentials creds, final String realm) {
          this(creds, realm, true);
      }
      
      public AuthRequestHandler(final Credentials creds) {
          this(creds, null, true);
      }
      
      public boolean processRequest(
          final SimpleHttpServerConnection conn,
          final SimpleRequest request) throws IOException
      {
          Header clientAuth = request.getFirstHeader(AUTH_RESP);
          if (clientAuth != null && checkAuthorization(clientAuth)) {
              return false;
          } else {
              SimpleResponse response = performBasicHandshake(conn, request);
              // Make sure the request body is fully consumed
              request.getBodyBytes();
              conn.writeResponse(response);
              return true;
          }
      }
  
      //TODO add more auth schemes
      private SimpleResponse performBasicHandshake(
              final SimpleHttpServerConnection conn,
              final SimpleRequest request) throws IOException 
      { 
          SimpleResponse response = new SimpleResponse();
          response.setStatusLine(
                  request.getRequestLine().getHttpVersion(),
                  HttpStatus.SC_UNAUTHORIZED);
          if (!request.getRequestLine().getMethod().equalsIgnoreCase("HEAD")) {
              response.setBodyString("unauthorized");
          }
          response.addHeader(new Header("WWW-Authenticate", "basic realm=\"" + 
this.realm + "\""));
          if (this.keepalive) {
              response.addHeader(new Header("Connection", "keep-alive"));
              conn.setKeepAlive(true);
          } else {
              response.addHeader(new Header("Connection", "close"));
              conn.setKeepAlive(false);
          }
          return response;
      }
  
      /**
       * Checks if the credentials provided by the client match the required
       * credentials
       * 
       * @return true if the client is authorized, false if not.
       * @param clientAuth
       */
      private boolean checkAuthorization(final Header clientAuth) {
          String expectedAuthString = BasicScheme.authenticate(
              (UsernamePasswordCredentials)credentials,
              "ISO-8859-1");
          return expectedAuthString.equals(clientAuth.getValue());
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to