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

HttpClient Overview

    The Hyper-Text Transfer Protocol (HTTP) is perhaps the most significant protocol used on the 
    Internet today. Web services, network-enabled appliances and the growth of network computing 
    continue to expand the role of the HTTP protocol beyond user-driven web browsers, while 
    increasing the number of applications that require HTTP support.

    Although the java.net package provides basic functionality for accessing resources via HTTP, it 
    doesn't provide the full flexibility or functionality needed by many applications. HttpClient 
    seeks to fill this void by providing an efficient, up-to-date, and feature-rich package 
    implementing the client side of the most recent HTTP standards and recommendations.

    Designed for extension while providing robust support for the base HTTP protocol, HttpClient 
    may be of interest to anyone building HTTP-aware client applications such as web browsers, web 
    service clients, or systems that leverage or extend the HTTP protocol for distributed 
    communication.

{Documentation}

    [[1]] {{{./examples.html}HttpClient Examples}} - a set of examples demonstrating some of 
    the more complex behavior. 
    
    [[1]] Project reports

    * {{{./httpclient5/project-reports.html}HttpClient}}

    * {{{./httpclient5-fluent/project-reports.html}HC Fluent}}

    * {{{./httpclient5-cache/project-reports.html}HttpClient Cache}}
   
    * {{{./httpclient5-win/project-reports.html}HttpClient Windows extensions}}

{Standards Compliance}

    HttpClient strives to conform to the following specifications endorsed by the Internet 
    Engineering Task Force (IETF) and the internet at large:

    * {{{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/rfc7235}RFC 7235}} - Hypertext Transfer Protocol (HTTP/1.1): 
    Authentication

    * {{{http://tools.ietf.org/html/rfc1945}RFC 1945}} - Hypertext Transfer Protocol -- HTTP/1.0
    
    * {{{http://tools.ietf.org/html/rfc2817}RFC 2817}} - Upgrading to TLS Within HTTP/1.1
    
    * {{{http://tools.ietf.org/html/rfc2818}RFC 2818}} - HTTP Over TLS
    
    * {{{http://tools.ietf.org/html/rfc6265}RFC 6265}} - HTTP State Management Mechanism (Cookies)

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

