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

    * {{{./httpclient/examples/org/apache/hc/client5/http/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.

    * {{{./httpclient/examples/org/apache/hc/client5/http/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.

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

    * {{{./httpclient/examples/org/apache/hc/client5/http/examples/ClientAbortMethod.java}Abort method}}
    
    This example demonstrates how to abort an HTTP request before its normal completion.

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

    * {{{./httpclient/examples/org/apache/hc/client5/http/examples/ClientExecuteProxy.java}Request via a proxy}}
    
    This example demonstrates how to send an HTTP request via a proxy.

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

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

    * {{{./httpclient/examples/org/apache/hc/client5/http/examples/ClientCustomContext.java}Custom execution context}}
    
    This example demonstrates the use of a local HTTP context populated custom attributes.

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

    * {{{./httpclient/examples/org/apache/hc/client5/http/examples/ClientMultiThreadedExecution.java}Threaded request execution}}
    
    An example that executes HTTP requests from multiple worker threads.

    * {{{./httpclient/examples/org/apache/hc/client5/http/examples/ClientCustomSSL.java}Custom SSL context}}
    
    This example demonstrates how to create secure connections with a custom SSL context.

    * {{{./httpclient/examples/org/apache/hc/client5/http/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.

    * {{{./httpclient/examples/org/apache/hc/client5/http/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.
    
    * {{{./httpclient/examples/org/apache/hc/client5/http/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.
    
    * {{{./httpclient/examples/org/apache/hc/client5/http/examples/ClientMultipartFormPost.java}Multipart encoded request entity}}
    
    This example shows how to execute requests enclosing a multipart encoded entity. 


