1   /*
2    * $HeadURL: https://svn.apache.org/repos/asf/httpcomponents/oac.hc3x/trunk/src/test/org/apache/commons/httpclient/params/TestSSLTunnelParams.java $
3    * $Revision: 1425331 $
4    * $Date: 2012-12-22 19:29:41 +0100 (Sat, 22 Dec 2012) $
5    * ====================================================================
6    *
7    *  Licensed to the Apache Software Foundation (ASF) under one or more
8    *  contributor license agreements.  See the NOTICE file distributed with
9    *  this work for additional information regarding copyright ownership.
10   *  The ASF licenses this file to You under the Apache License, Version 2.0
11   *  (the "License"); you may not use this file except in compliance with
12   *  the License.  You may obtain a copy of the License at
13   *
14   *      http://www.apache.org/licenses/LICENSE-2.0
15   *
16   *  Unless required by applicable law or agreed to in writing, software
17   *  distributed under the License is distributed on an "AS IS" BASIS,
18   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19   *  See the License for the specific language governing permissions and
20   *  limitations under the License.
21   * ====================================================================
22   *
23   * This software consists of voluntary contributions made by many
24   * individuals on behalf of the Apache Software Foundation.  For more
25   * information on the Apache Software Foundation, please see
26   * <http://www.apache.org/>.
27   *
28   */
29  
30  package org.apache.commons.httpclient.params;
31  
32  import java.io.IOException;
33  
34  import junit.framework.Test;
35  import junit.framework.TestSuite;
36  
37  import org.apache.commons.httpclient.FeedbackService;
38  import org.apache.commons.httpclient.Header;
39  import org.apache.commons.httpclient.HttpClientTestBase;
40  import org.apache.commons.httpclient.HttpStatus;
41  import org.apache.commons.httpclient.HttpVersion;
42  import org.apache.commons.httpclient.methods.GetMethod;
43  import org.apache.commons.httpclient.server.HttpRequestHandler;
44  import org.apache.commons.httpclient.server.SimpleHttpServerConnection;
45  import org.apache.commons.httpclient.server.SimpleRequest;
46  import org.apache.commons.httpclient.server.SimpleResponse;
47  
48  /***
49   * Tunnelling proxy configuration.
50   *
51   * @author Oleg Kalnichevski
52   * 
53   * @version $Id: TestSSLTunnelParams.java 608018 2008-01-02 05:57:23Z rolandw $
54   */
55  public class TestSSLTunnelParams extends HttpClientTestBase {
56  
57      // ------------------------------------------------------------ Constructor
58      public TestSSLTunnelParams(final String testName) throws IOException {
59          super(testName);
60          setUseProxy(true);
61          setUseSSL(true);
62      }
63  
64      // ------------------------------------------------------------------- Main
65      public static void main(String args[]) {
66          String[] testCaseName = { TestSSLTunnelParams.class.getName() };
67          junit.textui.TestRunner.main(testCaseName);
68      }
69  
70      // ------------------------------------------------------- TestCase Methods
71  
72      public static Test suite() {
73          TestSuite suite = new TestSuite(TestSSLTunnelParams.class);
74          return suite;
75      }
76  
77      
78      static class HttpVersionHandler implements HttpRequestHandler {
79          
80          public HttpVersionHandler() {
81              super();
82          }
83  
84          public boolean processRequest(
85                  final SimpleHttpServerConnection conn,
86                  final SimpleRequest request) throws IOException
87              {
88                  HttpVersion ver = request.getRequestLine().getHttpVersion();
89                  if (ver.equals(HttpVersion.HTTP_1_0)) {
90                      return false;
91                  } else {
92                      SimpleResponse response = new SimpleResponse();
93                      response.setStatusLine(ver, HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED);
94                      response.addHeader(new Header("Proxy-Connection", "close"));
95                      conn.setKeepAlive(false);
96                      // Make sure the request body is fully consumed
97                      request.getBodyBytes();
98                      conn.writeResponse(response);
99                      return true;
100                 }
101             }
102         
103     }
104    
105     /***
106      * Tests correct proparation of HTTP params from the client to
107      * CONNECT method.
108      */
109     public void testTunnellingParamsAgentLevel() throws IOException {
110         this.proxy.addHandler(new HttpVersionHandler());
111         this.server.setHttpService(new FeedbackService());
112 
113         this.client.getParams().setVersion(HttpVersion.HTTP_1_1);
114         GetMethod httpget = new GetMethod("/test/");
115         try {
116             this.client.executeMethod(httpget);
117             assertNotNull(httpget.getStatusLine());
118             assertEquals(HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED, 
119                     httpget.getStatusLine().getStatusCode());
120         } finally {
121             httpget.releaseConnection();
122         }
123 
124         this.client.getParams().setVersion(HttpVersion.HTTP_1_0);
125         httpget = new GetMethod("/test/");
126         try {
127             this.client.executeMethod(httpget);
128             assertNotNull(httpget.getStatusLine());
129             assertEquals(HttpStatus.SC_OK, 
130                     httpget.getStatusLine().getStatusCode());
131         } finally {
132             httpget.releaseConnection();
133         }
134     }
135 
136     /***
137      * Tests correct proparation of HTTP params from the host config to
138      * CONNECT method.
139      */
140     public void testTunnellingParamsHostLevel() throws IOException {
141         this.proxy.addHandler(new HttpVersionHandler());
142         this.server.setHttpService(new FeedbackService());
143 
144         this.client.getHostConfiguration().getParams().setParameter(
145                 HttpMethodParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
146         GetMethod httpget = new GetMethod("/test/");
147         try {
148             this.client.executeMethod(httpget);
149             assertNotNull(httpget.getStatusLine());
150             assertEquals(HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED, 
151                     httpget.getStatusLine().getStatusCode());
152         } finally {
153             httpget.releaseConnection();
154         }
155 
156         this.client.getHostConfiguration().getParams().setParameter(
157                 HttpMethodParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
158         httpget = new GetMethod("/test/");
159         try {
160             this.client.executeMethod(httpget);
161             assertNotNull(httpget.getStatusLine());
162             assertEquals(HttpStatus.SC_OK, 
163                     httpget.getStatusLine().getStatusCode());
164         } finally {
165             httpget.releaseConnection();
166         }
167     }
168 
169     /***
170      * Tests ability to use HTTP/1.0 to execute CONNECT method and HTTP/1.1 to
171      * execute methods once the tunnel is established.
172      */
173     public void testTunnellingParamsHostHTTP10AndMethodHTTP11() throws IOException {
174         this.proxy.addHandler(new HttpVersionHandler());
175         this.server.setHttpService(new FeedbackService());
176 
177         this.client.getHostConfiguration().getParams().setParameter(
178                 HttpMethodParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
179         GetMethod httpget = new GetMethod("/test/");
180         httpget.getParams().setVersion(HttpVersion.HTTP_1_1);
181         try {
182             this.client.executeMethod(httpget);
183             assertNotNull(httpget.getStatusLine());
184             assertEquals(HttpStatus.SC_OK, 
185                     httpget.getStatusLine().getStatusCode());
186             assertEquals(HttpVersion.HTTP_1_1, 
187                     httpget.getEffectiveVersion());
188         } finally {
189             httpget.releaseConnection();
190         }
191     }
192 }