~~ ====================================================================
~~ 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/>.

    ----------
    HttpComponents Status
    ----------
    ----------
    ----------

HttpComponents Project Status

* {HttpComponents HttpCore 4.4.x}

    HttpCore 4.4.x branch is considered stable and production ready. It is being actively 
    maintained and supported. Users of all versions of HttpCore are advised to upgrade to the 
    latest release of the 4.4 series. 

* {HttpComponents HttpCore 5.x}

    HttpCore 5.x branch is the current unstable development branch. The main focus of the 5.0
    series is providing full-featured support for HTTP/1.1 and HTTP/2 and ensuring full compliance 
    with RFC 7230, RFC 7231, RFC 7540 and RFC 7541. While 5.0 APIs are likely to change somewhat
    in the course of BETA development phase the branch is considered feature complete. No major
    API changes are expected.

* {HttpComponents HttpClient 4.5.x}

    HttpClient 4.5.x branch is considered stable and production ready. It is being actively 
    maintained and supported. Users of all versions of HttpClient are advised to upgrade to the 
    latest release of the 4.5 series. 

* {HttpComponents HttpClient 5.x}

    HttpClient 5.x branch is the current unstable development branch. The main focus of the 5.0
    series is providing full-featured support for HTTP/1.1 and HTTP/2 and ensuring full compliance
    with RFC 7230, RFC 7231, RFC 7540 and RFC 7541. While 5.0 APIs are likely to change somewhat
    in the course of BETA development phase the branch is considered feature complete. No major
    API changes are expected.

* {HttpComponents HttpAsyncClient 4.1.x}

    HttpAsyncClient 4.1.x branch is considered stable and production ready. It is being actively 
    maintained and supported. 

* {Commons HttpClient 3.1.x}

    The 3.1 branch of Commons HttpClient is at the end of life. No more public releases are 
    expected.




