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

    * Support for HTTP/1.1 response caching.

{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)
