~~ ====================================================================
~~ 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 HttpAsyncClient Overview
    ----------
    ----------
    ----------

HttpAsyncClient 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.

    Although the java.net package provides basic functionality for accessing resources via HTTP, it 
    doesn't provide the full flexibility or functionality needed by many applications. 
    HttpAsyncClient seeks to fill this void by providing an efficient, up-to-date, and feature-rich 
    package implementing the client side of the most recent HTTP standards and recommendations.

    Designed for extension while providing robust support for the base HTTP protocol, 
    HttpAsyncClient may be of interest to anyone building HTTP-aware client applications based on
    asynchronous, event driven I/O model.

{Documentation}

    * Some examples of HttpAsyncClient in action can be found {{{./examples.html}here}}
    
{Features}

    * Standards based, pure Java, implementation of HTTP versions 1.0 and 1.1
 
    * Full implementation of all HTTP methods (GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE) 
    in an extensible OO framework.
    
    * Supports encryption with HTTPS (HTTP over SSL) protocol.

    * Transparent connections through HTTP proxies.

    * Tunneled HTTPS connections through HTTP proxies, via the CONNECT method.

    * Connection management support concurrent request execution. Supports setting the maximum 
      total connections as well as the maximum connections per host. Detects and closes expired 
      connections.

    * Persistent connections using KeepAlive in HTTP/1.0 and persistance in HTTP/1.1

    * The ability to set connection timeouts.

    * Source code is freely available under the Apache License.

    * Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO and Kerberos authentication schemes.

    * Plug-in mechanism for custom authentication schemes.

    * Automatic Cookie handling for reading Set-Cookie: headers from the server and sending them 
      back out in a Cookie: header when appropriate.

    * Plug-in mechanism for custom cookie policies.

{Standards Compliance}

    HttpAsyncClient strives to conform to the following specifications endorsed by the Internet 
    Engineering Task Force (IETF) and the internet at large:

    * {{{http://www.ietf.org/rfc/rfc1945.txt}RFC 1945}} Hypertext Transfer Protocol -- HTTP/1.0

    * {{{http://www.ietf.org/rfc/rfc2616.txt}RFC 2616}} Hypertext Transfer Protocol -- HTTP/1.1
    
    * {{{http://www.ietf.org/rfc/rfc2617.txt}RFC 2617}} HTTP Authentication: Basic and Digest Access 
      Authentication

    * {{{http://www.ietf.org/rfc/rfc2109.txt}RFC 2109}} HTTP State Management Mechanism (Cookies)
    
    * {{{http://www.ietf.org/rfc/rfc2965.txt}RFC 2965}} HTTP State Management Mechanism (Cookies v2)
