Release 4.0 Alpha 2
-------------------
This is a maintenance release that mostly fixes minor problems found since the 
previous release. The upstream projects are strongly encouraged use this 
release as a dependency while HttpCore undergoes another round of reviews
and optimization in the SVN trunk

Changelog: 
---------
* [HTTPCORE-4] optional header and line length limits to contain OOME risks
  Contributed by Oleg Kalnichevski <olegk at apache.org>

API changes (generated by JarDiff 0.2)
--------------------------------------
Class added:
  public org.apache.http.UnsupportedHttpVersionException extends org.apache.http.ProtocolException
Class added:
  public abstract org.apache.http.entity.ContentProducer extends java.lang.Object
Class added:
  public org.apache.http.entity.EntityTemplate extends org.apache.http.entity.AbstractHttpEntity
Class added:
  public org.apache.http.protocol.GeneratedHeader extends org.apache.http.Header
Class added:
  public org.apache.http.util.HeaderUtils extends java.lang.Object
Class changed: org.apache.http.Header
  Methods removed:
    public static org.apache.http.Header[] parseAll(org.apache.http.io.HttpDataReceiver) throws org.apache.http.HttpException, java.io.IOException;

Class changed: org.apache.http.params.HttpConnectionParams
  Fields added:
    public final static java.lang.String MAX_HEADER_COUNT = http.connection.max-header-count;
    public final static java.lang.String MAX_LINE_LENGTH = http.connection.max-line-length;

Class changed: org.apache.http.protocol.HttpService
  Methods added:
    protected void closeConnection();
    public void destroy();
    public boolean isDestroyed();

Release 4.0 Alpha 1
-------------------
This release represents a complete redesign of the Jakarta Commons HttpClient
3.x API and a significant rewrite of the core HTTP components derived from 
HttpClient 3.0 code base.

These components will form the foundation of the future releases of Jakarta
HttpClient and can also be used separately to build custom client- and 
server-side HTTP services.
