~~ ====================================================================
~~ 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/examples/ClientWithResponseHandler.java}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/examples/ClientConnectionRelease.java}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/examples/ClientConfiguration.java}HttpClient configuration}}
    
    This example demonstrates how to customize and configure the most common aspects of HTTP request execution 
    and connection management.

    * {{{./httpclient5/examples/ClientInterceptors.java}Request execution interceptors}}
    
    This example demonstrates how to insert custom request interceptor and an execution interceptor to the
    request execution chain.

    * {{{./httpclient5/examples/ClientAbortMethod.java}Abort method}}
    
    This example demonstrates how to abort an HTTP request before its normal completion.

    * {{{./httpclient5/examples/ClientAuthentication.java}Client authentication}}
    
    This example uses HttpClient to execute an HTTP request against a target site that requires user
    authentication.  

    * {{{./httpclient5/examples/ClientExecuteProxy.java}Request via a proxy}}
    
    This example demonstrates how to send an HTTP request via a proxy.

    * {{{./httpclient5/examples/ClientProxyAuthentication.java}Proxy authentication}}
    
    A simple example showing execution of an HTTP request over a secure connection tunneled through 
    an authenticating proxy.  

    * {{{./httpclient5/examples/ClientChunkEncodedPost.java}Chunk encoded POST}}
    
    This example shows how to stream out a request entity using chunk encoding.

    * {{{./httpclient5/examples/ClientCustomContext.java}Custom execution context}}
    
    This example demonstrates the use of a local HTTP context populated custom attributes.

    * {{{./httpclient5/examples/ClientFormLogin.java}Form based logon}}
    
    This example demonstrates how HttpClient can be used to perform form-based logon.

    * {{{./httpclient5/examples/ClientMultiThreadedExecution.java}Threaded request execution}}
    
    An example that executes HTTP requests from multiple worker threads.

    * {{{./httpclient5/examples/ClientCustomSSL.java}Custom SSL context}}
    
    This example demonstrates how to create secure connections with a custom SSL context.

    * {{{./httpclient5/examples/ClientPreemptiveBasicAuthentication.java}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/examples/ClientPreemptiveDigestAuthentication.java}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/examples/ProxyTunnelDemo.java}Proxy tunnel}}
    
    This example shows how to use ProxyClient in order to establish a tunnel through an HTTP proxy 
    for an arbitrary protocol.
    
    * {{{./httpclient5/examples/ClientMultipartFormPost.java}Multipart encoded request entity}}
    
    This example shows how to execute requests enclosing a multipart encoded entity. 

