~~ ====================================================================
~~ 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 5.1.x}

    HttpCore 5.1.x branch is the current feature development branch. The 5.x release
    series is expected to provide conditional conformance to RFC 3986 as well as
    a number of incremental functional enhancements and performance improvements.

* {HttpComponents HttpCore 5.0.x}

    HttpCore 5.0.x branch is considered stable and production ready. It is being actively
    maintained and supported. The 5.x release series provides comprehensive support
    for HTTP/1.1 and HTTP/2 protocol and full conformance with mandatory requirements
    of RFC 7230, RFC 7231, RFC 7540 and RFC 7541

    Users of all versions of HttpCore are advised to upgrade to the latest release
    of the 5.0 series.

* {HttpComponents HttpClient 5.0.x}

    HttpClient 5.0.x branch is considered stable and production ready. It is being actively
    maintained and supported. The 5.x release series provides comprehensive support
    for HTTP/1.1 and HTTP/2 protocol and full conformance with mandatory requirements
    of RFC 7230, RFC 7231, RFC 7540 and RFC 7541

    Users of all versions of HttpClient are advised to upgrade to the latest release
    of the 5.0 series.

* {HttpComponents HttpCore 4.4.x}

    HttpCore 4.4.x branch is considered stable and production ready. While being actively
    maintained and supported, the 4.x release series will be receiving fixes for major defects
    and security issues only.

* {HttpComponents HttpClient 4.5.x}

    HttpClient 4.5.x branch is considered stable and production ready. While being actively
    maintained and supported, the 4.x release series will be receiving fixes for major defects
    and security issues only.

* {HttpComponents HttpAsyncClient 4.1.x}

    HttpAsyncClient 4.1.x branch is considered stable and production ready. While being actively
    maintained and supported, the 4.x release series will be receiving fixes for major defects
    and security issues only.

* {Commons HttpClient 3.1.x}

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




