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

HttpAsyncClient Examples

    * {{{./httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchange.java}Asynchronous 
      HTTP exchange}}

    This example demonstrates a basic asynchronous HTTP request / response exchange. 
    Response content is buffered in memory for simplicity.

    * {{{./httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java}Event based 
      content streaming}}
    
    This example demonstrates an asynchronous HTTP request / response exchange with a full content 
    streaming.

    * {{{./httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeFutureCallback.java}Concurrent 
      asynchronous HTTP exchanges}}
    
    This example demonstrates a fully asynchronous execution of multiple HTTP exchanges where the 
    result of an individual operation is reported using a callback interface.

    * {{{./httpasyncclient/examples/org/apache/http/examples/nio/client/ZeroCopyHttpExchange.java}Zero copy 
      file upload / download}}
    
    This example demonstrates how HttpAsyncClient can be used to upload or download files without 
    creating an intermediate content buffer in memory (zero copy file transfer).
