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

HttpCore Examples

    * {{{./httpcore5/examples/ClassicGetExecutionExample.java} 
    Classic (blocking) HTTP/1.1 GET requests}}
    
    This example demonstrates synchronous execution of multiple HTTP/1.1 GET requests.

    * {{{./httpcore5/examples/ClassicPostExecutionExample.java} 
    Classic (blocking) HTTP/1.1 POST requests}}
    
    This example demonstrates synchronous execution of multiple HTTP/1.1 POST requests with enclosed 
    content of various types.  

    * {{{./httpcore5/examples/AsyncRequestExecutionExample.java} 
    Asynchronous HTTP/1.1 GET requests}}
    
    This example demonstrates asynchronous execution of multiple HTTP/1.1 requests.

    * {{{./httpcore5-h2/examples/H2RequestExecutionExample.java}
    Asynchronous HTTP/2 GET requests}}
    
    This example demonstrates asynchronous execution of multiple HTTP/2 requests.

    * {{{./httpcore5-h2/examples/H2TlsAlpnRequestExecutionExample.java}
    HTTP/2 requests over TLS connections with ALPN support}}

    This example demonstrates how to execute HTTP/2 requests over TLS connections with ALPN support.
    It also explains how to avoid the illegal reflective access operation warning when running
    Java 9 or older.

    * {{{./httpcore5-h2/examples/H2ConscriptRequestExecutionExample.java}
    HTTP/2 requests over TLS connections with ALPN support on Java 1.7 and Java 1.8}}

    This example demonstrates how to execute HTTP/2 requests over TLS connections with ALPN support
    on Java 1.7 and Java 1.8.

    * {{{./httpcore5/examples/AsyncPipelinedRequestExecutionExample.java}
    Asynchronous HTTP/1.1 GET requests with message pipelining}}
    
    This example demonstrates asynchronous, pipelined execution multiple HTTP/1.1 requests.

    * {{{./httpcore5-h2/examples/H2MultiStreamExecutionExample.java}
    Asynchronous HTTP/2 GET requests with multiple concurrent streams}}
    
    This example demonstrates asynchronous, multistream execution of multiple HTTP/2 requests.

    * {{{./httpcore5/examples/ClassicFileServerExample.java} 
    Classic (blocking) HTTP/1.1 file server}}
    
    This is an example of an embedded HTTP/1.1 file server with a classic (blocking) message transport.

    * {{{./httpcore5/examples/ClassicServerFilterExample.java}
    Request filters with classic (blocking) HTTP/1.1 server}}
    
    This is an example of using synchronous request filters with an embedded HTTP/1.1 server.

    * {{{./httpcore5/examples/AsyncFileServerExample.java} 
    Asynchronous HTTP/1.1 file server}}
    
    This is an example of an embedded HTTP/1.1 file server with an event driven, non-blocking message transport.

    * {{{./httpcore5/examples/AsyncServerFilterExample.java} 
    Request filters with asynchronous HTTP/1.1 server}}

    This is an example of using asynchronous request filters with an embedded HTTP/1.1 server.

    * {{{./httpcore5-h2/examples/H2FileServerExample.java}
    Asynchronous HTTP/2 file server}}
    
    This is an example of an embedded HTTP/2 file server with an event driven, non-blocking message transport.

    * {{{./httpcore5/examples/ClassicReverseProxyExample.java} 
    Classic (blocking) HTTP reverse proxy}}

    This is an example of an embedded HTTP/1.1 reverse proxy with a classic (blocking) message transport.

    * {{{./httpcore5/examples/AsyncReverseProxyExample.java} 
    Asynchronous HTTP reverse proxy}}
    
    This is an example of an embedded HTTP/1.1 reverse proxy with an event driven, non-blocking message transport.

HttpCore Reactive Streams Examples

    * {{{./httpcore5-reactive/examples/ReactiveFullDuplexClientExample.java}
    Client Reactive Streams}}

    This is an example of full-duplex HTTP/1.1 client side message exchanges using reactive streaming.

    * {{{./httpcore5-reactive/examples/ReactiveFullDuplexServerExample.java}
    Server Reactive Streams}}

    This is an example of full-duplex HTTP/1.1 server side message exchanges using reactive streaming.
