• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/client/DefaultHttpClient.java $
3  * $Revision: 677250 $
4  * $Date: 2008-07-16 04:45:47 -0700 (Wed, 16 Jul 2008) $
5  *
6  * ====================================================================
7  * Licensed to the Apache Software Foundation (ASF) under one
8  * or more contributor license agreements.  See the NOTICE file
9  * distributed with this work for additional information
10  * regarding copyright ownership.  The ASF licenses this file
11  * to you under the Apache License, Version 2.0 (the
12  * "License"); you may not use this file except in compliance
13  * with the License.  You may obtain a copy of the License at
14  *
15  *   http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing,
18  * software distributed under the License is distributed on an
19  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20  * KIND, either express or implied.  See the License for the
21  * specific language governing permissions and limitations
22  * under the License.
23  * ====================================================================
24  *
25  * This software consists of voluntary contributions made by many
26  * individuals on behalf of the Apache Software Foundation.  For more
27  * information on the Apache Software Foundation, please see
28  * <http://www.apache.org/>.
29  *
30  */
31 
32 package org.apache.http.impl.client;
33 
34 import org.apache.http.ConnectionReuseStrategy;
35 import org.apache.http.HttpVersion;
36 import org.apache.http.auth.AuthSchemeRegistry;
37 import org.apache.http.client.AuthenticationHandler;
38 import org.apache.http.client.CookieStore;
39 import org.apache.http.client.CredentialsProvider;
40 import org.apache.http.client.HttpRequestRetryHandler;
41 import org.apache.http.client.RedirectHandler;
42 import org.apache.http.client.UserTokenHandler;
43 import org.apache.http.client.params.AuthPolicy;
44 import org.apache.http.client.params.ClientPNames;
45 import org.apache.http.client.params.CookiePolicy;
46 import org.apache.http.client.protocol.ClientContext;
47 import org.apache.http.client.protocol.RequestAddCookies;
48 import org.apache.http.client.protocol.RequestDefaultHeaders;
49 import org.apache.http.client.protocol.RequestProxyAuthentication;
50 import org.apache.http.client.protocol.RequestTargetAuthentication;
51 import org.apache.http.client.protocol.ResponseProcessCookies;
52 import org.apache.http.conn.ClientConnectionManager;
53 import org.apache.http.conn.ClientConnectionManagerFactory;
54 import org.apache.http.conn.ConnectionKeepAliveStrategy;
55 import org.apache.http.conn.routing.HttpRoutePlanner;
56 import org.apache.http.conn.scheme.PlainSocketFactory;
57 import org.apache.http.conn.scheme.Scheme;
58 import org.apache.http.conn.scheme.SchemeRegistry;
59 import org.apache.http.conn.ssl.SSLSocketFactory;
60 import org.apache.http.cookie.CookieSpecRegistry;
61 import org.apache.http.impl.DefaultConnectionReuseStrategy;
62 import org.apache.http.impl.auth.BasicSchemeFactory;
63 import org.apache.http.impl.auth.DigestSchemeFactory;
64 import org.apache.http.impl.conn.DefaultHttpRoutePlanner;
65 import org.apache.http.impl.conn.SingleClientConnManager;
66 import org.apache.http.impl.cookie.BestMatchSpecFactory;
67 import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
68 import org.apache.http.impl.cookie.NetscapeDraftSpecFactory;
69 import org.apache.http.impl.cookie.RFC2109SpecFactory;
70 import org.apache.http.impl.cookie.RFC2965SpecFactory;
71 import org.apache.http.params.BasicHttpParams;
72 import org.apache.http.params.HttpParams;
73 import org.apache.http.params.HttpProtocolParams;
74 import org.apache.http.protocol.BasicHttpContext;
75 import org.apache.http.protocol.BasicHttpProcessor;
76 import org.apache.http.protocol.HTTP;
77 import org.apache.http.protocol.HttpContext;
78 import org.apache.http.protocol.HttpRequestExecutor;
79 import org.apache.http.protocol.RequestConnControl;
80 import org.apache.http.protocol.RequestContent;
81 import org.apache.http.protocol.RequestExpectContinue;
82 import org.apache.http.protocol.RequestTargetHost;
83 import org.apache.http.protocol.RequestUserAgent;
84 import org.apache.http.util.VersionInfo;
85 
86 
87 
88 /**
89  * Default implementation of an HTTP client.
90  * <br/>
91  * This class replaces <code>HttpClient</code> in HttpClient 3.
92  *
93  * @author <a href="mailto:rolandw at apache.org">Roland Weber</a>
94  * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
95  *
96  * <!-- empty lines to avoid svn diff problems -->
97  * @version   $Revision: 677250 $
98  *
99  * @since 4.0
100  */
101 public class DefaultHttpClient extends AbstractHttpClient {
102 
103 
104     /**
105      * Creates a new HTTP client from parameters and a connection manager.
106      *
107      * @param params    the parameters
108      * @param conman    the connection manager
109      */
DefaultHttpClient( final ClientConnectionManager conman, final HttpParams params)110     public DefaultHttpClient(
111             final ClientConnectionManager conman,
112             final HttpParams params) {
113         super(conman, params);
114     }
115 
116 
DefaultHttpClient(final HttpParams params)117     public DefaultHttpClient(final HttpParams params) {
118         super(null, params);
119     }
120 
121 
DefaultHttpClient()122     public DefaultHttpClient() {
123         super(null, null);
124     }
125 
126 
127     @Override
createHttpParams()128     protected HttpParams createHttpParams() {
129         HttpParams params = new BasicHttpParams();
130         HttpProtocolParams.setVersion(params,
131                 HttpVersion.HTTP_1_1);
132         HttpProtocolParams.setContentCharset(params,
133                 HTTP.DEFAULT_CONTENT_CHARSET);
134         HttpProtocolParams.setUseExpectContinue(params,
135                 true);
136 
137         // determine the release version from packaged version info
138         final VersionInfo vi = VersionInfo.loadVersionInfo
139             ("org.apache.http.client", getClass().getClassLoader());
140         final String release = (vi != null) ?
141             vi.getRelease() : VersionInfo.UNAVAILABLE;
142         HttpProtocolParams.setUserAgent(params,
143                 "Apache-HttpClient/" + release + " (java 1.4)");
144 
145         return params;
146     }
147 
148 
149     @Override
createRequestExecutor()150     protected HttpRequestExecutor createRequestExecutor() {
151         return new HttpRequestExecutor();
152     }
153 
154 
155     @Override
createClientConnectionManager()156     protected ClientConnectionManager createClientConnectionManager() {
157         SchemeRegistry registry = new SchemeRegistry();
158         registry.register(
159                 new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
160         registry.register(
161                 new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
162 
163         ClientConnectionManager connManager = null;
164         HttpParams params = getParams();
165 
166         ClientConnectionManagerFactory factory = null;
167 
168         // Try first getting the factory directly as an object.
169         factory = (ClientConnectionManagerFactory) params
170                 .getParameter(ClientPNames.CONNECTION_MANAGER_FACTORY);
171         if (factory == null) { // then try getting its class name.
172             String className = (String) params.getParameter(
173                     ClientPNames.CONNECTION_MANAGER_FACTORY_CLASS_NAME);
174             if (className != null) {
175                 try {
176                     Class<?> clazz = Class.forName(className);
177                     factory = (ClientConnectionManagerFactory) clazz.newInstance();
178                 } catch (ClassNotFoundException ex) {
179                     throw new IllegalStateException("Invalid class name: " + className);
180                 } catch (IllegalAccessException ex) {
181                     throw new IllegalAccessError(ex.getMessage());
182                 } catch (InstantiationException ex) {
183                     throw new InstantiationError(ex.getMessage());
184                 }
185             }
186         }
187 
188         if(factory != null) {
189             connManager = factory.newInstance(params, registry);
190         } else {
191             connManager = new SingleClientConnManager(getParams(), registry);
192         }
193 
194         return connManager;
195     }
196 
197 
198     @Override
createHttpContext()199     protected HttpContext createHttpContext() {
200         HttpContext context = new BasicHttpContext();
201         context.setAttribute(
202                 ClientContext.AUTHSCHEME_REGISTRY,
203                 getAuthSchemes());
204         context.setAttribute(
205                 ClientContext.COOKIESPEC_REGISTRY,
206                 getCookieSpecs());
207         context.setAttribute(
208                 ClientContext.COOKIE_STORE,
209                 getCookieStore());
210         context.setAttribute(
211                 ClientContext.CREDS_PROVIDER,
212                 getCredentialsProvider());
213         return context;
214     }
215 
216 
217     @Override
createConnectionReuseStrategy()218     protected ConnectionReuseStrategy createConnectionReuseStrategy() {
219         return new DefaultConnectionReuseStrategy();
220     }
221 
222     @Override
createConnectionKeepAliveStrategy()223     protected ConnectionKeepAliveStrategy createConnectionKeepAliveStrategy() {
224         return new DefaultConnectionKeepAliveStrategy();
225     }
226 
227 
228     @Override
createAuthSchemeRegistry()229     protected AuthSchemeRegistry createAuthSchemeRegistry() {
230         AuthSchemeRegistry registry = new AuthSchemeRegistry();
231         registry.register(
232                 AuthPolicy.BASIC,
233                 new BasicSchemeFactory());
234         registry.register(
235                 AuthPolicy.DIGEST,
236                 new DigestSchemeFactory());
237         return registry;
238     }
239 
240 
241     @Override
createCookieSpecRegistry()242     protected CookieSpecRegistry createCookieSpecRegistry() {
243         CookieSpecRegistry registry = new CookieSpecRegistry();
244         registry.register(
245                 CookiePolicy.BEST_MATCH,
246                 new BestMatchSpecFactory());
247         registry.register(
248                 CookiePolicy.BROWSER_COMPATIBILITY,
249                 new BrowserCompatSpecFactory());
250         registry.register(
251                 CookiePolicy.NETSCAPE,
252                 new NetscapeDraftSpecFactory());
253         registry.register(
254                 CookiePolicy.RFC_2109,
255                 new RFC2109SpecFactory());
256         registry.register(
257                 CookiePolicy.RFC_2965,
258                 new RFC2965SpecFactory());
259         return registry;
260     }
261 
262 
263     @Override
createHttpProcessor()264     protected BasicHttpProcessor createHttpProcessor() {
265         BasicHttpProcessor httpproc = new BasicHttpProcessor();
266         httpproc.addInterceptor(new RequestDefaultHeaders());
267         // Required protocol interceptors
268         httpproc.addInterceptor(new RequestContent());
269         httpproc.addInterceptor(new RequestTargetHost());
270         // Recommended protocol interceptors
271         httpproc.addInterceptor(new RequestConnControl());
272         httpproc.addInterceptor(new RequestUserAgent());
273         httpproc.addInterceptor(new RequestExpectContinue());
274         // HTTP state management interceptors
275         httpproc.addInterceptor(new RequestAddCookies());
276         httpproc.addInterceptor(new ResponseProcessCookies());
277         // HTTP authentication interceptors
278         httpproc.addInterceptor(new RequestTargetAuthentication());
279         httpproc.addInterceptor(new RequestProxyAuthentication());
280         return httpproc;
281     }
282 
283 
284     @Override
createHttpRequestRetryHandler()285     protected HttpRequestRetryHandler createHttpRequestRetryHandler() {
286         return new DefaultHttpRequestRetryHandler();
287     }
288 
289 
290     @Override
createRedirectHandler()291     protected RedirectHandler createRedirectHandler() {
292         return new DefaultRedirectHandler();
293     }
294 
295 
296     @Override
createTargetAuthenticationHandler()297     protected AuthenticationHandler createTargetAuthenticationHandler() {
298         return new DefaultTargetAuthenticationHandler();
299     }
300 
301 
302     @Override
createProxyAuthenticationHandler()303     protected AuthenticationHandler createProxyAuthenticationHandler() {
304         return new DefaultProxyAuthenticationHandler();
305     }
306 
307 
308     @Override
createCookieStore()309     protected CookieStore createCookieStore() {
310         return new BasicCookieStore();
311     }
312 
313 
314     @Override
createCredentialsProvider()315     protected CredentialsProvider createCredentialsProvider() {
316         return new BasicCredentialsProvider();
317     }
318 
319 
320     @Override
createHttpRoutePlanner()321     protected HttpRoutePlanner createHttpRoutePlanner() {
322         return new DefaultHttpRoutePlanner
323             (getConnectionManager().getSchemeRegistry());
324     }
325 
326 
327     @Override
createUserTokenHandler()328     protected UserTokenHandler createUserTokenHandler() {
329         return new DefaultUserTokenHandler();
330     }
331 
332 } // class DefaultHttpClient
333