Changes since 4.0 Alpha 4 ------------------- * HttpClient will throw an exception if an attempt is made to retry a request with a non-repeatable request entity. Contributed by Oleg Kalnichevski * Fixed request re-generation logic when retrying a failed request. Auto-generated headers will no accumulate. Contributed by Oleg Kalnichevski * [HTTPCLIENT-424] Preemptive authentication no longer limited to BASIC scheme only. HttpClient can be customized to authenticate preemptively with DIGEST scheme. Contributed by Oleg Kalnichevski * [HTTPCLIENT-670] Pluggable hostname resolver. Contributed by Oleg Kalnichevski * [HTTPCLIENT-719] Clone support for HTTP request and cookie objects. Contributed by Oleg Kalnichevski * [HTTPCLIENT-776] Fixed concurrency issues with AbstractPoolEntry. Contributed by Sam Berlin * Resolved a long standing problem with HttpClient not taking into account the user context when pooling / re-using connections. HttpClient now correctly handles stateful / user specific connections such as persistent NTLM connections and SSL connections with client side authentication. Contributed by Oleg Kalnichevski * [HTTPCLIENT-773] Improved handling of the 'expires' attribute by the 'Best Match' cookie spec. Contributed by Oleg Kalnichevski * Partial NTLM support (requires an external NTLM engine). For details see NTLM_SUPPORT.txt Contributed by Oleg Kalnichevski * Redesigned local execution context management. Contributed by Oleg Kalnichevski -------------------------------------- Release 4.0 Alpha 4 ------------------- ALPHA4 marks the completion of the overhaul of the connection management code in HttpClient. All known shortcomings of the old HttpClient 3.x connection management API have been addressed. NTLM authentication remains the only missing major feature in the new codeline that prevents us from moving awards the API freeze. There has been a number of important bug fixes since ALPHA3. All upstream projects are encouraged to upgrade to the latest release. ------------------- HttpClient 3.x features that have NOT yet been ported: ------------------- * NTLM authentication scheme ------------------- Changelog: ------------------- * [HTTPCLIENT-765] String.toLowerCase() / toUpperCase() should specify Locale.ENGLISH Contributed by Sebastian Bazley * [HTTPCLIENT-769] Do not pool connection marked non-reusable. Contributed by Oleg Kalnichevski * [HTTPCLIENT-763] Fixed problem with AbstractClientConnAdapter#abortConnection() not releasing the connection if called from the main execution thread while there is no blocking I/O operation. Contributed by Oleg Kalnichevski * [HTTPCLIENT-652] Added optional state attribute to managed client connections. This enables connection managers to correctly handle stateful connections. Contributed by Oleg Kalnichevski * [HTTPCLIENT-673] Revised max connections per route configuration Contributed by Oleg Kalnichevski * [HTTPCLIENT-753] Class Scheme and related classes moved to a separate package Contributed by Oleg Kalnichevski * [HTTPCLIENT-757] Improved request wrapping in the DefaultClientRequestDirector. This also fixed the problem with the default proxy set at the client level having no effect. Contributed by Oleg Kalnichevski * [HTTPCLIENT-734] Request abort will unblock the thread waiting for a connection Contributed by Sam Berlin * [HTTPCLIENT-759] Ensure release of connections back to the connection manager on exceptions. Contributed by Sam Berlin * [HTTPCLIENT-758] Fixed the use of generics in AbstractHttpClient #removeRequestInterceptorByClass and #removeResponseInterceptorByClass Contributed by Johannes Koch * [HTTPCLIENT-749] HttpParams beans Contributed by Stojce Dimski * [HTTPCLIENT-755] Workaround for known bugs in java.net.URI.resolve() Bug ID: 4708535 Contributed by Johannes Koch HttpClient API changes (generated by JarDiff 0.2) -------------------------------------- Class removed: public org.apache.http.client.methods.UrlEncodedFormEntity extends org.apache.http.entity.AbstractHttpEntity Class removed: public org.apache.http.client.utils.URLUtils extends java.lang.Object Class removed: public abstract org.apache.http.conn.LayeredSocketFactory extends java.lang.Object implements org.apache.http.conn.SocketFactory Class removed: public final org.apache.http.conn.PlainSocketFactory extends java.lang.Object implements org.apache.http.conn.SocketFactory Class removed: public final org.apache.http.conn.Scheme extends java.lang.Object Class removed: public final org.apache.http.conn.SchemeRegistry extends java.lang.Object Class removed: public abstract org.apache.http.conn.SocketFactory extends java.lang.Object Class removed: public org.apache.http.conn.util.SocketUtils extends java.lang.Object Class removed: public org.apache.http.impl.client.RoutedRequest.Impl extends java.lang.Object implements org.apache.http.impl.client.RoutedRequest Class added: public org.apache.http.auth.params.AuthParamBean extends org.apache.http.params.HttpAbstractParamBean Class added: public org.apache.http.client.entity.UrlEncodedFormEntity extends org.apache.http.entity.StringEntity Class added: public org.apache.http.client.params.ClientParamBean extends org.apache.http.params.HttpAbstractParamBean Class added: public org.apache.http.client.protocol.ClientContextConfigurer extends java.lang.Object Class added: public org.apache.http.client.utils.URIUtils extends java.lang.Object Class added: public org.apache.http.client.utils.URLEncodedUtils extends java.lang.Object Class added: public abstract org.apache.http.conn.ClientConnectionRequest extends java.lang.Object Class added: public final org.apache.http.conn.MultihomePlainSocketFactory extends java.lang.Object implements org.apache.http.conn.scheme.SocketFactory Class added: public org.apache.http.conn.params.ConnConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean Class added: public org.apache.http.conn.params.ConnManagerParamBean extends org.apache.http.params.HttpAbstractParamBean Class added: public abstract org.apache.http.conn.params.ConnPerRoute extends java.lang.Object Class added: public final org.apache.http.conn.params.ConnPerRouteBean extends java.lang.Object implements org.apache.http.conn.params.ConnPerRoute Class added: public org.apache.http.conn.params.ConnRouteParamBean extends org.apache.http.params.HttpAbstractParamBean Class added: public abstract org.apache.http.conn.scheme.LayeredSocketFactory extends java.lang.Object implements org.apache.http.conn.scheme.SocketFactory Class added: public final org.apache.http.conn.scheme.PlainSocketFactory extends java.lang.Object implements org.apache.http.conn.scheme.SocketFactory Class added: public final org.apache.http.conn.scheme.Scheme extends java.lang.Object Class added: public final org.apache.http.conn.scheme.SchemeRegistry extends java.lang.Object Class added: public abstract org.apache.http.conn.scheme.SocketFactory extends java.lang.Object Class added: public org.apache.http.cookie.params.CookieSpecParamBean extends org.apache.http.params.HttpAbstractParamBean Class added: public org.apache.http.impl.conn.tsccm.Aborter extends java.lang.Object Class added: public abstract org.apache.http.impl.conn.tsccm.PoolEntryRequest extends java.lang.Object Class added: public org.apache.http.impl.conn.tsccm.WaitingThreadAborter extends java.lang.Object Class changed: org.apache.http.auth.AuthSchemeRegistry Methods added: public synchronized void setItems(java.util.Map); Class changed: org.apache.http.client.ClientRequestDirector Methods removed: public abstract org.apache.http.conn.ManagedClientConnection getConnection(); Method changed: old: public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Class changed: org.apache.http.client.HttpClient Method changed: old: public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public abstract org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public abstract org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public abstract org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public abstract org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Class changed: org.apache.http.client.methods.AbortableHttpRequest Methods added: public abstract void setConnectionRequest(org.apache.http.conn.ClientConnectionRequest) throws java.io.IOException; Method changed: old: public abstract void setReleaseTrigger(org.apache.http.conn.ConnectionReleaseTrigger); new: public abstract void setReleaseTrigger(org.apache.http.conn.ConnectionReleaseTrigger) throws java.io.IOException; Class changed: org.apache.http.conn.ClientConnectionManager Methods removed: public abstract org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute) throws java.lang.InterruptedException; public abstract org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute, long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; public abstract org.apache.http.params.HttpParams getParams(); public abstract org.apache.http.conn.SchemeRegistry getSchemeRegistry(); Methods added: public abstract org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry(); public abstract org.apache.http.conn.ClientConnectionRequest requestConnection(org.apache.http.conn.routing.HttpRoute, java.lang.Object); Class changed: org.apache.http.conn.ClientConnectionManagerFactory Methods removed: public abstract org.apache.http.conn.ClientConnectionManager newInstance(org.apache.http.params.HttpParams, org.apache.http.conn.SchemeRegistry); Methods added: public abstract org.apache.http.conn.ClientConnectionManager newInstance(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry); Class changed: org.apache.http.conn.ManagedClientConnection Methods added: public abstract java.lang.Object getState(); public abstract void setState(java.lang.Object); Class changed: org.apache.http.conn.OperatedClientConnection Methods removed: public abstract void announce(java.net.Socket); public abstract void open(java.net.Socket, org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException; Methods added: public abstract void openCompleted(boolean, org.apache.http.params.HttpParams) throws java.io.IOException; public abstract void opening(java.net.Socket, org.apache.http.HttpHost) throws java.io.IOException; Class changed: org.apache.http.conn.params.ConnManagerPNames Fields removed: public final static java.lang.String MAX_HOST_CONNECTIONS = http.connection-manager.max-per-host; Fields added: public final static java.lang.String MAX_CONNECTIONS_PER_ROUTE = http.conn-manager.max-per-route; Field changed: old: public final static java.lang.String MAX_TOTAL_CONNECTIONS = http.connection-manager.max-total; new: public final static java.lang.String MAX_TOTAL_CONNECTIONS = http.conn-manager.max-total; Class changed: org.apache.http.conn.params.HttpConnectionManagerParams Methods removed: public static int getDefaultMaxConnectionsPerHost(org.apache.http.params.HttpParams); public static int getMaxConnectionsPerHost(org.apache.http.params.HttpParams, org.apache.http.conn.routing.HttpRoute); public static void setDefaultMaxConnectionsPerHost(org.apache.http.params.HttpParams, int); public static void setMaxConnectionsPerHost(org.apache.http.params.HttpParams, org.apache.http.conn.routing.HttpRoute, int); Methods added: public static org.apache.http.conn.params.ConnPerRoute getMaxConnectionsPerRoute(org.apache.http.params.HttpParams); public static void setMaxConnectionsPerRoute(org.apache.http.params.HttpParams, org.apache.http.conn.params.ConnPerRoute); Fields removed: public final static int DEFAULT_MAX_HOST_CONNECTIONS = 2; Class descriptor changed: old: public final org.apache.http.conn.params.HttpConnectionManagerParams extends java.lang.Object new: public final org.apache.http.conn.params.HttpConnectionManagerParams extends java.lang.Object implements org.apache.http.conn.params.ConnManagerPNames Class changed: org.apache.http.conn.ssl.SSLSocketFactory Class descriptor changed: old: public org.apache.http.conn.ssl.SSLSocketFactory extends java.lang.Object implements org.apache.http.conn.LayeredSocketFactory new: public org.apache.http.conn.ssl.SSLSocketFactory extends java.lang.Object implements org.apache.http.conn.scheme.LayeredSocketFactory Class changed: org.apache.http.conn.util.InetAddressUtils Methods removed: public InetAddressUtils(); Class changed: org.apache.http.cookie.CookieSpecRegistry Methods added: public synchronized void setItems(java.util.Map); Class changed: org.apache.http.impl.client.AbstractHttpClient Methods added: protected org.apache.http.client.ClientRequestDirector createClientRequestDirector(org.apache.http.conn.ClientConnectionManager, org.apache.http.ConnectionReuseStrategy, org.apache.http.conn.routing.HttpRoutePlanner, org.apache.http.protocol.HttpProcessor, org.apache.http.client.HttpRequestRetryHandler, org.apache.http.client.RedirectHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.params.HttpParams); Method changed: old: public final org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public final org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public final org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public final org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public final org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public final org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public final org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public final org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Class changed: org.apache.http.impl.client.DefaultClientRequestDirector Methods removed: protected org.apache.http.conn.ManagedClientConnection allocateConnection(org.apache.http.conn.routing.HttpRoute, long) throws org.apache.http.HttpException, org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; protected org.apache.http.impl.client.RoutedRequest determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException; public org.apache.http.conn.ManagedClientConnection getConnection(); protected org.apache.http.impl.client.RoutedRequest handleResponse(org.apache.http.impl.client.RoutedRequest, org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Methods added: protected org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException; protected org.apache.http.impl.client.RoutedRequest handleResponse(org.apache.http.impl.client.RoutedRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Method changed: old: public org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException, java.lang.InterruptedException; new: public org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException; Class changed: org.apache.http.impl.client.RoutedRequest Methods removed: public abstract org.apache.http.HttpRequest getRequest(); Methods added: public RoutedRequest(org.apache.http.impl.client.RequestWrapper, org.apache.http.conn.routing.HttpRoute); public final org.apache.http.impl.client.RequestWrapper getRequest(); Fields added: protected final org.apache.http.impl.client.RequestWrapper request; protected final org.apache.http.conn.routing.HttpRoute route; Class descriptor changed: old: public abstract org.apache.http.impl.client.RoutedRequest extends java.lang.Object new: public org.apache.http.impl.client.RoutedRequest extends java.lang.Object Method changed: old: public abstract org.apache.http.conn.routing.HttpRoute getRoute(); new: public final org.apache.http.conn.routing.HttpRoute getRoute(); Class changed: org.apache.http.impl.conn.AbstractPoolEntry Methods removed: protected AbstractPoolEntry(org.apache.http.conn.OperatedClientConnection, org.apache.http.conn.routing.HttpRoute); protected abstract org.apache.http.conn.ClientConnectionOperator getOperator(); Methods added: protected AbstractPoolEntry(org.apache.http.conn.ClientConnectionOperator, org.apache.http.conn.routing.HttpRoute); public java.lang.Object getState(); public void setState(java.lang.Object); Fields removed: protected org.apache.http.conn.routing.HttpRoute plannedRoute; Fields added: protected final org.apache.http.conn.ClientConnectionOperator connOperator; protected volatile org.apache.http.conn.routing.HttpRoute route; protected volatile java.lang.Object state; Field changed: old: protected org.apache.http.conn.OperatedClientConnection connection; new: protected volatile org.apache.http.conn.OperatedClientConnection connection; Field changed: old: protected org.apache.http.conn.routing.RouteTracker tracker; new: protected volatile org.apache.http.conn.routing.RouteTracker tracker; Class changed: org.apache.http.impl.conn.AbstractPooledConnAdapter Methods added: public java.lang.Object getState(); public void setState(java.lang.Object); Field changed: old: protected org.apache.http.impl.conn.AbstractPoolEntry poolEntry; new: protected volatile org.apache.http.impl.conn.AbstractPoolEntry poolEntry; Class changed: org.apache.http.impl.conn.DefaultClientConnection Methods removed: public void announce(java.net.Socket); public void open(java.net.Socket, org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException; Methods added: public void openCompleted(boolean, org.apache.http.params.HttpParams) throws java.io.IOException; public void opening(java.net.Socket, org.apache.http.HttpHost); Class changed: org.apache.http.impl.conn.DefaultClientConnectionOperator Methods removed: public DefaultClientConnectionOperator(org.apache.http.conn.SchemeRegistry); Methods added: public DefaultClientConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry); Class changed: org.apache.http.impl.conn.DefaultHttpRoutePlanner Methods removed: public DefaultHttpRoutePlanner(org.apache.http.conn.SchemeRegistry); Methods added: public DefaultHttpRoutePlanner(org.apache.http.conn.scheme.SchemeRegistry); Class changed: org.apache.http.impl.conn.ProxySelectorRoutePlanner Methods removed: public ProxySelectorRoutePlanner(org.apache.http.conn.SchemeRegistry, java.net.ProxySelector); Methods added: public ProxySelectorRoutePlanner(org.apache.http.conn.scheme.SchemeRegistry, java.net.ProxySelector); Class changed: org.apache.http.impl.conn.SingleClientConnManager Methods removed: public SingleClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.SchemeRegistry); protected org.apache.http.conn.ClientConnectionOperator createConnectionOperator(org.apache.http.conn.SchemeRegistry); public org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute); public final org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute, long, java.util.concurrent.TimeUnit); public org.apache.http.params.HttpParams getParams(); public org.apache.http.conn.SchemeRegistry getSchemeRegistry(); Methods added: public SingleClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry); protected org.apache.http.conn.ClientConnectionOperator createConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry); protected void finalize() throws java.lang.Throwable; public org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute, java.lang.Object); public org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry(); public final org.apache.http.conn.ClientConnectionRequest requestConnection(org.apache.http.conn.routing.HttpRoute, java.lang.Object); Fields removed: protected org.apache.http.params.HttpParams params; Class changed: org.apache.http.impl.conn.SingleClientConnManager.PoolEntry Methods removed: protected SingleClientConnManager.PoolEntry(org.apache.http.impl.conn.SingleClientConnManager, org.apache.http.conn.OperatedClientConnection); protected org.apache.http.conn.ClientConnectionOperator getOperator(); Methods added: protected SingleClientConnManager.PoolEntry(org.apache.http.impl.conn.SingleClientConnManager); Class changed: org.apache.http.impl.conn.tsccm.AbstractConnPool Methods removed: protected AbstractConnPool(org.apache.http.conn.ClientConnectionManager); public abstract org.apache.http.impl.conn.tsccm.BasicPoolEntry getEntry(org.apache.http.conn.routing.HttpRoute, long, java.util.concurrent.TimeUnit, org.apache.http.conn.ClientConnectionOperator) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; Methods added: protected AbstractConnPool(); public final org.apache.http.impl.conn.tsccm.BasicPoolEntry getEntry(org.apache.http.conn.routing.HttpRoute, java.lang.Object, long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; public abstract org.apache.http.impl.conn.tsccm.PoolEntryRequest requestPoolEntry(org.apache.http.conn.routing.HttpRoute, java.lang.Object); Fields removed: protected org.apache.http.impl.conn.tsccm.AbstractConnPool.ConnMgrRef connManager; protected org.apache.http.params.HttpParams params; Class changed: org.apache.http.impl.conn.tsccm.BasicPoolEntry Methods removed: protected org.apache.http.conn.ClientConnectionOperator getOperator(); Class changed: org.apache.http.impl.conn.tsccm.ConnPoolByRoute Methods removed: public ConnPoolByRoute(org.apache.http.conn.ClientConnectionManager); public org.apache.http.impl.conn.tsccm.BasicPoolEntry getEntry(org.apache.http.conn.routing.HttpRoute, long, java.util.concurrent.TimeUnit, org.apache.http.conn.ClientConnectionOperator) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; protected org.apache.http.impl.conn.tsccm.BasicPoolEntry getFreeEntry(org.apache.http.impl.conn.tsccm.RouteSpecificPool); Methods added: public ConnPoolByRoute(org.apache.http.conn.ClientConnectionOperator, org.apache.http.params.HttpParams); protected org.apache.http.impl.conn.tsccm.BasicPoolEntry getEntryBlocking(org.apache.http.conn.routing.HttpRoute, java.lang.Object, long, java.util.concurrent.TimeUnit, org.apache.http.impl.conn.tsccm.WaitingThreadAborter) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; protected org.apache.http.impl.conn.tsccm.BasicPoolEntry getFreeEntry(org.apache.http.impl.conn.tsccm.RouteSpecificPool, java.lang.Object); public org.apache.http.impl.conn.tsccm.PoolEntryRequest requestPoolEntry(org.apache.http.conn.routing.HttpRoute, java.lang.Object); Fields added: protected final int maxTotalConnections; protected final org.apache.http.conn.ClientConnectionOperator operator; Class changed: org.apache.http.impl.conn.tsccm.RouteSpecificPool Methods removed: public RouteSpecificPool(org.apache.http.conn.routing.HttpRoute); public org.apache.http.impl.conn.tsccm.BasicPoolEntry allocEntry(); Methods added: public RouteSpecificPool(org.apache.http.conn.routing.HttpRoute, int); public org.apache.http.impl.conn.tsccm.BasicPoolEntry allocEntry(java.lang.Object); public int getCapacity(); public final int getMaxEntries(); Fields added: protected final int maxEntries; Class changed: org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager Methods removed: public ThreadSafeClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.SchemeRegistry); protected org.apache.http.conn.ClientConnectionOperator createConnectionOperator(org.apache.http.conn.SchemeRegistry); protected org.apache.http.impl.conn.tsccm.AbstractConnPool createConnectionPool(); public org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute) throws java.lang.InterruptedException; public org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute, long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException; public org.apache.http.params.HttpParams getParams(); public org.apache.http.conn.SchemeRegistry getSchemeRegistry(); Methods added: public ThreadSafeClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry); protected org.apache.http.conn.ClientConnectionOperator createConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry); protected org.apache.http.impl.conn.tsccm.AbstractConnPool createConnectionPool(org.apache.http.params.HttpParams); protected void finalize() throws java.lang.Throwable; public org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry(); public org.apache.http.conn.ClientConnectionRequest requestConnection(org.apache.http.conn.routing.HttpRoute, java.lang.Object); Fields removed: protected org.apache.http.params.HttpParams params; Class changed: org.apache.http.impl.conn.tsccm.WaitingThread Methods added: public void interrupt(); API diff generated by JarDiff http://www.osjava.org/jardiff/ -------------------------------------- Release 4.0 Alpha 3 ------------------- ALPHA3 release brings another round of API refinements and improvements in functionality. As of this release HttpClient requires Java 5 compatible runtime environment and takes full advantage of generics and new concurrency primitives. This release also introduces new default cookie policy that selects a cookie specification depending on the format of cookies sent by the target host. It is no longer necessary to know beforehand what kind of HTTP cookie support the target host provides. HttpClient is now able to pick up either a lenient or a strict cookie policy depending on the compliance level of the target host. Another notable improvement is a completely reworked support for multipart entities based on Apache mime4j library. ------------------- HttpClient 3.x features that have NOT yet been ported: ------------------- * NTLM authentication scheme ------------------- Changelog: ------------------- * [HTTPCLIENT-742] common interface for HttpRoute and RouteTracker Contributed by Roland Weber * [HTTPCLIENT-741] Fixed concurrency issues in AbstractClientConnAdapter. Contributed by Oleg Kalnichevski * [HTTPCLIENT-726] testcase for spurious wakeups in ThreadSafeClientConnManager Contributed by Roland Weber * [HTTPCLIENT-643] Automatic connect fail-over for multi-home remote servers. Contributed by Oleg Kalnichevski * [HTTPCLIENT-735] unsetting of DEFAULT_PROXY and FORCED_ROUTE in hierarchies Contributed by Roland Weber * [HTTPCLIENT-723] route planner based on java.net.ProxySelector Contributed by Roland Weber * [HTTPCLIENT-740] don't start connection GC thread in pool constructor Contributed by Roland Weber * [HTTPCLIENT-736] route planners use SchemeRegistry instead of ConnManager Contributed by Roland Weber * [HTTPCLIENT-730] Fixed rewriting of URIs containing escaped characters Contributed by Sam Berlin and Oleg Kalnichevski * [HTTPCLIENT-667] Added 'Meta' cookie policy that selects a cookie specification depending on the format of the cookie(s). Contributed by Oleg Kalnichevski * [HTTPCLIENT-729] Move HttpRoute and related classes to routing package. Contributed by Roland Weber * [HTTPCLIENT-725] Use TimeUnit arguments for timeouts in connection manager. Contributed by Roland Weber * [HTTPCLIENT-677] Connection manager no longer uses Thread.interrupt(). Contributed by Roland Weber * [HTTPCLIENT-716] Allow application-defined routes. Contributed by Roland Weber * [HTTPCLIENT-712] Improve HttpRoute API Contributed by Roland Weber * [HTTPCLIENT-711] Bad route computed for redirected requests Contributed by Oleg Kalnichevski * [HTTPCLIENT-715] Remove RoutedRequest from API Contributed by Roland Weber * [HTTPCLIENT-705] Fixed incorrect handling of URIs with null path component. Contributed by Oleg Kalnichevski * [HTTPCLIENT-688] HttpOptions#getAllowedMethods can now handle multiple Allow headers. Contributed by Andrea Selva -------------------------------------- Release 4.0 Alpha 2 ------------------- ALPHA2 release is another milestone in the redesign of HttpClient. It includes a number of improvements since ALPHA1, among which are improved connection pooling, support for proxy chains, redesigned HTTP state and authentication credentials management API, improved RFC 2965 cookie specification. ------------------- HttpClient 3.x features that have NOT yet been ported ------------------- * NTLM authentication scheme * Support for multipart MIME coded entities ------------------- Changelog ------------------- * [HTTPCLIENT-698] Resolve non-absolute redirect URIs relative to the request URI Contributed by Johannes Koch * [HTTPCLIENT-697] Throw a more intelligible exception when connection to a remote host cannot be established. Contributed by Oleg Kalnichevski * [HTTPCLIENT-689] Caching of SimpleDateFormat in DateUtils Contributed by Daniel Müller * [HTTPCLIENT-689] stackable parameters in AbstractHttpClient Contributed by Roland Weber * [HTTPCLIENT-477] Use distinct instances of the authentication handler interface for authentication with target and proxy hosts Contributed by Oleg Kalnichevski * [HTTPCLIENT-690] ManagedClientConnection provides access to SSLSession Contributed by Roland Weber * [HTTPCLIENT-692] ClientConnectionManager throws InterruptedException Contributed by Roland Weber * [HTTPCORE-116] moved parameter names to interfaces Contributed by Roland Weber * [HTTPCLIENT-649] support for proxy chains in HttpConn Contributed by Roland Weber * [HTTPCLIENT-636] refactor ThreadSafeClientConnManager in separate package Contributed by Roland Weber * [HTTPCLIENT-669] new HttpRoutePlanner interface and implementation Contributed by Andrea Selva * [HTTPCLIENT-653] detached connection wrapper no longer prevents garbage collection of ThreadSafeClientConnManager Contributed by Roland Weber * [HTTPCLIENT-674] use org.apache.http.util.VersionInfo instead of a local one Contributed by Roland Weber * [HTTPCLIENT-666] Replaced HttpState with CredentialsProvier and CookieStore interfaces Contributed by Oleg Kalnichevski * [HTTPCORE-100] revised HttpContext hierarchy Contributed by Roland Weber * [HTTPCLIENT-618] eliminate class HostConfiguration Contributed by Roland Weber * [HTTPCLIENT-672] re-sync with API changes in core alpha6-SNAPSHOT Contributed by Roland Weber -------------------------------------- Release 4.0 Alpha 1 ------------------- HttpClient 4.0 represents a complete, ground-up redesign and almost a complete rewrite of the HttpClient 3.x codeline. This release finally addresses several design flaws that existed since the 1.0 release and could not be fixed without a major code overhaul and breaking API compatibility. The HttpClient 4.0 API is still very experimental and is bound to change during the course of the ALPHA development phase. Several important features have not yet been ported to the new API. Architectural changes --------------------- * Redesign of the HttpClient internals addressing all known major architectural shortcomings of the 3.x codeline * Cleaner, more flexible and expressive API * Better performance and smaller memory footprint due to a more efficient HTTP transport based on HttpCore. HttpClient 4.0 is expected to be 10% to 25% faster than HttpClient 3.x codeline * More modular structure * Pluggable redirect and authentication handlers * Support for protocol incerceptors * Improved connection management * Improved support for sending requests via a proxy or a chain of proxies * Improved handling redirects of entity enclosing requests * More flexible SSL context customization * Reduced intermediate garbage in the process of generating HTTP requests and parsing HTTP responses ------------------- HttpClient 3.x features that have NOT yet been ported ------------------- * NTLM authentication scheme * RFC2965 cookie policy (Cookie2) * Support for multipart MIME coded entities ------------------- Changelog ------------------- The following is a list of contributions tracked in JIRA. Note that this is not a complete list of contributions or changes. Since the API was redesigned completely, tracking everything outside of the source code repository would have been too burdensome. * [HTTPCLIENT-655] User-Agent string no longer violates RFC Contributed by Oleg Kalnichevski * [HTTPCLIENT-541] Virtual host API redesign Contributed by Oleg Kalnichevski * [HTTPCLIENT-614] Allow for different strategies when checking CN of x509 certificates Contributed by Julius Davies * [HTTPCLIENT-136] Fixed inadequate proxy support Long standing architectural problem. Issue opened on 19/Dec/2002. Contributed by Oleg Kalnichevski * [HTTPCLIENT-63] Support for pluggable redirect and authentication handlers Long standing architectural problem. Issue opened on 15/Jul/2002. Contributed by Oleg Kalnichevski * [HTTPCLIENT-245] Fixed redirect handling. HttpClient can now automatically handle redirects of entity enclosing requests. Long standing architectural problem. Issue opened on 14/Jul/2003. Contributed by Oleg Kalnichevski * [HTTPCLIENT-613] HTTPS connections now verify CN of x509 certificates Contributed by Julius Davies * [HTTPCLIENT-497] Wire/header logger names consistent with class loggers Contributed by Oleg Kalnichevski * [HTTPCLIENT-484] AuthSSLProtocolSocketFactory in the main distribution Contributed by Oleg Kalnichevski * [HTTPCLIENT-589] Do not consume the remaining response content if the connection is to be closed Contributed by Roland Weber * [HTTPCLIENT-475] Support for unconnected sockets. HTTP requests can now be aborted while network socket is still being connected. Contributed by Roland Weber