hc-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ol...@apache.org
Subject svn commit: r1345677 - in /httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http: client/HttpClientRequestExecutor.java impl/client/BackoffStrategyRequestExecutor.java impl/client/BasicHttpClient.java
Date Sun, 03 Jun 2012 14:21:00 GMT
Author: olegk
Date: Sun Jun  3 14:20:59 2012
New Revision: 1345677

URL: http://svn.apache.org/viewvc?rev=1345677&view=rev
Log:
* Introduced HttpClientRequestExecutor interface. Multiple instances of this interface can be linked together into a processing chain (chain of responsibility).
* Created basic HttpClient implementation that can execute requests by delegating to a HttpClientRequestExecutor processing chain based on code from AbstractHttpClient
* Factored backoff strategy related logic into a separate HttpClientRequestExecutor implementation

Added:
    httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java   (with props)
    httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java   (with props)
    httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BasicHttpClient.java
      - copied, changed from r1345659, httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java

Added: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java?rev=1345677&view=auto
==============================================================================
--- httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java (added)
+++ httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java Sun Jun  3 14:20:59 2012
@@ -0,0 +1,46 @@
+/*
+ * ====================================================================
+ * 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.HttpException;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.protocol.HttpContext;
+
+/**
+ * @since 4.3
+ */
+public interface HttpClientRequestExecutor {
+
+    HttpResponse execute(HttpHost target, HttpUriRequest request, HttpContext context)
+        throws IOException, HttpException;
+
+}

Propchange: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/client/HttpClientRequestExecutor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java?rev=1345677&view=auto
==============================================================================
--- httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java (added)
+++ httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java Sun Jun  3 14:20:59 2012
@@ -0,0 +1,116 @@
+/*
+ * ====================================================================
+ * 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.impl.client;
+
+import java.io.IOException;
+import java.lang.reflect.UndeclaredThrowableException;
+
+import org.apache.http.HttpException;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.annotation.ThreadSafe;
+import org.apache.http.client.BackoffManager;
+import org.apache.http.client.ConnectionBackoffStrategy;
+import org.apache.http.client.HttpClientRequestExecutor;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.params.ClientPNames;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.conn.routing.HttpRoutePlanner;
+import org.apache.http.protocol.HttpContext;
+
+/**
+ * @since 4.3
+ */
+@ThreadSafe
+public class BackoffStrategyRequestExecutor implements HttpClientRequestExecutor {
+
+    private final HttpClientRequestExecutor requestExecutor;
+    private final HttpRoutePlanner routePlanner;
+    private final ConnectionBackoffStrategy connectionBackoffStrategy;
+    private final BackoffManager backoffManager;
+
+    public BackoffStrategyRequestExecutor(
+            final HttpClientRequestExecutor requestExecutor,
+            final HttpRoutePlanner routePlanner,
+            final ConnectionBackoffStrategy connectionBackoffStrategy,
+            final BackoffManager backoffManager) {
+        super();
+        if (requestExecutor == null) {
+            throw new IllegalArgumentException("HTTP client request executor may not be null");
+        }
+        if (routePlanner == null) {
+            throw new IllegalArgumentException("HTTP route planner may not be null");
+        }
+        if (connectionBackoffStrategy == null) {
+            throw new IllegalArgumentException("Connection backoff strategy may not be null");
+        }
+        if (backoffManager == null) {
+            throw new IllegalArgumentException("Backoff manager may not be null");
+        }
+        this.requestExecutor = requestExecutor;
+        this.routePlanner = routePlanner;
+        this.connectionBackoffStrategy = connectionBackoffStrategy;
+        this.backoffManager = backoffManager;
+    }
+
+    public HttpResponse execute(
+            final HttpHost target, 
+            final HttpUriRequest request, 
+            final HttpContext context) throws IOException, HttpException {
+        if (request == null) {
+            throw new IllegalArgumentException("Request may not be null");
+        }
+        HttpHost targetForRoute = (target != null) ? target
+                : (HttpHost) request.getParams().getParameter(ClientPNames.DEFAULT_HOST);
+        HttpRoute route = this.routePlanner.determineRoute(targetForRoute, request, context);
+
+        HttpResponse out;
+        try {
+            out = this.requestExecutor.execute(target, request, context);
+        } catch (RuntimeException ex) {
+            if (this.connectionBackoffStrategy.shouldBackoff(ex)) {
+                this.backoffManager.backOff(route);
+            }
+            throw ex;
+        } catch (Exception ex) {
+            if (this.connectionBackoffStrategy.shouldBackoff(ex)) {
+                this.backoffManager.backOff(route);
+            }
+            if (ex instanceof HttpException) throw (HttpException) ex;
+            if (ex instanceof IOException) throw (IOException) ex;
+            throw new UndeclaredThrowableException(ex);
+        }
+        if (this.connectionBackoffStrategy.shouldBackoff(out)) {
+            this.backoffManager.backOff(route);
+        } else {
+            this.backoffManager.probe(route);
+        }
+        return out;
+    }
+
+}

