You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ro...@apache.org on 2007/01/27 23:01:24 UTC
svn commit: r500635 - in
/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client:
./ impl/
Author: rolandw
Date: Sat Jan 27 14:01:23 2007
New Revision: 500635
URL: http://svn.apache.org/viewvc?view=rev&rev=500635
Log:
HttpClient - stuff compiles, but the puzzle pieces don't fit yet
Added:
jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java (with props)
jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java (with props)
jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java (with props)
jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java (with props)
Modified:
jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/HttpClient.java
jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/AbstractHttpClient.java
Added: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java?view=auto&rev=500635
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java (added)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java Sat Jan 27 14:01:23 2007
@@ -0,0 +1,100 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ * 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.client;
+
+import java.io.IOException;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpException;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.conn.ManagedClientConnection;
+
+
+
+/**
+ * A client-side request director.
+ * The director decides which steps are necessary to execute a request.
+ * It establishes connections and optionally processes redirects and
+ * authentication challenges. The director may therefore generate and
+ * send a sequence of requests in order to execute one initial request.
+ * <br/>
+ * This interface and it's implementations replace the
+ * <code>HttpMethodDirector</code> in HttpClient 3.
+ *
+ * @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
+ *
+ *
+ * <!-- empty lines to avoid svn diff problems -->
+ * @version $Revision$
+ *
+ * @since 4.0
+ */
+public interface ClientRequestDirector {
+
+
+ /**
+ * Executes a request.
+ * <br/><b>Note:</b>
+ * For the time being, a new director is instantiated for each request.
+ * This is the same behavior as for <code>HttpMethodDirector</code>
+ * in HttpClient 3.
+ *
+ * @param roureq the route and request to execute
+ * @param context the context for executing the request
+ *
+ * @return the final response to the request.
+ * This is never an intermediate response with status code 1xx.
+ *
+ * @throws HttpException in case of a problem
+ * @throws IOException in case of an IO problem
+ */
+ HttpResponse execute(RoutedRequest roureq, HttpContext context)
+ throws HttpException, IOException
+ ;
+
+
+ /**
+ * Obtains the connection to which the response is tied.
+ * Responses with a non-buffered response entity are tied to
+ * their connection until the entity is consumed or discarded.
+ * Until then, the connection must not be released. Afterwards,
+ * it must be released.
+ *
+ * @return the connection to which the response from
+ * {@link #execute execute} is tied, or
+ * <code>null</code> if there is none
+ */
+ ManagedClientConnection getConnection()
+ ;
+
+
+} // class ClientRequestDirector
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/ClientRequestDirector.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/HttpClient.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/HttpClient.java?view=diff&rev=500635&r1=500634&r2=500635
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/HttpClient.java (original)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/HttpClient.java Sat Jan 27 14:01:23 2007
@@ -33,6 +33,7 @@
import java.io.IOException;
+import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpException;
@@ -44,9 +45,11 @@
/**
* Interface for an HTTP client.
- * HTTP clients encapsulate a collection of objects required to
+ * HTTP clients encapsulate a smorgasbord of objects required to
* execute HTTP requests while handling cookies, authentication,
* connection management, and other features.
+ * Thread safety of HTTP clients depends on the implementation
+ * and configuration of the specific client.
*
* @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
*
@@ -60,7 +63,7 @@
/**
- * Obtains the default context for this client.
+ * Obtains the default context used by this client.
* This context will be used by default when executing requests
* with this client.
*
@@ -73,7 +76,7 @@
/**
* Obtains the parameters for this client.
* These parameters will become defaults for all requests being
- * executed with this client, and for the parameters of all
+ * executed with this client, and for the parameters of
* dependent objects in this client.
*
* @return the default parameters
@@ -91,27 +94,33 @@
;
/**
- * Executes a request using the {@link #getContext default context}.
- * Same as {@link #execute(HttpRequest,HttpContext)
- * client.execute(request, client.getContext())},
+ * Executes a request for the given target using the
+ * {@link #getContext default context}.
+ * Same as {@link #execute(HttpHost,HttpRequest,HttpContext)
+ * client.execute(target, request, client.getContext())},
* see there for details.
*
+ * @param target the target host for the request.
+ * Some implementations may accept <code>null</code>.
* @param request the request to execute
*
* @return the response to the request
*
- * @throws HttpException in case of a protocol problem
+ * @throws HttpException in case of a problem
* @throws IOException in case of an IO problem
* <br/><i @@@>timeout exceptions?</i>
*/
- HttpResponse execute(HttpRequest request)
+ HttpResponse execute(HttpHost target, HttpRequest request)
throws HttpException, IOException
;
/**
- * Executes a request using the given context.
+ * Executes a request for the given target using the given context.
+ * The route to the target will be determined by the HTTP client.
*
+ * @param target the target host for the request.
+ * Some implementations may accept <code>null</code>.
* @param request the request to execute
* @param context the context to use for the execution, or
* <code>null</code> to use the
@@ -119,15 +128,38 @@
*
* @return the response to the request. This is always a final response,
* never an intermediate response with an 1xx status code.
- * Whether redirects or authentication requests will be returned
+ * Whether redirects or authentication challenges will be returned
* or handled automatically depends on the implementation and
* configuration of this client.
*
- * @throws HttpException in case of a protocol problem
+ * @throws HttpException in case of a problem
* @throws IOException in case of an IO problem
* <br/><i @@@>timeout exceptions?</i>
*/
- HttpResponse execute(HttpRequest request, HttpContext context)
+ HttpResponse execute(HttpHost target, HttpRequest request,
+ HttpContext context)
+ throws HttpException, IOException
+ ;
+
+
+ /**
+ * Executes a request along the given route.
+ *
+ * @param roureq the request to execute along with the route
+ * @param context the context to use for the execution, or
+ * <code>null</code> to use the
+ * {@link #getContext default context}
+ *
+ * @return the response to the request. See
+ * {@link #execute(HttpHost,HttpRequest,HttpContext)
+ * execute(target,request,context)}
+ * for details.
+ *
+ * @throws HttpException in case of a problem
+ * @throws IOException in case of an IO problem
+ * <br/><i @@@>timeout exceptions?</i>
+ */
+ HttpResponse execute(RoutedRequest roureq, HttpContext context)
throws HttpException, IOException
;
Added: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java?view=auto&rev=500635
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java (added)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java Sat Jan 27 14:01:23 2007
@@ -0,0 +1,100 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ * 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.client;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.conn.HostConfiguration;
+
+
+/**
+ * A request with the route along which it should be sent.
+ *
+ * @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
+ *
+ *
+ * <!-- empty lines to avoid svn diff problems -->
+ * @version $Revision$
+ *
+ * @since 4.0
+ */
+public interface RoutedRequest {
+
+ /**
+ * Obtains the request.
+ *
+ * @return the request
+ */
+ HttpRequest getRequest()
+ ;
+
+
+ /**
+ * Obtains the route.
+ *
+ * @return the route
+ */
+ HostConfiguration getRoute()
+ ;
+
+
+ /**
+ * Trivial default implementation of a routed request.
+ */
+ public static class Impl implements RoutedRequest {
+
+ protected final HttpRequest request;
+ protected final HostConfiguration route;
+
+ /**
+ * Creates a new routed request.
+ *
+ * @param req the request
+ * @param rou the route
+ */
+ public Impl(HttpRequest req, HostConfiguration rou) {
+ this.request = req;
+ this.route = rou;
+ }
+
+ // non-javadoc, see interface
+ public final HttpRequest getRequest() {
+ return request;
+ }
+
+ // non-javadoc, see interface
+ public final HostConfiguration getRoute() {
+ return route;
+ }
+ } // class Impl
+
+
+} // interface RoutedRequest
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/RoutedRequest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/AbstractHttpClient.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/AbstractHttpClient.java?view=diff&rev=500635&r1=500634&r2=500635
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/AbstractHttpClient.java (original)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/AbstractHttpClient.java Sat Jan 27 14:01:23 2007
@@ -33,6 +33,7 @@
import java.io.IOException;
+import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpException;
@@ -41,7 +42,9 @@
import org.apache.http.protocol.SyncHttpExecutionContext;
import org.apache.http.protocol.BasicHttpProcessor;
import org.apache.http.conn.ClientConnectionManager;
+
import org.apache.http.client.HttpClient;
+import org.apache.http.client.RoutedRequest;
@@ -170,12 +173,78 @@
}
- // non-javadoc, see interface HttpClient
- public final HttpResponse execute(HttpRequest request)
+ /**
+ * Maps to {@link #execute(HttpHost,HttpRequest,HttpContext)
+ * execute(target, request, context)}.
+ *
+ * @param target the target host for the request.
+ * Some implementations may accept <code>null</code>.
+ * @param request the request to execute
+ *
+ * @return the response to the request
+ *
+ * @throws HttpException in case of a problem
+ * @throws IOException in case of an IO problem
+ */
+ public final HttpResponse execute(HttpHost target, HttpRequest request)
+ throws HttpException, IOException {
+
+ return execute(target, request, defaultContext);
+ }
+
+
+ /**
+ * Maps to {@link HttpClient#execute(RoutedRequest,HttpContext)
+ * execute(roureq, context)}.
+ * The route is computed by {@link #determineRoute determineRoute}.
+ *
+ * @param target the target host for the request.
+ * Some implementations may accept <code>null</code>.
+ * @param request the request to execute
+ */
+ public final HttpResponse execute(HttpHost target, HttpRequest request,
+ HttpContext context)
throws HttpException, IOException {
- return execute(request, defaultContext);
+ if (request == null) {
+ throw new IllegalArgumentException
+ ("Request must not be null.");
+ }
+ // A null target may be acceptable if there is a default target.
+ // Otherwise, the null target is detected in determineRoute().
+
+ if (context == null)
+ context = defaultContext;
+
+ RoutedRequest roureq = determineRoute(target, request, context);
+ return execute(roureq, context);
}
+
+
+ /**
+ * Determines the route for a request.
+ * Called by {@link #execute(HttpHost,HttpRequest,HttpContext)
+ * execute(target, request, context)}
+ * to map to {@link HttpClient#execute(RoutedRequest,HttpContext)
+ * execute(roureq, context)}.
+ *
+ * @param target the target host for the request.
+ * Implementations may accept <code>null</code>
+ * if they can still determine a route, for example
+ * to a default target or by inspecting the request.
+ * @param request the request to execute
+ * @param context the context to use for the execution,
+ * never <code>null</code>
+ *
+ * @return the request along with the route it should take
+ *
+ * @throws HttpException in case of a problem
+ */
+ protected abstract RoutedRequest determineRoute(HttpHost target,
+ HttpRequest request,
+ HttpContext context)
+ throws HttpException
+ ;
} // class AbstractHttpClient
Added: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java?view=auto&rev=500635
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java (added)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java Sat Jan 27 14:01:23 2007
@@ -0,0 +1,227 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ * 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.client.impl;
+
+import java.io.IOException;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpException;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestExecutor;
+import org.apache.http.conn.HostConfiguration;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.ManagedClientConnection;
+import org.apache.http.client.RoutedRequest;
+import org.apache.http.client.ClientRequestDirector;
+
+
+
+/**
+ * Default implementation of a client-side request director.
+ * <br/>
+ * This class replaces the <code>HttpMethodDirector</code> in HttpClient 3.
+ *
+ * @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
+ *
+ *
+ * <!-- empty lines to avoid svn diff problems -->
+ * @version $Revision$
+ *
+ * @since 4.0
+ */
+public class DefaultClientRequestDirector
+ implements ClientRequestDirector {
+
+ /** The connection manager. */
+ protected final ClientConnectionManager connManager;
+
+ /** The request executor. */
+ protected final HttpRequestExecutor requestExec;
+
+ /** The parameters. */
+ protected final HttpParams defaultParams;
+
+ /** The currently allocated connection. */
+ protected ManagedClientConnection managedConn;
+
+
+ public DefaultClientRequestDirector(ClientConnectionManager conman,
+ HttpRequestExecutor reqexec,
+ HttpParams params) {
+
+ this.connManager = conman;
+ this.requestExec = reqexec;
+ this.defaultParams = params;
+
+ this.managedConn = null;
+
+ //@@@ authentication?
+
+ } // constructor
+
+
+ // non-javadoc, see interface ClientRequestDirector
+ public ManagedClientConnection getConnection() {
+ return managedConn;
+ }
+
+ // non-javadoc, see interface ClientRequestDirector
+ public HttpResponse execute(RoutedRequest roureq, HttpContext context)
+ throws HttpException, IOException {
+
+ //@@@ link parameters? Let's rely on the request executor for now.
+
+ HttpResponse response = null;
+ boolean done = false;
+ while (!done) {
+ allocateConnection(roureq.getRoute());
+ establishRoute(roureq.getRoute(), context);
+ //@@@ prepare request (authentication)
+ //@@@ will this be done here or via interceptor?
+
+ response = requestExec.execute
+ (roureq.getRequest(), managedConn, context);
+
+ RoutedRequest followup = handleResponse(roureq, response, context);
+ if (followup == null) {
+ done = true;
+ } else {
+ if ((managedConn != null) &&
+ !followup.getRoute().equals(roureq.getRoute())) {
+ // the followup has a different route, release connection
+ //@@@ need to consume response body first?
+ //@@@ or let that be done in handleResponse(...)?
+ connManager.releaseConnection(managedConn);
+ }
+ roureq = followup;
+ }
+ } // while not done
+
+ //@@@ check response for entity, release connection if possible
+
+ return response;
+
+ } // execute
+
+
+ /**
+ * Obtains a connection for the target route.
+ *
+ * @param route the route for which to allocate a connection
+ *
+ * @throws HttpException in case of a problem
+ */
+ protected void allocateConnection(HostConfiguration route)
+ throws HttpException {
+
+ // we assume that the connection would have been released
+ // if it was not appropriate for the route of the followup
+ if (managedConn != null)
+ return;
+
+ //@@@ use connection manager timeout
+ managedConn = connManager.getConnection(route);
+
+ } // allocateConnection
+
+
+ /**
+ * Establishes the target route.
+ *
+ * @param route the route to establish
+ * @param context the context for the request execution
+ *
+ * @throws HttpException in case of a problem
+ * @throws IOException in case of an IO problem
+ */
+ protected void establishRoute(HostConfiguration route,
+ HttpContext context)
+ throws HttpException, IOException {
+
+ //@@@ where do we get the currently established route?
+ //@@@ how to handle CONNECT requests for tunnelling?
+
+ //@@@ for now, let's just deal with connected and not connected
+ if ((route.getProxyHost() != null) &&
+ !"http".equals(route.getHost().getSchemeName())) {
+ //@@@ the actual check should be whether the socket factory
+ //@@@ for the target host scheme is a SecureSocketFactory
+ throw new UnsupportedOperationException
+ ("Currently only plain http via proxy is supported.");
+ }
+ if (managedConn.isOpen())
+ return; // already established
+
+ //@@@ should the request parameters already be used here?
+ //@@@ probably yes, but they're not linked yet
+ //@@@ will linking above cause problems with linking in reqExec?
+ //@@@ probably not, because the parent is replaced
+ //@@@ just make sure we don't link parameters to themselves
+
+ managedConn.open(route, context, defaultParams);
+
+ } // establishConnection
+
+
+ /**
+ * Analyzes a response to check need for a followup.
+ *
+ * @param roureq the request that was sent
+ * @param response the response to analayze
+ * @param context the context used for the current request execution
+ *
+ * @return the followup request and route if there is a followup, or
+ * <code>null</code> if the response should be returned as is
+ *
+ * @throws HttpException in case of a problem
+ * @throws IOException in case of an IO problem
+ */
+ protected RoutedRequest handleResponse(RoutedRequest roureq,
+ HttpResponse response,
+ HttpContext context)
+ throws HttpException, IOException {
+
+ //@@@ if there is a followup, check connection keep-alive and
+ //@@@ consume response body if necessary or close otherwise
+
+ //@@@ if the request needs to be re-sent with authentication,
+ //@@@ how to revert the modifications applied by the interceptors?
+ //@@@ use a wrapper when sending?
+
+ return null;
+
+ } // handleResponse
+
+
+} // class DefaultClientRequestDirector
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultClientRequestDirector.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java?view=auto&rev=500635
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java (added)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java Sat Jan 27 14:01:23 2007
@@ -0,0 +1,172 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ * 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.client.impl;
+
+import java.io.IOException;
+
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpException;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.BasicHttpProcessor;
+import org.apache.http.protocol.HttpRequestExecutor;
+import org.apache.http.conn.HostConfiguration;
+import org.apache.http.conn.ClientConnectionManager;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.RoutedRequest;
+import org.apache.http.client.ClientRequestDirector;
+
+
+
+/**
+ * Default implementation of an HTTP client.
+ * <br/>
+ * This class replaces <code>HttpClient</code> in HttpClient 3.
+ *
+ * @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
+ *
+ *
+ * <!-- empty lines to avoid svn diff problems -->
+ * @version $Revision$
+ *
+ * @since 4.0
+ */
+public class DefaultHttpClient extends AbstractHttpClient {
+
+
+ /**
+ * Creates a new HTTP client from parameters and a connection manager.
+ *
+ * @param params the parameters
+ * @param conman the connection manager
+ */
+ public DefaultHttpClient(HttpParams params,
+ ClientConnectionManager conman) {
+ super(null, params, conman, null);
+ httpProcessor = createProcessor();
+ }
+
+
+ /**
+ * Creates and initializes an HTTP processor.
+ * This method is typically called by the constructor,
+ * after the base class has been initialized.
+ *
+ * @return a new, initialized HTTP processor
+ */
+ protected BasicHttpProcessor createProcessor() {
+
+ BasicHttpProcessor bhp = new BasicHttpProcessor();
+ //@@@ evaluate defaultParams to initialize interceptors
+
+ return bhp;
+ }
+
+
+ // non-javadoc, see interface HttpClient
+ public HttpResponse execute(RoutedRequest roureq, HttpContext context)
+ throws HttpException, IOException {
+
+ if (roureq == null) {
+ throw new IllegalArgumentException
+ ("Routed request must not be null.");
+ }
+ if (roureq.getRequest() == null) {
+ throw new IllegalArgumentException
+ ("Request must not be null.");
+ }
+ if (roureq.getRoute() == null) {
+ throw new IllegalArgumentException
+ ("Route must not be null.");
+ }
+
+ if (context == null)
+ context = defaultContext;
+
+ ClientRequestDirector director = createDirector(context);
+ HttpResponse response = director.execute(roureq, context);
+
+ //@@@ "finalize" response, to allow for buffering of entities?
+ //@@@ here or in director?
+
+ System.out.println("@@@ what about "+director.getConnection()+"?");
+ //@@@ return a "connected response" with a release() callback?
+ //@@@ use a special response entity to implement the release()?
+
+ return response;
+
+ } // execute
+
+
+ // non-javadoc, see base class AbstractHttpClient
+ protected RoutedRequest determineRoute(HttpHost target,
+ HttpRequest request,
+ HttpContext context)
+ throws HttpException {
+
+ //@@@ allow null target if there is a default route with a target?
+ if (target == null) {
+ throw new IllegalArgumentException
+ ("Target host must not be null.");
+ }
+
+ //@@@ refer to a default HostConfiguration?
+ HostConfiguration route = new HostConfiguration(target, null, null);
+
+ return new RoutedRequest.Impl(request, route);
+ }
+
+
+ /**
+ * Creates a new director for a request execution.
+ *
+ * @param context the context to use for the execution,
+ * never <code>null</code>
+ *
+ * @return the new director for executing a method in the given context
+ */
+ protected ClientRequestDirector createDirector(HttpContext context) {
+
+ //@@@ can we use a single reqexec without sacrificing thread safety?
+ //@@@ it seems wasteful to throw away both director and reqexec
+ HttpRequestExecutor reqexec = new HttpRequestExecutor(httpProcessor);
+ reqexec.setParams(defaultParams);
+
+ return new DefaultClientRequestDirector
+ (connManager, reqexec, defaultParams);
+
+ }
+
+} // class DefaultHttpClient
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/client/impl/DefaultHttpClient.java
------------------------------------------------------------------------------
svn:mime-type = text/plain