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

HttpCore Overview

    HttpCore is a set of low level HTTP transport components that can be used to build custom
    client and server side HTTP services with a minimal footprint. HttpCore supports two I/O models: 
    blocking I/O model based on the classic Java I/O and non-blocking, event driven I/O model based 
    on Java NIO. 
    
{Documentation}

    [[1]] Some examples of HttpCore components in action can be found {{{./examples.html}here}}

    [[1]] Project reports

    * {{{./httpcore5/project-reports.html}HttpCore HTTP/1.1}}

    * {{{./httpcore5-h2/project-reports.html}HttpCore HTTP/2}}

    * {{{./httpcore5-reactive/project-reports.html}HttpCore Reactive Streams}}

    * {{{./httpcore5-testing/project-reports.html}HttpCore testing support}}

{Standards Compliance}

    HttpCore components strive to conform to the following specifications endorsed by the Internet 
    Engineering Task Force (IETF) and the internet at large:

    * {{{http://tools.ietf.org/html/rfc7540}RFC 7540}} - Hypertext Transfer Protocol Version 2
    (HTTP/2)

    * {{{http://tools.ietf.org/html/rfc7541}RFC 7541}} - HPACK: Header Compression for HTTP/2

    * {{{http://tools.ietf.org/html/rfc7230}RFC 7230}} - Hypertext Transfer Protocol (HTTP/1.1):
    Message Syntax and Routing

    * {{{http://tools.ietf.org/html/rfc7231}RFC 7231}} - Hypertext Transfer Protocol (HTTP/1.1):
    Semantics and Content

    * {{{http://tools.ietf.org/html/rfc1945}RFC 1945}} - Hypertext Transfer Protocol -- HTTP/1.0

    * {{{http://tools.ietf.org/html/rfc2396}RFC 2396}} - Uniform Resource Identifiers (URI): Generic Syntax