Propchange: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BackoffStrategyRequestExecutor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BasicHttpClient.java (from r1345659, httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BasicHttpClient.java?p2=httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BasicHttpClient.java&p1=httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java&r1=1345659&r2=1345677&rev=1345677&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java (original)
+++ httpcomponents/httpclient/branches/decorator-refactoring/httpclient/src/main/java/org/apache/http/impl/client/BasicHttpClient.java Sun Jun  3 14:20:59 2012
@@ -33,775 +33,47 @@ import java.net.URI;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.http.ConnectionReuseStrategy;
 import org.apache.http.HttpEntity;
+import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
 import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.annotation.GuardedBy;
 import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.auth.AuthSchemeRegistry;
-import org.apache.http.client.AuthenticationHandler;
-import org.apache.http.client.AuthenticationStrategy;
-import org.apache.http.client.BackoffManager;
 import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.ConnectionBackoffStrategy;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.CredentialsProvider;
 import org.apache.http.client.HttpClient;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.client.RedirectHandler;
-import org.apache.http.client.RedirectStrategy;
-import org.apache.http.client.RequestDirector;
+import org.apache.http.client.HttpClientRequestExecutor;
 import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.UserTokenHandler;
 import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.params.AuthPolicy;
-import org.apache.http.client.params.ClientPNames;
-import org.apache.http.client.params.CookiePolicy;
-import org.apache.http.client.protocol.ClientContext;
 import org.apache.http.client.utils.URIUtils;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.ClientConnectionManagerFactory;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.cookie.CookieSpecRegistry;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.auth.BasicSchemeFactory;
-import org.apache.http.impl.auth.DigestSchemeFactory;
-import org.apache.http.impl.auth.KerberosSchemeFactory;
-import org.apache.http.impl.auth.NTLMSchemeFactory;
-import org.apache.http.impl.auth.SPNegoSchemeFactory;
-import org.apache.http.impl.conn.BasicClientConnectionManager;
-import org.apache.http.impl.conn.DefaultHttpRoutePlanner;
-import org.apache.http.impl.conn.SchemeRegistryFactory;
-import org.apache.http.impl.cookie.BestMatchSpecFactory;
-import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
-import org.apache.http.impl.cookie.IgnoreSpecFactory;
-import org.apache.http.impl.cookie.NetscapeDraftSpecFactory;
-import org.apache.http.impl.cookie.RFC2109SpecFactory;
-import org.apache.http.impl.cookie.RFC2965SpecFactory;
-import org.apache.http.params.HttpParams;
 import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.DefaultedHttpContext;
 import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.HttpRequestExecutor;
-import org.apache.http.protocol.ImmutableHttpProcessor;
 import org.apache.http.util.EntityUtils;
 
 /**
- * Base class for {@link HttpClient} implementations. This class acts as
- * a facade to a number of special purpose handler or strategy
- * implementations responsible for handling of a particular aspect of
- * the HTTP protocol such as redirect or authentication handling or
- * making decision about connection persistence and keep alive duration.
- * This enables the users to selectively replace default implementation
- * of those aspects with custom, application specific ones. This class
- * also provides factory methods to instantiate those objects:
- * <ul>
- *   <li>{@link HttpRequestExecutor}</li> object used to transmit messages
- *    over HTTP connections. The {@link #createRequestExecutor()} must be
- *    implemented by concrete super classes to instantiate this object.
- *   <li>{@link BasicHttpProcessor}</li> object to manage a list of protocol
- *    interceptors and apply cross-cutting protocol logic to all incoming
- *    and outgoing HTTP messages. The {@link #createHttpProcessor()} must be
- *    implemented by concrete super classes to instantiate this object.
- *   <li>{@link HttpRequestRetryHandler}</li> object used to decide whether
- *    or not a failed HTTP request is safe to retry automatically.
- *    The {@link #createHttpRequestRetryHandler()} must be
- *    implemented by concrete super classes to instantiate this object.
- *   <li>{@link ClientConnectionManager}</li> object used to manage
- *    persistent HTTP connections.
- *   <li>{@link ConnectionReuseStrategy}</li> object used to decide whether
- *    or not a HTTP connection can be kept alive and re-used for subsequent
- *    HTTP requests. The {@link #createConnectionReuseStrategy()} must be
- *    implemented by concrete super classes to instantiate this object.
- *   <li>{@link ConnectionKeepAliveStrategy}</li> object used to decide how
- *    long a persistent HTTP connection can be kept alive.
- *    The {@link #createConnectionKeepAliveStrategy()} must be
- *    implemented by concrete super classes to instantiate this object.
- *   <li>{@link CookieSpecRegistry}</li> object used to maintain a list of
- *    supported cookie specifications.
- *    The {@link #createCookieSpecRegistry()} must be implemented by concrete
- *    super classes to instantiate this object.
- *   <li>{@link CookieStore}</li> object used to maintain a collection of
- *    cookies. The {@link #createCookieStore()} must be implemented by
- *    concrete super classes to instantiate this object.
- *   <li>{@link AuthSchemeRegistry}</li> object used to maintain a list of
- *    supported authentication schemes.
- *    The {@link #createAuthSchemeRegistry()} must be implemented by concrete
- *    super classes to instantiate this object.
- *   <li>{@link CredentialsProvider}</li> object used to maintain
- *    a collection user credentials. The {@link #createCredentialsProvider()}
- *    must be implemented by concrete super classes to instantiate
- *    this object.
- *   <li>{@link AuthenticationStrategy}</li> object used to authenticate
- *    against the target host.
- *    The {@link #createTargetAuthenticationStrategy()} must be implemented
- *    by concrete super classes to instantiate this object.
- *   <li>{@link AuthenticationStrategy}</li> object used to authenticate
- *    against the proxy host.
- *    The {@link #createProxyAuthenticationStrategy()} must be implemented
- *    by concrete super classes to instantiate this object.
- *   <li>{@link HttpRoutePlanner}</li> object used to calculate a route
- *    for establishing a connection to the target host. The route
- *    may involve multiple intermediate hops.
- *    The {@link #createHttpRoutePlanner()} must be implemented
- *    by concrete super classes to instantiate this object.
- *   <li>{@link RedirectStrategy}</li> object used to determine if an HTTP
- *    request should be redirected to a new location in response to an HTTP
- *    response received from the target server.
- *   <li>{@link UserTokenHandler}</li> object used to determine if the
- *    execution context is user identity specific.
- *    The {@link #createUserTokenHandler()} must be implemented by
- *    concrete super classes to instantiate this object.
- * </ul>
- * <p>
- *   This class also maintains a list of protocol interceptors intended
- *   for processing outgoing requests and incoming responses and provides
- *   methods for managing those interceptors. New protocol interceptors can be
- *   introduced to the protocol processor chain or removed from it if needed.
- *   Internally protocol interceptors are stored in a simple
- *   {@link java.util.ArrayList}. They are executed in the same natural order
- *   as they are added to the list.
- * <p>
- *   AbstractHttpClient is thread safe. It is recommended that the same
- *   instance of this class is reused for multiple request executions.
- *   When an instance of DefaultHttpClient is no longer needed and is about
- *   to go out of scope the connection manager associated with it must be
- *   shut down by calling {@link ClientConnectionManager#shutdown()}!
- *
- * @since 4.0
+ * @since 4.3
  */
-@SuppressWarnings("deprecation")
 @ThreadSafe
-public abstract class AbstractHttpClient implements HttpClient {
+public abstract class BasicHttpClient implements HttpClient {
 
     private final Log log = LogFactory.getLog(getClass());
 
-    /** The parameters. */
-    @GuardedBy("this")
-    private HttpParams defaultParams;
+    private final HttpClientRequestExecutor requestExecutor;
 
-    /** The request executor. */
-    @GuardedBy("this")
-    private HttpRequestExecutor requestExec;
-
-    /** The connection manager. */
-    @GuardedBy("this")
-    private ClientConnectionManager connManager;
-
-    /** The connection re-use strategy. */
-    @GuardedBy("this")
-    private ConnectionReuseStrategy reuseStrategy;
-
-    /** The connection keep-alive strategy. */
-    @GuardedBy("this")
-    private ConnectionKeepAliveStrategy keepAliveStrategy;
-
-    /** The cookie spec registry. */
-    @GuardedBy("this")
-    private CookieSpecRegistry supportedCookieSpecs;
-
-    /** The authentication scheme registry. */
-    @GuardedBy("this")
-    private AuthSchemeRegistry supportedAuthSchemes;
-
-    /** The HTTP protocol processor and its immutable copy. */
-    @GuardedBy("this")
-    private BasicHttpProcessor mutableProcessor;
-
-    @GuardedBy("this")
-    private ImmutableHttpProcessor protocolProcessor;
-
-    /** The request retry handler. */
-    @GuardedBy("this")
-    private HttpRequestRetryHandler retryHandler;
-
-    /** The redirect handler. */
-    @GuardedBy("this")
-    private RedirectStrategy redirectStrategy;
-
-    /** The target authentication handler. */
-    @GuardedBy("this")
-    private AuthenticationStrategy targetAuthStrategy;
-
-    /** The proxy authentication handler. */
-    @GuardedBy("this")
-    private AuthenticationStrategy proxyAuthStrategy;
-
-    /** The cookie store. */
-    @GuardedBy("this")
-    private CookieStore cookieStore;
-
-    /** The credentials provider. */
-    @GuardedBy("this")
-    private CredentialsProvider credsProvider;
-
-    /** The route planner. */
-    @GuardedBy("this")
-    private HttpRoutePlanner routePlanner;
-
-    /** The user token handler. */
-    @GuardedBy("this")
-    private UserTokenHandler userTokenHandler;
-
-    /** The connection backoff strategy. */
-    @GuardedBy("this")
-    private ConnectionBackoffStrategy connectionBackoffStrategy;
-
-    /** The backoff manager. */
-    @GuardedBy("this")
-    private BackoffManager backoffManager;
-
-    /**
-     * Creates a new HTTP client.
-     *
-     * @param conman    the connection manager
-     * @param params    the parameters
-     */
-    protected AbstractHttpClient(
-            final ClientConnectionManager conman,
-            final HttpParams params) {
-        defaultParams        = params;
-        connManager          = conman;
-    } // constructor
-
-
-    protected abstract HttpParams createHttpParams();
-
-
-    protected abstract BasicHttpProcessor createHttpProcessor();
-
-
-    protected HttpContext createHttpContext() {
-        HttpContext context = new BasicHttpContext();
-        context.setAttribute(
-                ClientContext.SCHEME_REGISTRY,
-                getConnectionManager().getSchemeRegistry());
-        context.setAttribute(
-                ClientContext.AUTHSCHEME_REGISTRY,
-                getAuthSchemes());
-        context.setAttribute(
-                ClientContext.COOKIESPEC_REGISTRY,
-                getCookieSpecs());
-        context.setAttribute(
-                ClientContext.COOKIE_STORE,
-                getCookieStore());
-        context.setAttribute(
-                ClientContext.CREDS_PROVIDER,
-                getCredentialsProvider());
-        return context;
-    }
-
-
-    protected ClientConnectionManager createClientConnectionManager() {
-        SchemeRegistry registry = SchemeRegistryFactory.createDefault();
-
-        ClientConnectionManager connManager = null;
-        HttpParams params = getParams();
-
-        ClientConnectionManagerFactory factory = null;
-
-        String className = (String) params.getParameter(
-                ClientPNames.CONNECTION_MANAGER_FACTORY_CLASS_NAME);
-        if (className != null) {
-            try {
-                Class<?> clazz = Class.forName(className);
-                factory = (ClientConnectionManagerFactory) clazz.newInstance();
-            } catch (ClassNotFoundException ex) {
-                throw new IllegalStateException("Invalid class name: " + className);
-            } catch (IllegalAccessException ex) {
-                throw new IllegalAccessError(ex.getMessage());
-            } catch (InstantiationException ex) {
-                throw new InstantiationError(ex.getMessage());
-            }
-        }
-        if (factory != null) {
-            connManager = factory.newInstance(params, registry);
-        } else {
-            connManager = new BasicClientConnectionManager(registry);
-        }
-
-        return connManager;
-    }
-
-
-    protected AuthSchemeRegistry createAuthSchemeRegistry() {
-        AuthSchemeRegistry registry = new AuthSchemeRegistry();
-        registry.register(
-                AuthPolicy.BASIC,
-                new BasicSchemeFactory());
-        registry.register(
-                AuthPolicy.DIGEST,
-                new DigestSchemeFactory());
-        registry.register(
-                AuthPolicy.NTLM,
-                new NTLMSchemeFactory());
-        registry.register(
-                AuthPolicy.SPNEGO,
-                new SPNegoSchemeFactory());
-        registry.register(
-                AuthPolicy.KERBEROS,
-                new KerberosSchemeFactory());
-        return registry;
-    }
-
-
-    protected CookieSpecRegistry createCookieSpecRegistry() {
-        CookieSpecRegistry registry = new CookieSpecRegistry();
-        registry.register(
-                CookiePolicy.BEST_MATCH,
-                new BestMatchSpecFactory());
-        registry.register(
-                CookiePolicy.BROWSER_COMPATIBILITY,
-                new BrowserCompatSpecFactory());
-        registry.register(
-                CookiePolicy.NETSCAPE,
-                new NetscapeDraftSpecFactory());
-        registry.register(
-                CookiePolicy.RFC_2109,
-                new RFC2109SpecFactory());
-        registry.register(
-                CookiePolicy.RFC_2965,
-                new RFC2965SpecFactory());
-        registry.register(
-                CookiePolicy.IGNORE_COOKIES,
-                new IgnoreSpecFactory());
-        return registry;
-    }
-
-    protected HttpRequestExecutor createRequestExecutor() {
-        return new HttpRequestExecutor();
-    }
-
-    protected ConnectionReuseStrategy createConnectionReuseStrategy() {
-        return new DefaultConnectionReuseStrategy();
-    }
-
-    protected ConnectionKeepAliveStrategy createConnectionKeepAliveStrategy() {
-        return new DefaultConnectionKeepAliveStrategy();
-    }
-
-    protected HttpRequestRetryHandler createHttpRequestRetryHandler() {
-        return new DefaultHttpRequestRetryHandler();
-    }
-
-    /**
-     * @deprecated (4.1) do not use
-     */
-    @Deprecated 
-    protected RedirectHandler createRedirectHandler() {
-        return new DefaultRedirectHandler();
-    }
-
-    protected AuthenticationStrategy createTargetAuthenticationStrategy() {
-        return new TargetAuthenticationStrategy();
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    protected AuthenticationHandler createTargetAuthenticationHandler() {
-        return new DefaultTargetAuthenticationHandler();
-    }
-
-    protected AuthenticationStrategy createProxyAuthenticationStrategy() {
-        return new ProxyAuthenticationStrategy();
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    protected AuthenticationHandler createProxyAuthenticationHandler() {
-        return new DefaultProxyAuthenticationHandler();
-    }
-
-    protected CookieStore createCookieStore() {
-        return new BasicCookieStore();
-    }
-
-    protected CredentialsProvider createCredentialsProvider() {
-        return new BasicCredentialsProvider();
-    }
-
-    protected HttpRoutePlanner createHttpRoutePlanner() {
-        return new DefaultHttpRoutePlanner(getConnectionManager().getSchemeRegistry());
-    }
-
-    protected UserTokenHandler createUserTokenHandler() {
-        return new DefaultUserTokenHandler();
-    }
-
-    // non-javadoc, see interface HttpClient
-    public synchronized final HttpParams getParams() {
-        if (defaultParams == null) {
-            defaultParams = createHttpParams();
-        }
-        return defaultParams;
-    }
-
-    /**
-     * Replaces the parameters.
-     * The implementation here does not update parameters of dependent objects.
-     *
-     * @param params    the new default parameters
-     */
-    public synchronized void setParams(HttpParams params) {
-        defaultParams = params;
-    }
-
-
-    public synchronized final ClientConnectionManager getConnectionManager() {
-        if (connManager == null) {
-            connManager = createClientConnectionManager();
-        }
-        return connManager;
-    }
-
-
-    public synchronized final HttpRequestExecutor getRequestExecutor() {
-        if (requestExec == null) {
-            requestExec = createRequestExecutor();
-        }
-        return requestExec;
-    }
-
-
-    public synchronized final AuthSchemeRegistry getAuthSchemes() {
-        if (supportedAuthSchemes == null) {
-            supportedAuthSchemes = createAuthSchemeRegistry();
-        }
-        return supportedAuthSchemes;
-    }
-
-    public synchronized void setAuthSchemes(final AuthSchemeRegistry registry) {
-        supportedAuthSchemes = registry;
-    }
-
-    public synchronized final ConnectionBackoffStrategy getConnectionBackoffStrategy() {
-        return connectionBackoffStrategy;
-    }
-
-    public synchronized void setConnectionBackoffStrategy(final ConnectionBackoffStrategy strategy) {
-        connectionBackoffStrategy = strategy;
-    }
-
-    public synchronized final CookieSpecRegistry getCookieSpecs() {
-        if (supportedCookieSpecs == null) {
-            supportedCookieSpecs = createCookieSpecRegistry();
-        }
-        return supportedCookieSpecs;
-    }
-
-    public synchronized final BackoffManager getBackoffManager() {
-        return backoffManager;
-    }
-
-    public synchronized void setBackoffManager(final BackoffManager manager) {
-        backoffManager = manager;
-    }
-
-    public synchronized void setCookieSpecs(final CookieSpecRegistry registry) {
-        supportedCookieSpecs = registry;
-    }
-
-    public synchronized final ConnectionReuseStrategy getConnectionReuseStrategy() {
-        if (reuseStrategy == null) {
-            reuseStrategy = createConnectionReuseStrategy();
-        }
-        return reuseStrategy;
-    }
-
-
-    public synchronized void setReuseStrategy(final ConnectionReuseStrategy strategy) {
-        this.reuseStrategy = strategy;
-    }
-
-
-    public synchronized final ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy() {
-        if (keepAliveStrategy == null) {
-            keepAliveStrategy = createConnectionKeepAliveStrategy();
-        }
-        return keepAliveStrategy;
-    }
-
-
-    public synchronized void setKeepAliveStrategy(final ConnectionKeepAliveStrategy strategy) {
-        this.keepAliveStrategy = strategy;
-    }
-
-
-    public synchronized final HttpRequestRetryHandler getHttpRequestRetryHandler() {
-        if (retryHandler == null) {
-            retryHandler = createHttpRequestRetryHandler();
-        }
-        return retryHandler;
-    }
-
-    public synchronized void setHttpRequestRetryHandler(final HttpRequestRetryHandler handler) {
-        this.retryHandler = handler;
-    }
-
-    /**
-     * @deprecated (4.1) do not use
-     */
-    @Deprecated 
-    public synchronized final RedirectHandler getRedirectHandler() {
-        return createRedirectHandler();
-    }
-
-    /**
-     * @deprecated (4.1) do not use
-     */
-    @Deprecated 
-    public synchronized void setRedirectHandler(final RedirectHandler handler) {
-        this.redirectStrategy = new DefaultRedirectStrategyAdaptor(handler);
-    }
-
-    /**
-     * @since 4.1
-     */
-    public synchronized final RedirectStrategy getRedirectStrategy() {
-        if (redirectStrategy == null) {
-            redirectStrategy = new DefaultRedirectStrategy();
-        }
-        return redirectStrategy;
-    }
-
-    /**
-     * @since 4.1
-     */
-    public synchronized void setRedirectStrategy(final RedirectStrategy strategy) {
-        this.redirectStrategy = strategy;
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    public synchronized final AuthenticationHandler getTargetAuthenticationHandler() {
-        return createTargetAuthenticationHandler();
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    public synchronized void setTargetAuthenticationHandler(final AuthenticationHandler handler) {
-        this.targetAuthStrategy = new AuthenticationStrategyAdaptor(handler);
-    }
-
-    /**
-     * @since 4.2
-     */
-    public synchronized final AuthenticationStrategy getTargetAuthenticationStrategy() {
-        if (targetAuthStrategy == null) {
-            targetAuthStrategy = createTargetAuthenticationStrategy();
-        }
-        return targetAuthStrategy;
-    }
-
-    /**
-     * @since 4.2
-     */
-    public synchronized void setTargetAuthenticationStrategy(final AuthenticationStrategy strategy) {
-        this.targetAuthStrategy = strategy;
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    public synchronized final AuthenticationHandler getProxyAuthenticationHandler() {
-        return createProxyAuthenticationHandler();
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    public synchronized void setProxyAuthenticationHandler(final AuthenticationHandler handler) {
-        this.proxyAuthStrategy = new AuthenticationStrategyAdaptor(handler);
-    }
-
-    /**
-     * @since 4.2
-     */
-    public synchronized final AuthenticationStrategy getProxyAuthenticationStrategy() {
-        if (proxyAuthStrategy == null) {
-            proxyAuthStrategy = createProxyAuthenticationStrategy();
-        }
-        return proxyAuthStrategy;
-    }
-
-    /**
-     * @since 4.2
-     */
-    public synchronized void setProxyAuthenticationStrategy(final AuthenticationStrategy strategy) {
-        this.proxyAuthStrategy = strategy;
-    }
-
-    public synchronized final CookieStore getCookieStore() {
-        if (cookieStore == null) {
-            cookieStore = createCookieStore();
-        }
-        return cookieStore;
-    }
-
-    public synchronized void setCookieStore(final CookieStore cookieStore) {
-        this.cookieStore = cookieStore;
-    }
-
-    public synchronized final CredentialsProvider getCredentialsProvider() {
-        if (credsProvider == null) {
-            credsProvider = createCredentialsProvider();
-        }
-        return credsProvider;
-    }
-
-    public synchronized void setCredentialsProvider(final CredentialsProvider credsProvider) {
-        this.credsProvider = credsProvider;
-    }
-
-    public synchronized final HttpRoutePlanner getRoutePlanner() {
-        if (this.routePlanner == null) {
-            this.routePlanner = createHttpRoutePlanner();
-        }
-        return this.routePlanner;
-    }
-
-    public synchronized void setRoutePlanner(final HttpRoutePlanner routePlanner) {
-        this.routePlanner = routePlanner;
-    }
-
-    public synchronized final UserTokenHandler getUserTokenHandler() {
-        if (this.userTokenHandler == null) {
-            this.userTokenHandler = createUserTokenHandler();
-        }
-        return this.userTokenHandler;
-    }
-
-    public synchronized void setUserTokenHandler(final UserTokenHandler handler) {
-        this.userTokenHandler = handler;
-    }
-
-    protected synchronized final BasicHttpProcessor getHttpProcessor() {
-        if (mutableProcessor == null) {
-            mutableProcessor = createHttpProcessor();
-        }
-        return mutableProcessor;
-    }
-
-    private synchronized final HttpProcessor getProtocolProcessor() {
-        if (protocolProcessor == null) {
-            // Get mutable HTTP processor
-            BasicHttpProcessor proc = getHttpProcessor();
-            // and create an immutable copy of it
-            int reqc = proc.getRequestInterceptorCount();
-            HttpRequestInterceptor[] reqinterceptors = new HttpRequestInterceptor[reqc];
-            for (int i = 0; i < reqc; i++) {
-                reqinterceptors[i] = proc.getRequestInterceptor(i);
-            }
-            int resc = proc.getResponseInterceptorCount();
-            HttpResponseInterceptor[] resinterceptors = new HttpResponseInterceptor[resc];
-            for (int i = 0; i < resc; i++) {
-                resinterceptors[i] = proc.getResponseInterceptor(i);
-            }
-            protocolProcessor = new ImmutableHttpProcessor(reqinterceptors, resinterceptors);
+    public BasicHttpClient(final HttpClientRequestExecutor requestExecutor) {
+        super();
+        if (requestExecutor == null) {
+            throw new IllegalArgumentException("HTTP client request executor may not be null");
         }
-        return protocolProcessor;
-    }
-
-    public synchronized int getResponseInterceptorCount() {
-        return getHttpProcessor().getResponseInterceptorCount();
-    }
-
-    public synchronized HttpResponseInterceptor getResponseInterceptor(int index) {
-        return getHttpProcessor().getResponseInterceptor(index);
-    }
-
-    public synchronized HttpRequestInterceptor getRequestInterceptor(int index) {
-        return getHttpProcessor().getRequestInterceptor(index);
-    }
-
-    public synchronized int getRequestInterceptorCount() {
-        return getHttpProcessor().getRequestInterceptorCount();
-    }
-
-    public synchronized void addResponseInterceptor(final HttpResponseInterceptor itcp) {
-        getHttpProcessor().addInterceptor(itcp);
-        protocolProcessor = null;
-    }
-
-    public synchronized void addResponseInterceptor(final HttpResponseInterceptor itcp, int index) {
-        getHttpProcessor().addInterceptor(itcp, index);
-        protocolProcessor = null;
-    }
-
-    public synchronized void clearResponseInterceptors() {
-        getHttpProcessor().clearResponseInterceptors();
-        protocolProcessor = null;
+        this.requestExecutor = requestExecutor;
     }
 
-    public synchronized void removeResponseInterceptorByClass(Class<? extends HttpResponseInterceptor> clazz) {
-        getHttpProcessor().removeResponseInterceptorByClass(clazz);
-        protocolProcessor = null;
-    }
-
-    public synchronized void addRequestInterceptor(final HttpRequestInterceptor itcp) {
-        getHttpProcessor().addInterceptor(itcp);
-        protocolProcessor = null;
-    }
-
-    public synchronized void addRequestInterceptor(final HttpRequestInterceptor itcp, int index) {
-        getHttpProcessor().addInterceptor(itcp, index);
-        protocolProcessor = null;
-    }
-
-    public synchronized void clearRequestInterceptors() {
-        getHttpProcessor().clearRequestInterceptors();
-        protocolProcessor = null;
-    }
-
-    public synchronized void removeRequestInterceptorByClass(Class<? extends HttpRequestInterceptor> clazz) {
-        getHttpProcessor().removeRequestInterceptorByClass(clazz);
-        protocolProcessor = null;
-    }
-
-    public final HttpResponse execute(HttpUriRequest request)
-        throws IOException, ClientProtocolException {
-
-        return execute(request, (HttpContext) null);
-    }
-
-    /**
-     * Maps to {@link HttpClient#execute(HttpHost,HttpRequest,HttpContext)
-     *                           execute(target, request, context)}.
-     * The target is determined from the URI of the request.
-     *
-     * @param request   the request to execute
-     * @param context   the request-specific execution context,
-     *                  or <code>null</code> to use a default context
-     */
-    public final HttpResponse execute(HttpUriRequest request,
-                                      HttpContext context)
-        throws IOException, ClientProtocolException {
-
+    public final HttpResponse execute(
+            final HttpUriRequest request, 
+            final HttpContext context) throws IOException, ClientProtocolException {
         if (request == null) {
-            throw new IllegalArgumentException
-                ("Request must not be null.");
+            throw new IllegalArgumentException("Request must not be null.");
         }
-
         return execute(determineTarget(request), request, context);
     }
 
@@ -814,253 +86,64 @@ public abstract class AbstractHttpClient
         if (requestURI.isAbsolute()) {
             target = URIUtils.extractHost(requestURI);
             if (target == null) {
-                throw new ClientProtocolException(
-                        "URI does not specify a valid host name: " + requestURI);
+                throw new ClientProtocolException("URI does not specify a valid host name: "
+                        + requestURI);
             }
         }
         return target;
     }
 
-    public final HttpResponse execute(HttpHost target, HttpRequest request)
-        throws IOException, ClientProtocolException {
-
+    public final HttpResponse execute(
+            final HttpHost target, 
+            final HttpRequest request) throws IOException, ClientProtocolException {
         return execute(target, request, (HttpContext) null);
     }
 
-    public final HttpResponse execute(HttpHost target, HttpRequest request,
-                                      HttpContext context)
-        throws IOException, ClientProtocolException {
-
+    public final HttpResponse execute(
+            final HttpHost target, 
+            final HttpRequest request, 
+            final HttpContext context) throws IOException, ClientProtocolException {
         if (request == null) {
-            throw new IllegalArgumentException
-                ("Request must not be null.");
+            throw new IllegalArgumentException("Request must not be null.");
         }
-        // a null target may be acceptable, this depends on the route planner
-        // a null context is acceptable, default context created below
-
-        HttpContext execContext = null;
-        RequestDirector director = null;
-        HttpRoutePlanner routePlanner = null;
-        ConnectionBackoffStrategy connectionBackoffStrategy = null;
-        BackoffManager backoffManager = null;
-
-        // Initialize the request execution context making copies of
-        // all shared objects that are potentially threading unsafe.
-        synchronized (this) {
-
-            HttpContext defaultContext = createHttpContext();
-            if (context == null) {
-                execContext = defaultContext;
-            } else {
-                execContext = new DefaultedHttpContext(context, defaultContext);
-            }
-            // Create a director for this request
-            director = createClientRequestDirector(
-                    getRequestExecutor(),
-                    getConnectionManager(),
-                    getConnectionReuseStrategy(),
-                    getConnectionKeepAliveStrategy(),
-                    getRoutePlanner(),
-                    getProtocolProcessor(),
-                    getHttpRequestRetryHandler(),
-                    getRedirectStrategy(),
-                    getTargetAuthenticationStrategy(),
-                    getProxyAuthenticationStrategy(),
-                    getUserTokenHandler(),
-                    determineParams(request));
-            routePlanner = getRoutePlanner();
-            connectionBackoffStrategy = getConnectionBackoffStrategy();
-            backoffManager = getBackoffManager();
-        }
-
         try {
-            if (connectionBackoffStrategy != null && backoffManager != null) {
-                HttpHost targetForRoute = (target != null) ? target
-                        : (HttpHost) determineParams(request).getParameter(
-                                ClientPNames.DEFAULT_HOST);
-                HttpRoute route = routePlanner.determineRoute(targetForRoute, request, execContext);
-
-                HttpResponse out;
-                try {
-                    out = director.execute(target, request, execContext);
-                } catch (RuntimeException re) {
-                    if (connectionBackoffStrategy.shouldBackoff(re)) {
-                        backoffManager.backOff(route);
-                    }
-                    throw re;
-                } catch (Exception e) {
-                    if (connectionBackoffStrategy.shouldBackoff(e)) {
-                        backoffManager.backOff(route);
-                    }
-                    if (e instanceof HttpException) throw (HttpException)e;
-                    if (e instanceof IOException) throw (IOException)e;
-                    throw new UndeclaredThrowableException(e);
-                }
-                if (connectionBackoffStrategy.shouldBackoff(out)) {
-                    backoffManager.backOff(route);
-                } else {
-                    backoffManager.probe(route);
-                }
-                return out;
+            HttpContext execContext = context != null ? context : new BasicHttpContext();
+            RequestWrapper wrapper;
+            if (request instanceof HttpEntityEnclosingRequest) {
+                wrapper = new EntityEnclosingRequestWrapper((HttpEntityEnclosingRequest) request);
             } else {
-                return director.execute(target, request, execContext);
+                wrapper = new RequestWrapper(request);
             }
-        } catch(HttpException httpException) {
+            return this.requestExecutor.execute(target, wrapper, execContext);
+        } catch (HttpException httpException) {
             throw new ClientProtocolException(httpException);
         }
     }
 
-    /**
-     * @deprecated (4.1) do not use
-     */
-    @Deprecated
-    protected RequestDirector createClientRequestDirector(
-            final HttpRequestExecutor requestExec,
-            final ClientConnectionManager conman,
-            final ConnectionReuseStrategy reustrat,
-            final ConnectionKeepAliveStrategy kastrat,
-            final HttpRoutePlanner rouplan,
-            final HttpProcessor httpProcessor,
-            final HttpRequestRetryHandler retryHandler,
-            final RedirectHandler redirectHandler,
-            final AuthenticationHandler targetAuthHandler,
-            final AuthenticationHandler proxyAuthHandler,
-            final UserTokenHandler userTokenHandler,
-            final HttpParams params) {
-        return new DefaultRequestDirector(
-                requestExec,
-                conman,
-                reustrat,
-                kastrat,
-                rouplan,
-                httpProcessor,
-                retryHandler,
-                redirectHandler,
-                targetAuthHandler,
-                proxyAuthHandler,
-                userTokenHandler,
-                params);
-    }
-
-    /**
-     * @deprecated (4.2) do not use
-     */
-    @Deprecated 
-    protected RequestDirector createClientRequestDirector(
-            final HttpRequestExecutor requestExec,
-            final ClientConnectionManager conman,
-            final ConnectionReuseStrategy reustrat,
-            final ConnectionKeepAliveStrategy kastrat,
-            final HttpRoutePlanner rouplan,
-            final HttpProcessor httpProcessor,
-            final HttpRequestRetryHandler retryHandler,
-            final RedirectStrategy redirectStrategy,
-            final AuthenticationHandler targetAuthHandler,
-            final AuthenticationHandler proxyAuthHandler,
-            final UserTokenHandler userTokenHandler,
-            final HttpParams params) {
-        return new DefaultRequestDirector(
-                log,
-                requestExec,
-                conman,
-                reustrat,
-                kastrat,
-                rouplan,
-                httpProcessor,
-                retryHandler,
-                redirectStrategy,
-                targetAuthHandler,
-                proxyAuthHandler,
-                userTokenHandler,
-                params);
-    }
-
-
-    /**
-     * @since 4.2
-     */
-    protected RequestDirector createClientRequestDirector(
-            final HttpRequestExecutor requestExec,
-            final ClientConnectionManager conman,
-            final ConnectionReuseStrategy reustrat,
-            final ConnectionKeepAliveStrategy kastrat,
-            final HttpRoutePlanner rouplan,
-            final HttpProcessor httpProcessor,
-            final HttpRequestRetryHandler retryHandler,
-            final RedirectStrategy redirectStrategy,
-            final AuthenticationStrategy targetAuthStrategy,
-            final AuthenticationStrategy proxyAuthStrategy,
-            final UserTokenHandler userTokenHandler,
-            final HttpParams params) {
-        return new DefaultRequestDirector(
-                log,
-                requestExec,
-                conman,
-                reustrat,
-                kastrat,
-                rouplan,
-                httpProcessor,
-                retryHandler,
-                redirectStrategy,
-                targetAuthStrategy,
-                proxyAuthStrategy,
-                userTokenHandler,
-                params);
-    }
-
-    /**
-     * Obtains parameters for executing a request.
-     * The default implementation in this class creates a new
-     * {@link ClientParamsStack} from the request parameters
-     * and the client parameters.
-     * <br/>
-     * This method is called by the default implementation of
-     * {@link #execute(HttpHost,HttpRequest,HttpContext)}
-     * to obtain the parameters for the
-     * {@link DefaultRequestDirector}.
-     *
-     * @param req    the request that will be executed
-     *
-     * @return  the parameters to use
-     */
-    protected HttpParams determineParams(HttpRequest req) {
-        return new ClientParamsStack
-            (null, getParams(), req.getParams(), null);
-    }
-
-    public <T> T execute(
-            final HttpUriRequest request,
-            final ResponseHandler<? extends T> responseHandler)
-                throws IOException, ClientProtocolException {
+    public <T> T execute(final HttpUriRequest request,
+            final ResponseHandler<? extends T> responseHandler) throws IOException,
+            ClientProtocolException {
         return execute(request, responseHandler, null);
     }
 
-    public <T> T execute(
-            final HttpUriRequest request,
-            final ResponseHandler<? extends T> responseHandler,
-            final HttpContext context)
-                throws IOException, ClientProtocolException {
+    public <T> T execute(final HttpUriRequest request,
+            final ResponseHandler<? extends T> responseHandler, final HttpContext context)
+            throws IOException, ClientProtocolException {
         HttpHost target = determineTarget(request);
         return execute(target, request, responseHandler, context);
     }
 
-    public <T> T execute(
-            final HttpHost target,
-            final HttpRequest request,
-            final ResponseHandler<? extends T> responseHandler)
-                throws IOException, ClientProtocolException {
+    public <T> T execute(final HttpHost target, final HttpRequest request,
+            final ResponseHandler<? extends T> responseHandler) throws IOException,
+            ClientProtocolException {
         return execute(target, request, responseHandler, null);
     }
 
-    public <T> T execute(
-            final HttpHost target,
-            final HttpRequest request,
-            final ResponseHandler<? extends T> responseHandler,
-            final HttpContext context)
-                throws IOException, ClientProtocolException {
+    public <T> T execute(final HttpHost target, final HttpRequest request,
+            final ResponseHandler<? extends T> responseHandler, final HttpContext context)
+            throws IOException, ClientProtocolException {
         if (responseHandler == null) {
-            throw new IllegalArgumentException
-                ("Response handler must not be null.");
+            throw new IllegalArgumentException("Response handler must not be null.");
         }
 
         HttpResponse response = execute(target, request, context);



Mime
View raw message