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

HttpClient Examples (Classic)

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientWithResponseHandler.html}Response handling}}

    This example demonstrates how to process HTTP responses using a response handler. This is 
    the recommended way of executing HTTP requests and processing HTTP responses. This approach 
    enables the caller to concentrate on the process of digesting HTTP responses and to delegate 
    the task of system resource deallocation to HttpClient. The use of an HTTP response handler 
    guarantees that the underlying HTTP connection will be released back to the connection manager 
    automatically in all cases.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientConnectionRelease.html}Manual connection release}}
    
    This example demonstrates how to ensure the release of the underlying HTTP connection back to 
    the connection manager in case of a manual processing of HTTP responses.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientConfiguration.html}HttpClient configuration}}
    
    This example demonstrates how to customize and configure the most common aspects of HTTP request execution 
    and connection management.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientInterceptors.html}Request execution interceptors}}
    
    This example demonstrates how to insert custom request interceptor and an execution interceptor to the
    request execution chain.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientAbortMethod.html}Abort method}}
    
    This example demonstrates how to abort an HTTP request before its normal completion.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientAuthentication.html}Client authentication}}
    
    This example uses HttpClient to execute an HTTP request against a target site that requires user
    authentication.  

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientExecuteProxy.html}Request via a proxy}}
    
    This example demonstrates how to send an HTTP request via a proxy.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientProxyAuthentication.html}Proxy authentication}}
    
    A simple example showing execution of an HTTP request over a secure connection tunneled through 
    an authenticating proxy.  

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientChunkEncodedPost.html}Chunk encoded POST}}
    
    This example shows how to stream out a request entity using chunk encoding.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientCustomContext.html}Custom execution context}}
    
    This example demonstrates the use of a local HTTP context populated custom attributes.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientFormLogin.html}Form based logon}}
    
    This example demonstrates how HttpClient can be used to perform form-based logon.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientMultiThreadedExecution.html}Threaded request execution}}
    
    An example that executes HTTP requests from multiple worker threads.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientCustomSSL.html}Custom SSL context}}
    
    This example demonstrates how to create secure connections with a custom SSL context.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientPreemptiveBasicAuthentication.html}Preemptive BASIC authentication}}
    
    This example shows how HttpClient can be customized to authenticate preemptively using BASIC 
    scheme. Generally, preemptive authentication can be considered less secure than a response to 
    an authentication challenge and therefore discouraged.

    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientPreemptiveDigestAuthentication.html}Preemptive DIGEST authentication}}
    
    This example shows how HttpClient can be customized to authenticate preemptively using DIGEST 
    scheme. Generally, preemptive authentication can be considered less secure than a response to 
    an authentication challenge and therefore discouraged.
    
    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ProxyTunnelDemo.html}Proxy tunnel}}
    
    This example shows how to use ProxyClient in order to establish a tunnel through an HTTP proxy 
    for an arbitrary protocol.
    
    * {{{./httpclient5/xref-test/org/apache/hc/client5/http/examples/ClientMultipartFormPost.html}Multipart encoded request entity}}
    
    This example shows how to execute requests enclosing a multipart encoded entity. 

