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

    ----------
    Apache HttpComponents
    ----------
    ----------
    ----------

Apache HttpComponents

    The Apache HttpComponents\u2122 project is responsible for creating and maintaining a toolset of 
low level Java components focused on HTTP and associated protocols.

    This project functions under the Apache Software Foundation (http://www.apache.org), and is part 
of a larger community of developers and users.

HttpComponents Overview

    The Hyper-Text Transfer Protocol (HTTP) is perhaps the most significant protocol used on the 
    Internet today. Web services, network-enabled appliances and the growth of network computing 
    continue to expand the role of the HTTP protocol beyond user-driven web browsers, while 
    increasing the number of applications that require HTTP support.

    Designed for extension while providing robust support for the base HTTP protocol, the 
    HttpComponents may be of interest to anyone building HTTP-aware client and server 
    applications such as web browsers, web spiders, HTTP proxies, web service transport 
    libraries, or systems that leverage or extend the HTTP protocol for distributed communication. 
    
{HttpComponents Structure}

* {HttpComponents Core}

    {{{./httpcomponents-core-ga/index.html}HttpCore}} is a set of low level HTTP transport components 
    that can be used to build custom client and server side HTTP services with a minimal footprint. 
    HttpCore supports two I/O models: blocking I/O model based on the classic Java I/O and 
    non-blocking, event driven I/O model based on Java NIO. 
    
    The blocking I/O model may be more appropriate for data intensive, low latency scenarios,
    whereas the non-blocking model may be more appropriate for high latency scenarios where raw data
    throughput is less important than the ability to handle thousands of simultaneous HTTP 
    connections in a resource efficient manner.

    * HttpCore Tutorial {{{./httpcomponents-core-ga/tutorial/html}HTML}} 
      / {{{./httpcomponents-core-ga/tutorial/pdf/httpcore-tutorial.pdf}PDF}} 
    
    * HttpCore {{{./httpcomponents-core-ga/examples.html}Examples}}
    
* {HttpComponents Client}

    {{{./httpcomponents-client-ga/index.html}HttpClient}} is a HTTP/1.1 compliant HTTP agent 
    implementation based on HttpCore. It also provides reusable components for client-side 
    authentication, HTTP state management, and HTTP connection management. HttpComponents Client 
    is a successor of and replacement for {{{http://hc.apache.org/httpclient-legacy/index.html} 
    Commons HttpClient 3.x}}. Users of Commons HttpClient are strongly encouraged to upgrade.

    * HttpClient Tutorial {{{./httpcomponents-client-ga/tutorial/html}HTML}} 
      / {{{./httpcomponents-client-ga/tutorial/pdf/httpclient-tutorial.pdf}PDF}}
    
    * HttpClient {{{./httpcomponents-client-ga/examples.html}Samples}}
    
* {HttpComponents AsyncClient}

    {{{./httpcomponents-asyncclient-dev/index.html}Asynch HttpClient}} is a HTTP/1.1 compliant HTTP agent 
    implementation based on HttpCore NIO and HttpClient components. It is a complementary module 
    to Apache HttpClient intended for special cases where ability to handle a great number of
    concurrent connections is more important than performance in terms of a raw data throughput.

    * HttpAsyncClient {{{./httpcomponents-asyncclient-dev/examples.html}Samples}}
    
* {Commons HttpClient (legacy)}

    Commons HttpClient 3.x codeline is at the end of life. All users of Commons HttpClient 3.x 
    are strongly encouraged to upgrade to HttpClient 4.1. 
