summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9110.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9110.txt')
-rw-r--r--doc/rfc/rfc9110.txt10785
1 files changed, 10785 insertions, 0 deletions
diff --git a/doc/rfc/rfc9110.txt b/doc/rfc/rfc9110.txt
new file mode 100644
index 0000000..19a88ab
--- /dev/null
+++ b/doc/rfc/rfc9110.txt
@@ -0,0 +1,10785 @@
+
+
+
+
+Internet Engineering Task Force (IETF) R. Fielding, Ed.
+Request for Comments: 9110 Adobe
+STD: 97 M. Nottingham, Ed.
+Obsoletes: 2818, 7230, 7231, 7232, 7233, 7235, Fastly
+ 7538, 7615, 7694 J. Reschke, Ed.
+Updates: 3864 greenbytes
+Category: Standards Track June 2022
+ISSN: 2070-1721
+
+
+ HTTP Semantics
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is a stateless application-
+ level protocol for distributed, collaborative, hypertext information
+ systems. This document describes the overall architecture of HTTP,
+ establishes common terminology, and defines aspects of the protocol
+ that are shared by all versions. In this definition are core
+ protocol elements, extensibility mechanisms, and the "http" and
+ "https" Uniform Resource Identifier (URI) schemes.
+
+ This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232,
+ 7233, 7235, 7538, 7615, 7694, and portions of 7230.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9110.
+
+Copyright Notice
+
+ Copyright (c) 2022 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Purpose
+ 1.2. History and Evolution
+ 1.3. Core Semantics
+ 1.4. Specifications Obsoleted by This Document
+ 2. Conformance
+ 2.1. Syntax Notation
+ 2.2. Requirements Notation
+ 2.3. Length Requirements
+ 2.4. Error Handling
+ 2.5. Protocol Version
+ 3. Terminology and Core Concepts
+ 3.1. Resources
+ 3.2. Representations
+ 3.3. Connections, Clients, and Servers
+ 3.4. Messages
+ 3.5. User Agents
+ 3.6. Origin Server
+ 3.7. Intermediaries
+ 3.8. Caches
+ 3.9. Example Message Exchange
+ 4. Identifiers in HTTP
+ 4.1. URI References
+ 4.2. HTTP-Related URI Schemes
+ 4.2.1. http URI Scheme
+ 4.2.2. https URI Scheme
+ 4.2.3. http(s) Normalization and Comparison
+ 4.2.4. Deprecation of userinfo in http(s) URIs
+ 4.2.5. http(s) References with Fragment Identifiers
+ 4.3. Authoritative Access
+ 4.3.1. URI Origin
+ 4.3.2. http Origins
+ 4.3.3. https Origins
+ 4.3.4. https Certificate Verification
+ 4.3.5. IP-ID Reference Identity
+ 5. Fields
+ 5.1. Field Names
+ 5.2. Field Lines and Combined Field Value
+ 5.3. Field Order
+ 5.4. Field Limits
+ 5.5. Field Values
+ 5.6. Common Rules for Defining Field Values
+ 5.6.1. Lists (#rule ABNF Extension)
+ 5.6.1.1. Sender Requirements
+ 5.6.1.2. Recipient Requirements
+ 5.6.2. Tokens
+ 5.6.3. Whitespace
+ 5.6.4. Quoted Strings
+ 5.6.5. Comments
+ 5.6.6. Parameters
+ 5.6.7. Date/Time Formats
+ 6. Message Abstraction
+ 6.1. Framing and Completeness
+ 6.2. Control Data
+ 6.3. Header Fields
+ 6.4. Content
+ 6.4.1. Content Semantics
+ 6.4.2. Identifying Content
+ 6.5. Trailer Fields
+ 6.5.1. Limitations on Use of Trailers
+ 6.5.2. Processing Trailer Fields
+ 6.6. Message Metadata
+ 6.6.1. Date
+ 6.6.2. Trailer
+ 7. Routing HTTP Messages
+ 7.1. Determining the Target Resource
+ 7.2. Host and :authority
+ 7.3. Routing Inbound Requests
+ 7.3.1. To a Cache
+ 7.3.2. To a Proxy
+ 7.3.3. To the Origin
+ 7.4. Rejecting Misdirected Requests
+ 7.5. Response Correlation
+ 7.6. Message Forwarding
+ 7.6.1. Connection
+ 7.6.2. Max-Forwards
+ 7.6.3. Via
+ 7.7. Message Transformations
+ 7.8. Upgrade
+ 8. Representation Data and Metadata
+ 8.1. Representation Data
+ 8.2. Representation Metadata
+ 8.3. Content-Type
+ 8.3.1. Media Type
+ 8.3.2. Charset
+ 8.3.3. Multipart Types
+ 8.4. Content-Encoding
+ 8.4.1. Content Codings
+ 8.4.1.1. Compress Coding
+ 8.4.1.2. Deflate Coding
+ 8.4.1.3. Gzip Coding
+ 8.5. Content-Language
+ 8.5.1. Language Tags
+ 8.6. Content-Length
+ 8.7. Content-Location
+ 8.8. Validator Fields
+ 8.8.1. Weak versus Strong
+ 8.8.2. Last-Modified
+ 8.8.2.1. Generation
+ 8.8.2.2. Comparison
+ 8.8.3. ETag
+ 8.8.3.1. Generation
+ 8.8.3.2. Comparison
+ 8.8.3.3. Example: Entity Tags Varying on Content-Negotiated
+ Resources
+ 9. Methods
+ 9.1. Overview
+ 9.2. Common Method Properties
+ 9.2.1. Safe Methods
+ 9.2.2. Idempotent Methods
+ 9.2.3. Methods and Caching
+ 9.3. Method Definitions
+ 9.3.1. GET
+ 9.3.2. HEAD
+ 9.3.3. POST
+ 9.3.4. PUT
+ 9.3.5. DELETE
+ 9.3.6. CONNECT
+ 9.3.7. OPTIONS
+ 9.3.8. TRACE
+ 10. Message Context
+ 10.1. Request Context Fields
+ 10.1.1. Expect
+ 10.1.2. From
+ 10.1.3. Referer
+ 10.1.4. TE
+ 10.1.5. User-Agent
+ 10.2. Response Context Fields
+ 10.2.1. Allow
+ 10.2.2. Location
+ 10.2.3. Retry-After
+ 10.2.4. Server
+ 11. HTTP Authentication
+ 11.1. Authentication Scheme
+ 11.2. Authentication Parameters
+ 11.3. Challenge and Response
+ 11.4. Credentials
+ 11.5. Establishing a Protection Space (Realm)
+ 11.6. Authenticating Users to Origin Servers
+ 11.6.1. WWW-Authenticate
+ 11.6.2. Authorization
+ 11.6.3. Authentication-Info
+ 11.7. Authenticating Clients to Proxies
+ 11.7.1. Proxy-Authenticate
+ 11.7.2. Proxy-Authorization
+ 11.7.3. Proxy-Authentication-Info
+ 12. Content Negotiation
+ 12.1. Proactive Negotiation
+ 12.2. Reactive Negotiation
+ 12.3. Request Content Negotiation
+ 12.4. Content Negotiation Field Features
+ 12.4.1. Absence
+ 12.4.2. Quality Values
+ 12.4.3. Wildcard Values
+ 12.5. Content Negotiation Fields
+ 12.5.1. Accept
+ 12.5.2. Accept-Charset
+ 12.5.3. Accept-Encoding
+ 12.5.4. Accept-Language
+ 12.5.5. Vary
+ 13. Conditional Requests
+ 13.1. Preconditions
+ 13.1.1. If-Match
+ 13.1.2. If-None-Match
+ 13.1.3. If-Modified-Since
+ 13.1.4. If-Unmodified-Since
+ 13.1.5. If-Range
+ 13.2. Evaluation of Preconditions
+ 13.2.1. When to Evaluate
+ 13.2.2. Precedence of Preconditions
+ 14. Range Requests
+ 14.1. Range Units
+ 14.1.1. Range Specifiers
+ 14.1.2. Byte Ranges
+ 14.2. Range
+ 14.3. Accept-Ranges
+ 14.4. Content-Range
+ 14.5. Partial PUT
+ 14.6. Media Type multipart/byteranges
+ 15. Status Codes
+ 15.1. Overview of Status Codes
+ 15.2. Informational 1xx
+ 15.2.1. 100 Continue
+ 15.2.2. 101 Switching Protocols
+ 15.3. Successful 2xx
+ 15.3.1. 200 OK
+ 15.3.2. 201 Created
+ 15.3.3. 202 Accepted
+ 15.3.4. 203 Non-Authoritative Information
+ 15.3.5. 204 No Content
+ 15.3.6. 205 Reset Content
+ 15.3.7. 206 Partial Content
+ 15.3.7.1. Single Part
+ 15.3.7.2. Multiple Parts
+ 15.3.7.3. Combining Parts
+ 15.4. Redirection 3xx
+ 15.4.1. 300 Multiple Choices
+ 15.4.2. 301 Moved Permanently
+ 15.4.3. 302 Found
+ 15.4.4. 303 See Other
+ 15.4.5. 304 Not Modified
+ 15.4.6. 305 Use Proxy
+ 15.4.7. 306 (Unused)
+ 15.4.8. 307 Temporary Redirect
+ 15.4.9. 308 Permanent Redirect
+ 15.5. Client Error 4xx
+ 15.5.1. 400 Bad Request
+ 15.5.2. 401 Unauthorized
+ 15.5.3. 402 Payment Required
+ 15.5.4. 403 Forbidden
+ 15.5.5. 404 Not Found
+ 15.5.6. 405 Method Not Allowed
+ 15.5.7. 406 Not Acceptable
+ 15.5.8. 407 Proxy Authentication Required
+ 15.5.9. 408 Request Timeout
+ 15.5.10. 409 Conflict
+ 15.5.11. 410 Gone
+ 15.5.12. 411 Length Required
+ 15.5.13. 412 Precondition Failed
+ 15.5.14. 413 Content Too Large
+ 15.5.15. 414 URI Too Long
+ 15.5.16. 415 Unsupported Media Type
+ 15.5.17. 416 Range Not Satisfiable
+ 15.5.18. 417 Expectation Failed
+ 15.5.19. 418 (Unused)
+ 15.5.20. 421 Misdirected Request
+ 15.5.21. 422 Unprocessable Content
+ 15.5.22. 426 Upgrade Required
+ 15.6. Server Error 5xx
+ 15.6.1. 500 Internal Server Error
+ 15.6.2. 501 Not Implemented
+ 15.6.3. 502 Bad Gateway
+ 15.6.4. 503 Service Unavailable
+ 15.6.5. 504 Gateway Timeout
+ 15.6.6. 505 HTTP Version Not Supported
+ 16. Extending HTTP
+ 16.1. Method Extensibility
+ 16.1.1. Method Registry
+ 16.1.2. Considerations for New Methods
+ 16.2. Status Code Extensibility
+ 16.2.1. Status Code Registry
+ 16.2.2. Considerations for New Status Codes
+ 16.3. Field Extensibility
+ 16.3.1. Field Name Registry
+ 16.3.2. Considerations for New Fields
+ 16.3.2.1. Considerations for New Field Names
+ 16.3.2.2. Considerations for New Field Values
+ 16.4. Authentication Scheme Extensibility
+ 16.4.1. Authentication Scheme Registry
+ 16.4.2. Considerations for New Authentication Schemes
+ 16.5. Range Unit Extensibility
+ 16.5.1. Range Unit Registry
+ 16.5.2. Considerations for New Range Units
+ 16.6. Content Coding Extensibility
+ 16.6.1. Content Coding Registry
+ 16.6.2. Considerations for New Content Codings
+ 16.7. Upgrade Token Registry
+ 17. Security Considerations
+ 17.1. Establishing Authority
+ 17.2. Risks of Intermediaries
+ 17.3. Attacks Based on File and Path Names
+ 17.4. Attacks Based on Command, Code, or Query Injection
+ 17.5. Attacks via Protocol Element Length
+ 17.6. Attacks Using Shared-Dictionary Compression
+ 17.7. Disclosure of Personal Information
+ 17.8. Privacy of Server Log Information
+ 17.9. Disclosure of Sensitive Information in URIs
+ 17.10. Application Handling of Field Names
+ 17.11. Disclosure of Fragment after Redirects
+ 17.12. Disclosure of Product Information
+ 17.13. Browser Fingerprinting
+ 17.14. Validator Retention
+ 17.15. Denial-of-Service Attacks Using Range
+ 17.16. Authentication Considerations
+ 17.16.1. Confidentiality of Credentials
+ 17.16.2. Credentials and Idle Clients
+ 17.16.3. Protection Spaces
+ 17.16.4. Additional Response Fields
+ 18. IANA Considerations
+ 18.1. URI Scheme Registration
+ 18.2. Method Registration
+ 18.3. Status Code Registration
+ 18.4. Field Name Registration
+ 18.5. Authentication Scheme Registration
+ 18.6. Content Coding Registration
+ 18.7. Range Unit Registration
+ 18.8. Media Type Registration
+ 18.9. Port Registration
+ 18.10. Upgrade Token Registration
+ 19. References
+ 19.1. Normative References
+ 19.2. Informative References
+ Appendix A. Collected ABNF
+ Appendix B. Changes from Previous RFCs
+ B.1. Changes from RFC 2818
+ B.2. Changes from RFC 7230
+ B.3. Changes from RFC 7231
+ B.4. Changes from RFC 7232
+ B.5. Changes from RFC 7233
+ B.6. Changes from RFC 7235
+ B.7. Changes from RFC 7538
+ B.8. Changes from RFC 7615
+ B.9. Changes from RFC 7694
+ Acknowledgements
+ Index
+ Authors' Addresses
+
+1. Introduction
+
+1.1. Purpose
+
+ The Hypertext Transfer Protocol (HTTP) is a family of stateless,
+ application-level, request/response protocols that share a generic
+ interface, extensible semantics, and self-descriptive messages to
+ enable flexible interaction with network-based hypertext information
+ systems.
+
+ HTTP hides the details of how a service is implemented by presenting
+ a uniform interface to clients that is independent of the types of
+ resources provided. Likewise, servers do not need to be aware of
+ each client's purpose: a request can be considered in isolation
+ rather than being associated with a specific type of client or a
+ predetermined sequence of application steps. This allows general-
+ purpose implementations to be used effectively in many different
+ contexts, reduces interaction complexity, and enables independent
+ evolution over time.
+
+ HTTP is also designed for use as an intermediation protocol, wherein
+ proxies and gateways can translate non-HTTP information systems into
+ a more generic interface.
+
+ One consequence of this flexibility is that the protocol cannot be
+ defined in terms of what occurs behind the interface. Instead, we
+ are limited to defining the syntax of communication, the intent of
+ received communication, and the expected behavior of recipients. If
+ the communication is considered in isolation, then successful actions
+ ought to be reflected in corresponding changes to the observable
+ interface provided by servers. However, since multiple clients might
+ act in parallel and perhaps at cross-purposes, we cannot require that
+ such changes be observable beyond the scope of a single response.
+
+1.2. History and Evolution
+
+ HTTP has been the primary information transfer protocol for the World
+ Wide Web since its introduction in 1990. It began as a trivial
+ mechanism for low-latency requests, with a single method (GET) to
+ request transfer of a presumed hypertext document identified by a
+ given pathname. As the Web grew, HTTP was extended to enclose
+ requests and responses within messages, transfer arbitrary data
+ formats using MIME-like media types, and route requests through
+ intermediaries. These protocols were eventually defined as HTTP/0.9
+ and HTTP/1.0 (see [HTTP/1.0]).
+
+ HTTP/1.1 was designed to refine the protocol's features while
+ retaining compatibility with the existing text-based messaging
+ syntax, improving its interoperability, scalability, and robustness
+ across the Internet. This included length-based data delimiters for
+ both fixed and dynamic (chunked) content, a consistent framework for
+ content negotiation, opaque validators for conditional requests,
+ cache controls for better cache consistency, range requests for
+ partial updates, and default persistent connections. HTTP/1.1 was
+ introduced in 1995 and published on the Standards Track in 1997
+ [RFC2068], revised in 1999 [RFC2616], and revised again in 2014
+ ([RFC7230] through [RFC7235]).
+
+ HTTP/2 ([HTTP/2]) introduced a multiplexed session layer on top of
+ the existing TLS and TCP protocols for exchanging concurrent HTTP
+ messages with efficient field compression and server push. HTTP/3
+ ([HTTP/3]) provides greater independence for concurrent messages by
+ using QUIC as a secure multiplexed transport over UDP instead of TCP.
+
+ All three major versions of HTTP rely on the semantics defined by
+ this document. They have not obsoleted each other because each one
+ has specific benefits and limitations depending on the context of
+ use. Implementations are expected to choose the most appropriate
+ transport and messaging syntax for their particular context.
+
+ This revision of HTTP separates the definition of semantics (this
+ document) and caching ([CACHING]) from the current HTTP/1.1 messaging
+ syntax ([HTTP/1.1]) to allow each major protocol version to progress
+ independently while referring to the same core semantics.
+
+1.3. Core Semantics
+
+ HTTP provides a uniform interface for interacting with a resource
+ (Section 3.1) -- regardless of its type, nature, or implementation --
+ by sending messages that manipulate or transfer representations
+ (Section 3.2).
+
+ Each message is either a request or a response. A client constructs
+ request messages that communicate its intentions and routes those
+ messages toward an identified origin server. A server listens for
+ requests, parses each message received, interprets the message
+ semantics in relation to the identified target resource, and responds
+ to that request with one or more response messages. The client
+ examines received responses to see if its intentions were carried
+ out, determining what to do next based on the status codes and
+ content received.
+
+ HTTP semantics include the intentions defined by each request method
+ (Section 9), extensions to those semantics that might be described in
+ request header fields, status codes that describe the response
+ (Section 15), and other control data and resource metadata that might
+ be given in response fields.
+
+ Semantics also include representation metadata that describe how
+ content is intended to be interpreted by a recipient, request header
+ fields that might influence content selection, and the various
+ selection algorithms that are collectively referred to as "content
+ negotiation" (Section 12).
+
+1.4. Specifications Obsoleted by This Document
+
+ +============================================+===========+=====+
+ | Title | Reference | See |
+ +============================================+===========+=====+
+ | HTTP Over TLS | [RFC2818] | B.1 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP/1.1 Message Syntax and Routing [*] | [RFC7230] | B.2 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP/1.1 Semantics and Content | [RFC7231] | B.3 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP/1.1 Conditional Requests | [RFC7232] | B.4 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP/1.1 Range Requests | [RFC7233] | B.5 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP/1.1 Authentication | [RFC7235] | B.6 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP Status Code 308 (Permanent Redirect) | [RFC7538] | B.7 |
+ +--------------------------------------------+-----------+-----+
+ | HTTP Authentication-Info and Proxy- | [RFC7615] | B.8 |
+ | Authentication-Info Response Header Fields | | |
+ +--------------------------------------------+-----------+-----+
+ | HTTP Client-Initiated Content-Encoding | [RFC7694] | B.9 |
+ +--------------------------------------------+-----------+-----+
+
+ Table 1
+
+ [*] This document only obsoletes the portions of RFC 7230 that are
+ independent of the HTTP/1.1 messaging syntax and connection
+ management; the remaining bits of RFC 7230 are obsoleted by
+ "HTTP/1.1" [HTTP/1.1].
+
+2. Conformance
+
+2.1. Syntax Notation
+
+ This specification uses the Augmented Backus-Naur Form (ABNF)
+ notation of [RFC5234], extended with the notation for case-
+ sensitivity in strings defined in [RFC7405].
+
+ It also uses a list extension, defined in Section 5.6.1, that allows
+ for compact definition of comma-separated lists using a "#" operator
+ (similar to how the "*" operator indicates repetition). Appendix A
+ shows the collected grammar with all list operators expanded to
+ standard ABNF notation.
+
+ As a convention, ABNF rule names prefixed with "obs-" denote obsolete
+ grammar rules that appear for historical reasons.
+
+ The following core rules are included by reference, as defined in
+ Appendix B.1 of [RFC5234]: ALPHA (letters), CR (carriage return),
+ CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double
+ quote), HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF
+ (line feed), OCTET (any 8-bit sequence of data), SP (space), and
+ VCHAR (any visible US-ASCII character).
+
+ Section 5.6 defines some generic syntactic components for field
+ values.
+
+ This specification uses the terms "character", "character encoding
+ scheme", "charset", and "protocol element" as they are defined in
+ [RFC6365].
+
+2.2. Requirements Notation
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ This specification targets conformance criteria according to the role
+ of a participant in HTTP communication. Hence, requirements are
+ placed on senders, recipients, clients, servers, user agents,
+ intermediaries, origin servers, proxies, gateways, or caches,
+ depending on what behavior is being constrained by the requirement.
+ Additional requirements are placed on implementations, resource
+ owners, and protocol element registrations when they apply beyond the
+ scope of a single communication.
+
+ The verb "generate" is used instead of "send" where a requirement
+ applies only to implementations that create the protocol element,
+ rather than an implementation that forwards a received element
+ downstream.
+
+ An implementation is considered conformant if it complies with all of
+ the requirements associated with the roles it partakes in HTTP.
+
+ A sender MUST NOT generate protocol elements that do not match the
+ grammar defined by the corresponding ABNF rules. Within a given
+ message, a sender MUST NOT generate protocol elements or syntax
+ alternatives that are only allowed to be generated by participants in
+ other roles (i.e., a role that the sender does not have for that
+ message).
+
+ Conformance to HTTP includes both conformance to the particular
+ messaging syntax of the protocol version in use and conformance to
+ the semantics of protocol elements sent. For example, a client that
+ claims conformance to HTTP/1.1 but fails to recognize the features
+ required of HTTP/1.1 recipients will fail to interoperate with
+ servers that adjust their responses in accordance with those claims.
+ Features that reflect user choices, such as content negotiation and
+ user-selected extensions, can impact application behavior beyond the
+ protocol stream; sending protocol elements that inaccurately reflect
+ a user's choices will confuse the user and inhibit choice.
+
+ When an implementation fails semantic conformance, recipients of that
+ implementation's messages will eventually develop workarounds to
+ adjust their behavior accordingly. A recipient MAY employ such
+ workarounds while remaining conformant to this protocol if the
+ workarounds are limited to the implementations at fault. For
+ example, servers often scan portions of the User-Agent field value,
+ and user agents often scan the Server field value, to adjust their
+ own behavior with respect to known bugs or poorly chosen defaults.
+
+2.3. Length Requirements
+
+ A recipient SHOULD parse a received protocol element defensively,
+ with only marginal expectations that the element will conform to its
+ ABNF grammar and fit within a reasonable buffer size.
+
+ HTTP does not have specific length limitations for many of its
+ protocol elements because the lengths that might be appropriate will
+ vary widely, depending on the deployment context and purpose of the
+ implementation. Hence, interoperability between senders and
+ recipients depends on shared expectations regarding what is a
+ reasonable length for each protocol element. Furthermore, what is
+ commonly understood to be a reasonable length for some protocol
+ elements has changed over the course of the past three decades of
+ HTTP use and is expected to continue changing in the future.
+
+ At a minimum, a recipient MUST be able to parse and process protocol
+ element lengths that are at least as long as the values that it
+ generates for those same protocol elements in other messages. For
+ example, an origin server that publishes very long URI references to
+ its own resources needs to be able to parse and process those same
+ references when received as a target URI.
+
+ Many received protocol elements are only parsed to the extent
+ necessary to identify and forward that element downstream. For
+ example, an intermediary might parse a received field into its field
+ name and field value components, but then forward the field without
+ further parsing inside the field value.
+
+2.4. Error Handling
+
+ A recipient MUST interpret a received protocol element according to
+ the semantics defined for it by this specification, including
+ extensions to this specification, unless the recipient has determined
+ (through experience or configuration) that the sender incorrectly
+ implements what is implied by those semantics. For example, an
+ origin server might disregard the contents of a received
+ Accept-Encoding header field if inspection of the User-Agent header
+ field indicates a specific implementation version that is known to
+ fail on receipt of certain content codings.
+
+ Unless noted otherwise, a recipient MAY attempt to recover a usable
+ protocol element from an invalid construct. HTTP does not define
+ specific error handling mechanisms except when they have a direct
+ impact on security, since different applications of the protocol
+ require different error handling strategies. For example, a Web
+ browser might wish to transparently recover from a response where the
+ Location header field doesn't parse according to the ABNF, whereas a
+ systems control client might consider any form of error recovery to
+ be dangerous.
+
+ Some requests can be automatically retried by a client in the event
+ of an underlying connection failure, as described in Section 9.2.2.
+
+2.5. Protocol Version
+
+ HTTP's version number consists of two decimal digits separated by a
+ "." (period or decimal point). The first digit (major version)
+ indicates the messaging syntax, whereas the second digit (minor
+ version) indicates the highest minor version within that major
+ version to which the sender is conformant (able to understand for
+ future communication).
+
+ While HTTP's core semantics don't change between protocol versions,
+ their expression "on the wire" can change, and so the HTTP version
+ number changes when incompatible changes are made to the wire format.
+ Additionally, HTTP allows incremental, backwards-compatible changes
+ to be made to the protocol without changing its version through the
+ use of defined extension points (Section 16).
+
+ The protocol version as a whole indicates the sender's conformance
+ with the set of requirements laid out in that version's corresponding
+ specification(s). For example, the version "HTTP/1.1" is defined by
+ the combined specifications of this document, "HTTP Caching"
+ [CACHING], and "HTTP/1.1" [HTTP/1.1].
+
+ HTTP's major version number is incremented when an incompatible
+ message syntax is introduced. The minor number is incremented when
+ changes made to the protocol have the effect of adding to the message
+ semantics or implying additional capabilities of the sender.
+
+ The minor version advertises the sender's communication capabilities
+ even when the sender is only using a backwards-compatible subset of
+ the protocol, thereby letting the recipient know that more advanced
+ features can be used in response (by servers) or in future requests
+ (by clients).
+
+ When a major version of HTTP does not define any minor versions, the
+ minor version "0" is implied. The "0" is used when referring to that
+ protocol within elements that require a minor version identifier.
+
+3. Terminology and Core Concepts
+
+ HTTP was created for the World Wide Web (WWW) architecture and has
+ evolved over time to support the scalability needs of a worldwide
+ hypertext system. Much of that architecture is reflected in the
+ terminology used to define HTTP.
+
+3.1. Resources
+
+ The target of an HTTP request is called a "resource". HTTP does not
+ limit the nature of a resource; it merely defines an interface that
+ might be used to interact with resources. Most resources are
+ identified by a Uniform Resource Identifier (URI), as described in
+ Section 4.
+
+ One design goal of HTTP is to separate resource identification from
+ request semantics, which is made possible by vesting the request
+ semantics in the request method (Section 9) and a few request-
+ modifying header fields. A resource cannot treat a request in a
+ manner inconsistent with the semantics of the method of the request.
+ For example, though the URI of a resource might imply semantics that
+ are not safe, a client can expect the resource to avoid actions that
+ are unsafe when processing a request with a safe method (see
+ Section 9.2.1).
+
+ HTTP relies upon the Uniform Resource Identifier (URI) standard [URI]
+ to indicate the target resource (Section 7.1) and relationships
+ between resources.
+
+3.2. Representations
+
+ A "representation" is information that is intended to reflect a past,
+ current, or desired state of a given resource, in a format that can
+ be readily communicated via the protocol. A representation consists
+ of a set of representation metadata and a potentially unbounded
+ stream of representation data (Section 8).
+
+ HTTP allows "information hiding" behind its uniform interface by
+ defining communication with respect to a transferable representation
+ of the resource state, rather than transferring the resource itself.
+ This allows the resource identified by a URI to be anything,
+ including temporal functions like "the current weather in Laguna
+ Beach", while potentially providing information that represents that
+ resource at the time a message is generated [REST].
+
+ The uniform interface is similar to a window through which one can
+ observe and act upon a thing only through the communication of
+ messages to an independent actor on the other side. A shared
+ abstraction is needed to represent ("take the place of") the current
+ or desired state of that thing in our communications. When a
+ representation is hypertext, it can provide both a representation of
+ the resource state and processing instructions that help guide the
+ recipient's future interactions.
+
+ A target resource might be provided with, or be capable of
+ generating, multiple representations that are each intended to
+ reflect the resource's current state. An algorithm, usually based on
+ content negotiation (Section 12), would be used to select one of
+ those representations as being most applicable to a given request.
+ This "selected representation" provides the data and metadata for
+ evaluating conditional requests (Section 13) and constructing the
+ content for 200 (OK), 206 (Partial Content), and 304 (Not Modified)
+ responses to GET (Section 9.3.1).
+
+3.3. Connections, Clients, and Servers
+
+ HTTP is a client/server protocol that operates over a reliable
+ transport- or session-layer "connection".
+
+ An HTTP "client" is a program that establishes a connection to a
+ server for the purpose of sending one or more HTTP requests. An HTTP
+ "server" is a program that accepts connections in order to service
+ HTTP requests by sending HTTP responses.
+
+ The terms client and server refer only to the roles that these
+ programs perform for a particular connection. The same program might
+ act as a client on some connections and a server on others.
+
+ HTTP is defined as a stateless protocol, meaning that each request
+ message's semantics can be understood in isolation, and that the
+ relationship between connections and messages on them has no impact
+ on the interpretation of those messages. For example, a CONNECT
+ request (Section 9.3.6) or a request with the Upgrade header field
+ (Section 7.8) can occur at any time, not just in the first message on
+ a connection. Many implementations depend on HTTP's stateless design
+ in order to reuse proxied connections or dynamically load balance
+ requests across multiple servers.
+
+ As a result, a server MUST NOT assume that two requests on the same
+ connection are from the same user agent unless the connection is
+ secured and specific to that agent. Some non-standard HTTP
+ extensions (e.g., [RFC4559]) have been known to violate this
+ requirement, resulting in security and interoperability problems.
+
+3.4. Messages
+
+ HTTP is a stateless request/response protocol for exchanging
+ "messages" across a connection. The terms "sender" and "recipient"
+ refer to any implementation that sends or receives a given message,
+ respectively.
+
+ A client sends requests to a server in the form of a "request"
+ message with a method (Section 9) and request target (Section 7.1).
+ The request might also contain header fields (Section 6.3) for
+ request modifiers, client information, and representation metadata,
+ content (Section 6.4) intended for processing in accordance with the
+ method, and trailer fields (Section 6.5) to communicate information
+ collected while sending the content.
+
+ A server responds to a client's request by sending one or more
+ "response" messages, each including a status code (Section 15). The
+ response might also contain header fields for server information,
+ resource metadata, and representation metadata, content to be
+ interpreted in accordance with the status code, and trailer fields to
+ communicate information collected while sending the content.
+
+3.5. User Agents
+
+ The term "user agent" refers to any of the various client programs
+ that initiate a request.
+
+ The most familiar form of user agent is the general-purpose Web
+ browser, but that's only a small percentage of implementations.
+ Other common user agents include spiders (web-traversing robots),
+ command-line tools, billboard screens, household appliances, scales,
+ light bulbs, firmware update scripts, mobile apps, and communication
+ devices in a multitude of shapes and sizes.
+
+ Being a user agent does not imply that there is a human user directly
+ interacting with the software agent at the time of a request. In
+ many cases, a user agent is installed or configured to run in the
+ background and save its results for later inspection (or save only a
+ subset of those results that might be interesting or erroneous).
+ Spiders, for example, are typically given a start URI and configured
+ to follow certain behavior while crawling the Web as a hypertext
+ graph.
+
+ Many user agents cannot, or choose not to, make interactive
+ suggestions to their user or provide adequate warning for security or
+ privacy concerns. In the few cases where this specification requires
+ reporting of errors to the user, it is acceptable for such reporting
+ to only be observable in an error console or log file. Likewise,
+ requirements that an automated action be confirmed by the user before
+ proceeding might be met via advance configuration choices, run-time
+ options, or simple avoidance of the unsafe action; confirmation does
+ not imply any specific user interface or interruption of normal
+ processing if the user has already made that choice.
+
+3.6. Origin Server
+
+ The term "origin server" refers to a program that can originate
+ authoritative responses for a given target resource.
+
+ The most familiar form of origin server are large public websites.
+ However, like user agents being equated with browsers, it is easy to
+ be misled into thinking that all origin servers are alike. Common
+ origin servers also include home automation units, configurable
+ networking components, office machines, autonomous robots, news
+ feeds, traffic cameras, real-time ad selectors, and video-on-demand
+ platforms.
+
+ Most HTTP communication consists of a retrieval request (GET) for a
+ representation of some resource identified by a URI. In the simplest
+ case, this might be accomplished via a single bidirectional
+ connection (===) between the user agent (UA) and the origin server
+ (O).
+
+ request >
+ UA ======================================= O
+ < response
+
+ Figure 1
+
+3.7. Intermediaries
+
+ HTTP enables the use of intermediaries to satisfy requests through a
+ chain of connections. There are three common forms of HTTP
+ "intermediary": proxy, gateway, and tunnel. In some cases, a single
+ intermediary might act as an origin server, proxy, gateway, or
+ tunnel, switching behavior based on the nature of each request.
+
+ > > > >
+ UA =========== A =========== B =========== C =========== O
+ < < < <
+
+ Figure 2
+
+ The figure above shows three intermediaries (A, B, and C) between the
+ user agent and origin server. A request or response message that
+ travels the whole chain will pass through four separate connections.
+ Some HTTP communication options might apply only to the connection
+ with the nearest, non-tunnel neighbor, only to the endpoints of the
+ chain, or to all connections along the chain. Although the diagram
+ is linear, each participant might be engaged in multiple,
+ simultaneous communications. For example, B might be receiving
+ requests from many clients other than A, and/or forwarding requests
+ to servers other than C, at the same time that it is handling A's
+ request. Likewise, later requests might be sent through a different
+ path of connections, often based on dynamic configuration for load
+ balancing.
+
+ The terms "upstream" and "downstream" are used to describe
+ directional requirements in relation to the message flow: all
+ messages flow from upstream to downstream. The terms "inbound" and
+ "outbound" are used to describe directional requirements in relation
+ to the request route: inbound means "toward the origin server",
+ whereas outbound means "toward the user agent".
+
+ A "proxy" is a message-forwarding agent that is chosen by the client,
+ usually via local configuration rules, to receive requests for some
+ type(s) of absolute URI and attempt to satisfy those requests via
+ translation through the HTTP interface. Some translations are
+ minimal, such as for proxy requests for "http" URIs, whereas other
+ requests might require translation to and from entirely different
+ application-level protocols. Proxies are often used to group an
+ organization's HTTP requests through a common intermediary for the
+ sake of security services, annotation services, or shared caching.
+ Some proxies are designed to apply transformations to selected
+ messages or content while they are being forwarded, as described in
+ Section 7.7.
+
+ A "gateway" (a.k.a. "reverse proxy") is an intermediary that acts as
+ an origin server for the outbound connection but translates received
+ requests and forwards them inbound to another server or servers.
+ Gateways are often used to encapsulate legacy or untrusted
+ information services, to improve server performance through
+ "accelerator" caching, and to enable partitioning or load balancing
+ of HTTP services across multiple machines.
+
+ All HTTP requirements applicable to an origin server also apply to
+ the outbound communication of a gateway. A gateway communicates with
+ inbound servers using any protocol that it desires, including private
+ extensions to HTTP that are outside the scope of this specification.
+ However, an HTTP-to-HTTP gateway that wishes to interoperate with
+ third-party HTTP servers needs to conform to user agent requirements
+ on the gateway's inbound connection.
+
+ A "tunnel" acts as a blind relay between two connections without
+ changing the messages. Once active, a tunnel is not considered a
+ party to the HTTP communication, though the tunnel might have been
+ initiated by an HTTP request. A tunnel ceases to exist when both
+ ends of the relayed connection are closed. Tunnels are used to
+ extend a virtual connection through an intermediary, such as when
+ Transport Layer Security (TLS, [TLS13]) is used to establish
+ confidential communication through a shared firewall proxy.
+
+ The above categories for intermediary only consider those acting as
+ participants in the HTTP communication. There are also
+ intermediaries that can act on lower layers of the network protocol
+ stack, filtering or redirecting HTTP traffic without the knowledge or
+ permission of message senders. Network intermediaries are
+ indistinguishable (at a protocol level) from an on-path attacker,
+ often introducing security flaws or interoperability problems due to
+ mistakenly violating HTTP semantics.
+
+ For example, an "interception proxy" [RFC3040] (also commonly known
+ as a "transparent proxy" [RFC1919]) differs from an HTTP proxy
+ because it is not chosen by the client. Instead, an interception
+ proxy filters or redirects outgoing TCP port 80 packets (and
+ occasionally other common port traffic). Interception proxies are
+ commonly found on public network access points, as a means of
+ enforcing account subscription prior to allowing use of non-local
+ Internet services, and within corporate firewalls to enforce network
+ usage policies.
+
+3.8. Caches
+
+ A "cache" is a local store of previous response messages and the
+ subsystem that controls its message storage, retrieval, and deletion.
+ A cache stores cacheable responses in order to reduce the response
+ time and network bandwidth consumption on future, equivalent
+ requests. Any client or server MAY employ a cache, though a cache
+ cannot be used while acting as a tunnel.
+
+ The effect of a cache is that the request/response chain is shortened
+ if one of the participants along the chain has a cached response
+ applicable to that request. The following illustrates the resulting
+ chain if B has a cached copy of an earlier response from O (via C)
+ for a request that has not been cached by UA or A.
+
+ > >
+ UA =========== A =========== B - - - - - - C - - - - - - O
+ < <
+
+ Figure 3
+
+ A response is "cacheable" if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests. Even
+ when a response is cacheable, there might be additional constraints
+ placed by the client or by the origin server on when that cached
+ response can be used for a particular request. HTTP requirements for
+ cache behavior and cacheable responses are defined in [CACHING].
+
+ There is a wide variety of architectures and configurations of caches
+ deployed across the World Wide Web and inside large organizations.
+ These include national hierarchies of proxy caches to save bandwidth
+ and reduce latency, content delivery networks that use gateway
+ caching to optimize regional and global distribution of popular
+ sites, collaborative systems that broadcast or multicast cache
+ entries, archives of pre-fetched cache entries for use in off-line or
+ high-latency environments, and so on.
+
+3.9. Example Message Exchange
+
+ The following example illustrates a typical HTTP/1.1 message exchange
+ for a GET request (Section 9.3.1) on the URI "http://www.example.com/
+ hello.txt":
+
+ Client request:
+
+ GET /hello.txt HTTP/1.1
+ User-Agent: curl/7.64.1
+ Host: www.example.com
+ Accept-Language: en, mi
+
+ Server response:
+
+ HTTP/1.1 200 OK
+ Date: Mon, 27 Jul 2009 12:28:53 GMT
+ Server: Apache
+ Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
+ ETag: "34aa387-d-1568eb00"
+ Accept-Ranges: bytes
+ Content-Length: 51
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+
+ Hello World! My content includes a trailing CRLF.
+
+4. Identifiers in HTTP
+
+ Uniform Resource Identifiers (URIs) [URI] are used throughout HTTP as
+ the means for identifying resources (Section 3.1).
+
+4.1. URI References
+
+ URI references are used to target requests, indicate redirects, and
+ define relationships.
+
+ The definitions of "URI-reference", "absolute-URI", "relative-part",
+ "authority", "port", "host", "path-abempty", "segment", and "query"
+ are adopted from the URI generic syntax. An "absolute-path" rule is
+ defined for protocol elements that can contain a non-empty path
+ component. (This rule differs slightly from the path-abempty rule of
+ RFC 3986, which allows for an empty path, and path-absolute rule,
+ which does not allow paths that begin with "//".) A "partial-URI"
+ rule is defined for protocol elements that can contain a relative URI
+ but not a fragment component.
+
+ URI-reference = <URI-reference, see [URI], Section 4.1>
+ absolute-URI = <absolute-URI, see [URI], Section 4.3>
+ relative-part = <relative-part, see [URI], Section 4.2>
+ authority = <authority, see [URI], Section 3.2>
+ uri-host = <host, see [URI], Section 3.2.2>
+ port = <port, see [URI], Section 3.2.3>
+ path-abempty = <path-abempty, see [URI], Section 3.3>
+ segment = <segment, see [URI], Section 3.3>
+ query = <query, see [URI], Section 3.4>
+
+ absolute-path = 1*( "/" segment )
+ partial-URI = relative-part [ "?" query ]
+
+ Each protocol element in HTTP that allows a URI reference will
+ indicate in its ABNF production whether the element allows any form
+ of reference (URI-reference), only a URI in absolute form (absolute-
+ URI), only the path and optional query components (partial-URI), or
+ some combination of the above. Unless otherwise indicated, URI
+ references are parsed relative to the target URI (Section 7.1).
+
+ It is RECOMMENDED that all senders and recipients support, at a
+ minimum, URIs with lengths of 8000 octets in protocol elements. Note
+ that this implies some structures and on-wire representations (for
+ example, the request line in HTTP/1.1) will necessarily be larger in
+ some cases.
+
+4.2. HTTP-Related URI Schemes
+
+ IANA maintains the registry of URI Schemes [BCP35] at
+ <https://www.iana.org/assignments/uri-schemes/>. Although requests
+ might target any URI scheme, the following schemes are inherent to
+ HTTP servers:
+
+ +============+====================================+=========+
+ | URI Scheme | Description | Section |
+ +============+====================================+=========+
+ | http | Hypertext Transfer Protocol | 4.2.1 |
+ +------------+------------------------------------+---------+
+ | https | Hypertext Transfer Protocol Secure | 4.2.2 |
+ +------------+------------------------------------+---------+
+
+ Table 2
+
+ Note that the presence of an "http" or "https" URI does not imply
+ that there is always an HTTP server at the identified origin
+ listening for connections. Anyone can mint a URI, whether or not a
+ server exists and whether or not that server currently maps that
+ identifier to a resource. The delegated nature of registered names
+ and IP addresses creates a federated namespace whether or not an HTTP
+ server is present.
+
+4.2.1. http URI Scheme
+
+ The "http" URI scheme is hereby defined for minting identifiers
+ within the hierarchical namespace governed by a potential HTTP origin
+ server listening for TCP ([TCP]) connections on a given port.
+
+ http-URI = "http" "://" authority path-abempty [ "?" query ]
+
+ The origin server for an "http" URI is identified by the authority
+ component, which includes a host identifier ([URI], Section 3.2.2)
+ and optional port number ([URI], Section 3.2.3). If the port
+ subcomponent is empty or not given, TCP port 80 (the reserved port
+ for WWW services) is the default. The origin determines who has the
+ right to respond authoritatively to requests that target the
+ identified resource, as defined in Section 4.3.2.
+
+ A sender MUST NOT generate an "http" URI with an empty host
+ identifier. A recipient that processes such a URI reference MUST
+ reject it as invalid.
+
+ The hierarchical path component and optional query component identify
+ the target resource within that origin server's namespace.
+
+4.2.2. https URI Scheme
+
+ The "https" URI scheme is hereby defined for minting identifiers
+ within the hierarchical namespace governed by a potential origin
+ server listening for TCP connections on a given port and capable of
+ establishing a TLS ([TLS13]) connection that has been secured for
+ HTTP communication. In this context, "secured" specifically means
+ that the server has been authenticated as acting on behalf of the
+ identified authority and all HTTP communication with that server has
+ confidentiality and integrity protection that is acceptable to both
+ client and server.
+
+ https-URI = "https" "://" authority path-abempty [ "?" query ]
+
+ The origin server for an "https" URI is identified by the authority
+ component, which includes a host identifier ([URI], Section 3.2.2)
+ and optional port number ([URI], Section 3.2.3). If the port
+ subcomponent is empty or not given, TCP port 443 (the reserved port
+ for HTTP over TLS) is the default. The origin determines who has the
+ right to respond authoritatively to requests that target the
+ identified resource, as defined in Section 4.3.3.
+
+ A sender MUST NOT generate an "https" URI with an empty host
+ identifier. A recipient that processes such a URI reference MUST
+ reject it as invalid.
+
+ The hierarchical path component and optional query component identify
+ the target resource within that origin server's namespace.
+
+ A client MUST ensure that its HTTP requests for an "https" resource
+ are secured, prior to being communicated, and that it only accepts
+ secured responses to those requests. Note that the definition of
+ what cryptographic mechanisms are acceptable to client and server are
+ usually negotiated and can change over time.
+
+ Resources made available via the "https" scheme have no shared
+ identity with the "http" scheme. They are distinct origins with
+ separate namespaces. However, extensions to HTTP that are defined as
+ applying to all origins with the same host, such as the Cookie
+ protocol [COOKIE], allow information set by one service to impact
+ communication with other services within a matching group of host
+ domains. Such extensions ought to be designed with great care to
+ prevent information obtained from a secured connection being
+ inadvertently exchanged within an unsecured context.
+
+4.2.3. http(s) Normalization and Comparison
+
+ URIs with an "http" or "https" scheme are normalized and compared
+ according to the methods defined in Section 6 of [URI], using the
+ defaults described above for each scheme.
+
+ HTTP does not require the use of a specific method for determining
+ equivalence. For example, a cache key might be compared as a simple
+ string, after syntax-based normalization, or after scheme-based
+ normalization.
+
+ Scheme-based normalization (Section 6.2.3 of [URI]) of "http" and
+ "https" URIs involves the following additional rules:
+
+ * If the port is equal to the default port for a scheme, the normal
+ form is to omit the port subcomponent.
+
+ * When not being used as the target of an OPTIONS request, an empty
+ path component is equivalent to an absolute path of "/", so the
+ normal form is to provide a path of "/" instead.
+
+ * The scheme and host are case-insensitive and normally provided in
+ lowercase; all other components are compared in a case-sensitive
+ manner.
+
+ * Characters other than those in the "reserved" set are equivalent
+ to their percent-encoded octets: the normal form is to not encode
+ them (see Sections 2.1 and 2.2 of [URI]).
+
+ For example, the following three URIs are equivalent:
+
+ http://example.com:80/~smith/home.html
+ http://EXAMPLE.com/%7Esmith/home.html
+ http://EXAMPLE.com:/%7esmith/home.html
+
+ Two HTTP URIs that are equivalent after normalization (using any
+ method) can be assumed to identify the same resource, and any HTTP
+ component MAY perform normalization. As a result, distinct resources
+ SHOULD NOT be identified by HTTP URIs that are equivalent after
+ normalization (using any method defined in Section 6.2 of [URI]).
+
+4.2.4. Deprecation of userinfo in http(s) URIs
+
+ The URI generic syntax for authority also includes a userinfo
+ subcomponent ([URI], Section 3.2.1) for including user authentication
+ information in the URI. In that subcomponent, the use of the format
+ "user:password" is deprecated.
+
+ Some implementations make use of the userinfo component for internal
+ configuration of authentication information, such as within command
+ invocation options, configuration files, or bookmark lists, even
+ though such usage might expose a user identifier or password.
+
+ A sender MUST NOT generate the userinfo subcomponent (and its "@"
+ delimiter) when an "http" or "https" URI reference is generated
+ within a message as a target URI or field value.
+
+ Before making use of an "http" or "https" URI reference received from
+ an untrusted source, a recipient SHOULD parse for userinfo and treat
+ its presence as an error; it is likely being used to obscure the
+ authority for the sake of phishing attacks.
+
+4.2.5. http(s) References with Fragment Identifiers
+
+ Fragment identifiers allow for indirect identification of a secondary
+ resource, independent of the URI scheme, as defined in Section 3.5 of
+ [URI]. Some protocol elements that refer to a URI allow inclusion of
+ a fragment, while others do not. They are distinguished by use of
+ the ABNF rule for elements where fragment is allowed; otherwise, a
+ specific rule that excludes fragments is used.
+
+ | *Note:* The fragment identifier component is not part of the
+ | scheme definition for a URI scheme (see Section 4.3 of [URI]),
+ | thus does not appear in the ABNF definitions for the "http" and
+ | "https" URI schemes above.
+
+4.3. Authoritative Access
+
+ Authoritative access refers to dereferencing a given identifier, for
+ the sake of access to the identified resource, in a way that the
+ client believes is authoritative (controlled by the resource owner).
+ The process for determining whether access is granted is defined by
+ the URI scheme and often uses data within the URI components, such as
+ the authority component when the generic syntax is used. However,
+ authoritative access is not limited to the identified mechanism.
+
+ Section 4.3.1 defines the concept of an origin as an aid to such
+ uses, and the subsequent subsections explain how to establish that a
+ peer has the authority to represent an origin.
+
+ See Section 17.1 for security considerations related to establishing
+ authority.
+
+4.3.1. URI Origin
+
+ The "origin" for a given URI is the triple of scheme, host, and port
+ after normalizing the scheme and host to lowercase and normalizing
+ the port to remove any leading zeros. If port is elided from the
+ URI, the default port for that scheme is used. For example, the URI
+
+ https://Example.Com/happy.js
+
+ would have the origin
+
+ { "https", "example.com", "443" }
+
+ which can also be described as the normalized URI prefix with port
+ always present:
+
+ https://example.com:443
+
+ Each origin defines its own namespace and controls how identifiers
+ within that namespace are mapped to resources. In turn, how the
+ origin responds to valid requests, consistently over time, determines
+ the semantics that users will associate with a URI, and the
+ usefulness of those semantics is what ultimately transforms these
+ mechanisms into a resource for users to reference and access in the
+ future.
+
+ Two origins are distinct if they differ in scheme, host, or port.
+ Even when it can be verified that the same entity controls two
+ distinct origins, the two namespaces under those origins are distinct
+ unless explicitly aliased by a server authoritative for that origin.
+
+ Origin is also used within HTML and related Web protocols, beyond the
+ scope of this document, as described in [RFC6454].
+
+4.3.2. http Origins
+
+ Although HTTP is independent of the transport protocol, the "http"
+ scheme (Section 4.2.1) is specific to associating authority with
+ whomever controls the origin server listening for TCP connections on
+ the indicated port of whatever host is identified within the
+ authority component. This is a very weak sense of authority because
+ it depends on both client-specific name resolution mechanisms and
+ communication that might not be secured from an on-path attacker.
+ Nevertheless, it is a sufficient minimum for binding "http"
+ identifiers to an origin server for consistent resolution within a
+ trusted environment.
+
+ If the host identifier is provided as an IP address, the origin
+ server is the listener (if any) on the indicated TCP port at that IP
+ address. If host is a registered name, the registered name is an
+ indirect identifier for use with a name resolution service, such as
+ DNS, to find an address for an appropriate origin server.
+
+ When an "http" URI is used within a context that calls for access to
+ the indicated resource, a client MAY attempt access by resolving the
+ host identifier to an IP address, establishing a TCP connection to
+ that address on the indicated port, and sending over that connection
+ an HTTP request message containing a request target that matches the
+ client's target URI (Section 7.1).
+
+ If the server responds to such a request with a non-interim HTTP
+ response message, as described in Section 15, then that response is
+ considered an authoritative answer to the client's request.
+
+ Note, however, that the above is not the only means for obtaining an
+ authoritative response, nor does it imply that an authoritative
+ response is always necessary (see [CACHING]). For example, the Alt-
+ Svc header field [ALTSVC] allows an origin server to identify other
+ services that are also authoritative for that origin. Access to
+ "http" identified resources might also be provided by protocols
+ outside the scope of this document.
+
+4.3.3. https Origins
+
+ The "https" scheme (Section 4.2.2) associates authority based on the
+ ability of a server to use the private key corresponding to a
+ certificate that the client considers to be trustworthy for the
+ identified origin server. The client usually relies upon a chain of
+ trust, conveyed from some prearranged or configured trust anchor, to
+ deem a certificate trustworthy (Section 4.3.4).
+
+ In HTTP/1.1 and earlier, a client will only attribute authority to a
+ server when they are communicating over a successfully established
+ and secured connection specifically to that URI origin's host. The
+ connection establishment and certificate verification are used as
+ proof of authority.
+
+ In HTTP/2 and HTTP/3, a client will attribute authority to a server
+ when they are communicating over a successfully established and
+ secured connection if the URI origin's host matches any of the hosts
+ present in the server's certificate and the client believes that it
+ could open a connection to that host for that URI. In practice, a
+ client will make a DNS query to check that the origin's host contains
+ the same server IP address as the established connection. This
+ restriction can be removed by the origin server sending an equivalent
+ ORIGIN frame [RFC8336].
+
+ The request target's host and port value are passed within each HTTP
+ request, identifying the origin and distinguishing it from other
+ namespaces that might be controlled by the same server (Section 7.2).
+ It is the origin's responsibility to ensure that any services
+ provided with control over its certificate's private key are equally
+ responsible for managing the corresponding "https" namespaces or at
+ least prepared to reject requests that appear to have been
+ misdirected (Section 7.4).
+
+ An origin server might be unwilling to process requests for certain
+ target URIs even when they have the authority to do so. For example,
+ when a host operates distinct services on different ports (e.g., 443
+ and 8000), checking the target URI at the origin server is necessary
+ (even after the connection has been secured) because a network
+ attacker might cause connections for one port to be received at some
+ other port. Failing to check the target URI might allow such an
+ attacker to replace a response to one target URI (e.g.,
+ "https://example.com/foo") with a seemingly authoritative response
+ from the other port (e.g., "https://example.com:8000/foo").
+
+ Note that the "https" scheme does not rely on TCP and the connected
+ port number for associating authority, since both are outside the
+ secured communication and thus cannot be trusted as definitive.
+ Hence, the HTTP communication might take place over any channel that
+ has been secured, as defined in Section 4.2.2, including protocols
+ that don't use TCP.
+
+ When an "https" URI is used within a context that calls for access to
+ the indicated resource, a client MAY attempt access by resolving the
+ host identifier to an IP address, establishing a TCP connection to
+ that address on the indicated port, securing the connection end-to-
+ end by successfully initiating TLS over TCP with confidentiality and
+ integrity protection, and sending over that connection an HTTP
+ request message containing a request target that matches the client's
+ target URI (Section 7.1).
+
+ If the server responds to such a request with a non-interim HTTP
+ response message, as described in Section 15, then that response is
+ considered an authoritative answer to the client's request.
+
+ Note, however, that the above is not the only means for obtaining an
+ authoritative response, nor does it imply that an authoritative
+ response is always necessary (see [CACHING]).
+
+4.3.4. https Certificate Verification
+
+ To establish a secured connection to dereference a URI, a client MUST
+ verify that the service's identity is an acceptable match for the
+ URI's origin server. Certificate verification is used to prevent
+ server impersonation by an on-path attacker or by an attacker that
+ controls name resolution. This process requires that a client be
+ configured with a set of trust anchors.
+
+ In general, a client MUST verify the service identity using the
+ verification process defined in Section 6 of [RFC6125]. The client
+ MUST construct a reference identity from the service's host: if the
+ host is a literal IP address (Section 4.3.5), the reference identity
+ is an IP-ID, otherwise the host is a name and the reference identity
+ is a DNS-ID.
+
+ A reference identity of type CN-ID MUST NOT be used by clients. As
+ noted in Section 6.2.1 of [RFC6125], a reference identity of type CN-
+ ID might be used by older clients.
+
+ A client might be specially configured to accept an alternative form
+ of server identity verification. For example, a client might be
+ connecting to a server whose address and hostname are dynamic, with
+ an expectation that the service will present a specific certificate
+ (or a certificate matching some externally defined reference
+ identity) rather than one matching the target URI's origin.
+
+ In special cases, it might be appropriate for a client to simply
+ ignore the server's identity, but it must be understood that this
+ leaves a connection open to active attack.
+
+ If the certificate is not valid for the target URI's origin, a user
+ agent MUST either obtain confirmation from the user before proceeding
+ (see Section 3.5) or terminate the connection with a bad certificate
+ error. Automated clients MUST log the error to an appropriate audit
+ log (if available) and SHOULD terminate the connection (with a bad
+ certificate error). Automated clients MAY provide a configuration
+ setting that disables this check, but MUST provide a setting which
+ enables it.
+
+4.3.5. IP-ID Reference Identity
+
+ A server that is identified using an IP address literal in the "host"
+ field of an "https" URI has a reference identity of type IP-ID. An
+ IP version 4 address uses the "IPv4address" ABNF rule, and an IP
+ version 6 address uses the "IP-literal" production with the
+ "IPv6address" option; see Section 3.2.2 of [URI]. A reference
+ identity of IP-ID contains the decoded bytes of the IP address.
+
+ An IP version 4 address is 4 octets, and an IP version 6 address is
+ 16 octets. Use of IP-ID is not defined for any other IP version.
+ The iPAddress choice in the certificate subjectAltName extension does
+ not explicitly include the IP version and so relies on the length of
+ the address to distinguish versions; see Section 4.2.1.6 of
+ [RFC5280].
+
+ A reference identity of type IP-ID matches if the address is
+ identical to an iPAddress value of the subjectAltName extension of
+ the certificate.
+
+5. Fields
+
+ HTTP uses "fields" to provide data in the form of extensible name/
+ value pairs with a registered key namespace. Fields are sent and
+ received within the header and trailer sections of messages
+ (Section 6).
+
+5.1. Field Names
+
+ A field name labels the corresponding field value as having the
+ semantics defined by that name. For example, the Date header field
+ is defined in Section 6.6.1 as containing the origination timestamp
+ for the message in which it appears.
+
+ field-name = token
+
+ Field names are case-insensitive and ought to be registered within
+ the "Hypertext Transfer Protocol (HTTP) Field Name Registry"; see
+ Section 16.3.1.
+
+ The interpretation of a field does not change between minor versions
+ of the same major HTTP version, though the default behavior of a
+ recipient in the absence of such a field can change. Unless
+ specified otherwise, fields are defined for all versions of HTTP. In
+ particular, the Host and Connection fields ought to be recognized by
+ all HTTP implementations whether or not they advertise conformance
+ with HTTP/1.1.
+
+ New fields can be introduced without changing the protocol version if
+ their defined semantics allow them to be safely ignored by recipients
+ that do not recognize them; see Section 16.3.
+
+ A proxy MUST forward unrecognized header fields unless the field name
+ is listed in the Connection header field (Section 7.6.1) or the proxy
+ is specifically configured to block, or otherwise transform, such
+ fields. Other recipients SHOULD ignore unrecognized header and
+ trailer fields. Adhering to these requirements allows HTTP's
+ functionality to be extended without updating or removing deployed
+ intermediaries.
+
+5.2. Field Lines and Combined Field Value
+
+ Field sections are composed of any number of "field lines", each with
+ a "field name" (see Section 5.1) identifying the field, and a "field
+ line value" that conveys data for that instance of the field.
+
+ When a field name is only present once in a section, the combined
+ "field value" for that field consists of the corresponding field line
+ value. When a field name is repeated within a section, its combined
+ field value consists of the list of corresponding field line values
+ within that section, concatenated in order, with each field line
+ value separated by a comma.
+
+ For example, this section:
+
+ Example-Field: Foo, Bar
+ Example-Field: Baz
+
+ contains two field lines, both with the field name "Example-Field".
+ The first field line has a field line value of "Foo, Bar", while the
+ second field line value is "Baz". The field value for "Example-
+ Field" is the list "Foo, Bar, Baz".
+
+5.3. Field Order
+
+ A recipient MAY combine multiple field lines within a field section
+ that have the same field name into one field line, without changing
+ the semantics of the message, by appending each subsequent field line
+ value to the initial field line value in order, separated by a comma
+ (",") and optional whitespace (OWS, defined in Section 5.6.3). For
+ consistency, use comma SP.
+
+ The order in which field lines with the same name are received is
+ therefore significant to the interpretation of the field value; a
+ proxy MUST NOT change the order of these field line values when
+ forwarding a message.
+
+ This means that, aside from the well-known exception noted below, a
+ sender MUST NOT generate multiple field lines with the same name in a
+ message (whether in the headers or trailers) or append a field line
+ when a field line of the same name already exists in the message,
+ unless that field's definition allows multiple field line values to
+ be recombined as a comma-separated list (i.e., at least one
+ alternative of the field's definition allows a comma-separated list,
+ such as an ABNF rule of #(values) defined in Section 5.6.1).
+
+ | *Note:* In practice, the "Set-Cookie" header field ([COOKIE])
+ | often appears in a response message across multiple field lines
+ | and does not use the list syntax, violating the above
+ | requirements on multiple field lines with the same field name.
+ | Since it cannot be combined into a single field value,
+ | recipients ought to handle "Set-Cookie" as a special case while
+ | processing fields. (See Appendix A.2.3 of [Kri2001] for
+ | details.)
+
+ The order in which field lines with differing field names are
+ received in a section is not significant. However, it is good
+ practice to send header fields that contain additional control data
+ first, such as Host on requests and Date on responses, so that
+ implementations can decide when not to handle a message as early as
+ possible.
+
+ A server MUST NOT apply a request to the target resource until it
+ receives the entire request header section, since later header field
+ lines might include conditionals, authentication credentials, or
+ deliberately misleading duplicate header fields that could impact
+ request processing.
+
+5.4. Field Limits
+
+ HTTP does not place a predefined limit on the length of each field
+ line, field value, or on the length of a header or trailer section as
+ a whole, as described in Section 2. Various ad hoc limitations on
+ individual lengths are found in practice, often depending on the
+ specific field's semantics.
+
+ A server that receives a request header field line, field value, or
+ set of fields larger than it wishes to process MUST respond with an
+ appropriate 4xx (Client Error) status code. Ignoring such header
+ fields would increase the server's vulnerability to request smuggling
+ attacks (Section 11.2 of [HTTP/1.1]).
+
+ A client MAY discard or truncate received field lines that are larger
+ than the client wishes to process if the field semantics are such
+ that the dropped value(s) can be safely ignored without changing the
+ message framing or response semantics.
+
+5.5. Field Values
+
+ HTTP field values consist of a sequence of characters in a format
+ defined by the field's grammar. Each field's grammar is usually
+ defined using ABNF ([RFC5234]).
+
+ field-value = *field-content
+ field-content = field-vchar
+ [ 1*( SP / HTAB / field-vchar ) field-vchar ]
+ field-vchar = VCHAR / obs-text
+ obs-text = %x80-FF
+
+ A field value does not include leading or trailing whitespace. When
+ a specific version of HTTP allows such whitespace to appear in a
+ message, a field parsing implementation MUST exclude such whitespace
+ prior to evaluating the field value.
+
+ Field values are usually constrained to the range of US-ASCII
+ characters [USASCII]. Fields needing a greater range of characters
+ can use an encoding, such as the one defined in [RFC8187].
+ Historically, HTTP allowed field content with text in the ISO-8859-1
+ charset [ISO-8859-1], supporting other charsets only through use of
+ [RFC2047] encoding. Specifications for newly defined fields SHOULD
+ limit their values to visible US-ASCII octets (VCHAR), SP, and HTAB.
+ A recipient SHOULD treat other allowed octets in field content (i.e.,
+ obs-text) as opaque data.
+
+ Field values containing CR, LF, or NUL characters are invalid and
+ dangerous, due to the varying ways that implementations might parse
+ and interpret those characters; a recipient of CR, LF, or NUL within
+ a field value MUST either reject the message or replace each of those
+ characters with SP before further processing or forwarding of that
+ message. Field values containing other CTL characters are also
+ invalid; however, recipients MAY retain such characters for the sake
+ of robustness when they appear within a safe context (e.g., an
+ application-specific quoted string that will not be processed by any
+ downstream HTTP parser).
+
+ Fields that only anticipate a single member as the field value are
+ referred to as "singleton fields".
+
+ Fields that allow multiple members as the field value are referred to
+ as "list-based fields". The list operator extension of Section 5.6.1
+ is used as a common notation for defining field values that can
+ contain multiple members.
+
+ Because commas (",") are used as the delimiter between members, they
+ need to be treated with care if they are allowed as data within a
+ member. This is true for both list-based and singleton fields, since
+ a singleton field might be erroneously sent with multiple members and
+ detecting such errors improves interoperability. Fields that expect
+ to contain a comma within a member, such as within an HTTP-date or
+ URI-reference element, ought to be defined with delimiters around
+ that element to distinguish any comma within that data from potential
+ list separators.
+
+ For example, a textual date and a URI (either of which might contain
+ a comma) could be safely carried in list-based field values like
+ these:
+
+ Example-URIs: "http://example.com/a.html,foo",
+ "http://without-a-comma.example.com/"
+ Example-Dates: "Sat, 04 May 1996", "Wed, 14 Sep 2005"
+
+ Note that double-quote delimiters are almost always used with the
+ quoted-string production (Section 5.6.4); using a different syntax
+ inside double-quotes will likely cause unnecessary confusion.
+
+ Many fields (such as Content-Type, defined in Section 8.3) use a
+ common syntax for parameters that allows both unquoted (token) and
+ quoted (quoted-string) syntax for a parameter value (Section 5.6.6).
+ Use of common syntax allows recipients to reuse existing parser
+ components. When allowing both forms, the meaning of a parameter
+ value ought to be the same whether it was received as a token or a
+ quoted string.
+
+ | *Note:* For defining field value syntax, this specification
+ | uses an ABNF rule named after the field name to define the
+ | allowed grammar for that field's value (after said value has
+ | been extracted from the underlying messaging syntax and
+ | multiple instances combined into a list).
+
+5.6. Common Rules for Defining Field Values
+
+5.6.1. Lists (#rule ABNF Extension)
+
+ A #rule extension to the ABNF rules of [RFC5234] is used to improve
+ readability in the definitions of some list-based field values.
+
+ A construct "#" is defined, similar to "*", for defining comma-
+ delimited lists of elements. The full form is "<n>#<m>element"
+ indicating at least <n> and at most <m> elements, each separated by a
+ single comma (",") and optional whitespace (OWS, defined in
+ Section 5.6.3).
+
+5.6.1.1. Sender Requirements
+
+ In any production that uses the list construct, a sender MUST NOT
+ generate empty list elements. In other words, a sender has to
+ generate lists that satisfy the following syntax:
+
+ 1#element => element *( OWS "," OWS element )
+
+ and:
+
+ #element => [ 1#element ]
+
+ and for n >= 1 and m > 1:
+
+ <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )
+
+ Appendix A shows the collected ABNF for senders after the list
+ constructs have been expanded.
+
+5.6.1.2. Recipient Requirements
+
+ Empty elements do not contribute to the count of elements present. A
+ recipient MUST parse and ignore a reasonable number of empty list
+ elements: enough to handle common mistakes by senders that merge
+ values, but not so much that they could be used as a denial-of-
+ service mechanism. In other words, a recipient MUST accept lists
+ that satisfy the following syntax:
+
+ #element => [ element ] *( OWS "," OWS [ element ] )
+
+ Note that because of the potential presence of empty list elements,
+ the RFC 5234 ABNF cannot enforce the cardinality of list elements,
+ and consequently all cases are mapped as if there was no cardinality
+ specified.
+
+ For example, given these ABNF productions:
+
+ example-list = 1#example-list-elmt
+ example-list-elmt = token ; see Section 5.6.2
+
+ Then the following are valid values for example-list (not including
+ the double quotes, which are present for delimitation only):
+
+ "foo,bar"
+ "foo ,bar,"
+ "foo , ,bar,charlie"
+
+ In contrast, the following values would be invalid, since at least
+ one non-empty element is required by the example-list production:
+
+ ""
+ ","
+ ", ,"
+
+5.6.2. Tokens
+
+ Tokens are short textual identifiers that do not include whitespace
+ or delimiters.
+
+ token = 1*tchar
+
+ tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+ / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+ / DIGIT / ALPHA
+ ; any VCHAR, except delimiters
+
+ Many HTTP field values are defined using common syntax components,
+ separated by whitespace or specific delimiting characters.
+ Delimiters are chosen from the set of US-ASCII visual characters not
+ allowed in a token (DQUOTE and "(),/:;<=>?@[\]{}").
+
+5.6.3. Whitespace
+
+ This specification uses three rules to denote the use of linear
+ whitespace: OWS (optional whitespace), RWS (required whitespace), and
+ BWS ("bad" whitespace).
+
+ The OWS rule is used where zero or more linear whitespace octets
+ might appear. For protocol elements where optional whitespace is
+ preferred to improve readability, a sender SHOULD generate the
+ optional whitespace as a single SP; otherwise, a sender SHOULD NOT
+ generate optional whitespace except as needed to overwrite invalid or
+ unwanted protocol elements during in-place message filtering.
+
+ The RWS rule is used when at least one linear whitespace octet is
+ required to separate field tokens. A sender SHOULD generate RWS as a
+ single SP.
+
+ OWS and RWS have the same semantics as a single SP. Any content
+ known to be defined as OWS or RWS MAY be replaced with a single SP
+ before interpreting it or forwarding the message downstream.
+
+ The BWS rule is used where the grammar allows optional whitespace
+ only for historical reasons. A sender MUST NOT generate BWS in
+ messages. A recipient MUST parse for such bad whitespace and remove
+ it before interpreting the protocol element.
+
+ BWS has no semantics. Any content known to be defined as BWS MAY be
+ removed before interpreting it or forwarding the message downstream.
+
+ OWS = *( SP / HTAB )
+ ; optional whitespace
+ RWS = 1*( SP / HTAB )
+ ; required whitespace
+ BWS = OWS
+ ; "bad" whitespace
+
+5.6.4. Quoted Strings
+
+ A string of text is parsed as a single value if it is quoted using
+ double-quote marks.
+
+ quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
+
+ The backslash octet ("\") can be used as a single-octet quoting
+ mechanism within quoted-string and comment constructs. Recipients
+ that process the value of a quoted-string MUST handle a quoted-pair
+ as if it were replaced by the octet following the backslash.
+
+ quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
+
+ A sender SHOULD NOT generate a quoted-pair in a quoted-string except
+ where necessary to quote DQUOTE and backslash octets occurring within
+ that string. A sender SHOULD NOT generate a quoted-pair in a comment
+ except where necessary to quote parentheses ["(" and ")"] and
+ backslash octets occurring within that comment.
+
+5.6.5. Comments
+
+ Comments can be included in some HTTP fields by surrounding the
+ comment text with parentheses. Comments are only allowed in fields
+ containing "comment" as part of their field value definition.
+
+ comment = "(" *( ctext / quoted-pair / comment ) ")"
+ ctext = HTAB / SP / %x21-27 / %x2A-5B / %x5D-7E / obs-text
+
+5.6.6. Parameters
+
+ Parameters are instances of name/value pairs; they are often used in
+ field values as a common syntax for appending auxiliary information
+ to an item. Each parameter is usually delimited by an immediately
+ preceding semicolon.
+
+ parameters = *( OWS ";" OWS [ parameter ] )
+ parameter = parameter-name "=" parameter-value
+ parameter-name = token
+ parameter-value = ( token / quoted-string )
+
+ Parameter names are case-insensitive. Parameter values might or
+ might not be case-sensitive, depending on the semantics of the
+ parameter name. Examples of parameters and some equivalent forms can
+ be seen in media types (Section 8.3.1) and the Accept header field
+ (Section 12.5.1).
+
+ A parameter value that matches the token production can be
+ transmitted either as a token or within a quoted-string. The quoted
+ and unquoted values are equivalent.
+
+ | *Note:* Parameters do not allow whitespace (not even "bad"
+ | whitespace) around the "=" character.
+
+5.6.7. Date/Time Formats
+
+ Prior to 1995, there were three different formats commonly used by
+ servers to communicate timestamps. For compatibility with old
+ implementations, all three are defined here. The preferred format is
+ a fixed-length and single-zone subset of the date and time
+ specification used by the Internet Message Format [RFC5322].
+
+ HTTP-date = IMF-fixdate / obs-date
+
+ An example of the preferred format is
+
+ Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate
+
+ Examples of the two obsolete formats are
+
+ Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format
+ Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+
+ A recipient that parses a timestamp value in an HTTP field MUST
+ accept all three HTTP-date formats. When a sender generates a field
+ that contains one or more timestamps defined as HTTP-date, the sender
+ MUST generate those timestamps in the IMF-fixdate format.
+
+ An HTTP-date value represents time as an instance of Coordinated
+ Universal Time (UTC). The first two formats indicate UTC by the
+ three-letter abbreviation for Greenwich Mean Time, "GMT", a
+ predecessor of the UTC name; values in the asctime format are assumed
+ to be in UTC.
+
+ A "clock" is an implementation capable of providing a reasonable
+ approximation of the current instant in UTC. A clock implementation
+ ought to use NTP ([RFC5905]), or some similar protocol, to
+ synchronize with UTC.
+
+ Preferred format:
+
+ IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT
+ ; fixed length/zone/capitalization subset of the format
+ ; see Section 3.3 of [RFC5322]
+
+ day-name = %s"Mon" / %s"Tue" / %s"Wed"
+ / %s"Thu" / %s"Fri" / %s"Sat" / %s"Sun"
+
+ date1 = day SP month SP year
+ ; e.g., 02 Jun 1982
+
+ day = 2DIGIT
+ month = %s"Jan" / %s"Feb" / %s"Mar" / %s"Apr"
+ / %s"May" / %s"Jun" / %s"Jul" / %s"Aug"
+ / %s"Sep" / %s"Oct" / %s"Nov" / %s"Dec"
+ year = 4DIGIT
+
+ GMT = %s"GMT"
+
+ time-of-day = hour ":" minute ":" second
+ ; 00:00:00 - 23:59:60 (leap second)
+
+ hour = 2DIGIT
+ minute = 2DIGIT
+ second = 2DIGIT
+
+ Obsolete formats:
+
+ obs-date = rfc850-date / asctime-date
+
+ rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT
+ date2 = day "-" month "-" 2DIGIT
+ ; e.g., 02-Jun-82
+
+ day-name-l = %s"Monday" / %s"Tuesday" / %s"Wednesday"
+ / %s"Thursday" / %s"Friday" / %s"Saturday"
+ / %s"Sunday"
+
+ asctime-date = day-name SP date3 SP time-of-day SP year
+ date3 = month SP ( 2DIGIT / ( SP 1DIGIT ))
+ ; e.g., Jun 2
+
+ HTTP-date is case sensitive. Note that Section 4.2 of [CACHING]
+ relaxes this for cache recipients.
+
+ A sender MUST NOT generate additional whitespace in an HTTP-date
+ beyond that specifically included as SP in the grammar. The
+ semantics of day-name, day, month, year, and time-of-day are the same
+ as those defined for the Internet Message Format constructs with the
+ corresponding name ([RFC5322], Section 3.3).
+
+ Recipients of a timestamp value in rfc850-date format, which uses a
+ two-digit year, MUST interpret a timestamp that appears to be more
+ than 50 years in the future as representing the most recent year in
+ the past that had the same last two digits.
+
+ Recipients of timestamp values are encouraged to be robust in parsing
+ timestamps unless otherwise restricted by the field definition. For
+ example, messages are occasionally forwarded over HTTP from a non-
+ HTTP source that might generate any of the date and time
+ specifications defined by the Internet Message Format.
+
+ | *Note:* HTTP requirements for timestamp formats apply only to
+ | their usage within the protocol stream. Implementations are
+ | not required to use these formats for user presentation,
+ | request logging, etc.
+
+6. Message Abstraction
+
+ Each major version of HTTP defines its own syntax for communicating
+ messages. This section defines an abstract data type for HTTP
+ messages based on a generalization of those message characteristics,
+ common structure, and capacity for conveying semantics. This
+ abstraction is used to define requirements on senders and recipients
+ that are independent of the HTTP version, such that a message in one
+ version can be relayed through other versions without changing its
+ meaning.
+
+ A "message" consists of the following:
+
+ * control data to describe and route the message,
+
+ * a headers lookup table of name/value pairs for extending that
+ control data and conveying additional information about the
+ sender, message, content, or context,
+
+ * a potentially unbounded stream of content, and
+
+ * a trailers lookup table of name/value pairs for communicating
+ information obtained while sending the content.
+
+ Framing and control data is sent first, followed by a header section
+ containing fields for the headers table. When a message includes
+ content, the content is sent after the header section, potentially
+ followed by a trailer section that might contain fields for the
+ trailers table.
+
+ Messages are expected to be processed as a stream, wherein the
+ purpose of that stream and its continued processing is revealed while
+ being read. Hence, control data describes what the recipient needs
+ to know immediately, header fields describe what needs to be known
+ before receiving content, the content (when present) presumably
+ contains what the recipient wants or needs to fulfill the message
+ semantics, and trailer fields provide optional metadata that was
+ unknown prior to sending the content.
+
+ Messages are intended to be "self-descriptive": everything a
+ recipient needs to know about the message can be determined by
+ looking at the message itself, after decoding or reconstituting parts
+ that have been compressed or elided in transit, without requiring an
+ understanding of the sender's current application state (established
+ via prior messages). However, a client MUST retain knowledge of the
+ request when parsing, interpreting, or caching a corresponding
+ response. For example, responses to the HEAD method look just like
+ the beginning of a response to GET but cannot be parsed in the same
+ manner.
+
+ Note that this message abstraction is a generalization across many
+ versions of HTTP, including features that might not be found in some
+ versions. For example, trailers were introduced within the HTTP/1.1
+ chunked transfer coding as a trailer section after the content. An
+ equivalent feature is present in HTTP/2 and HTTP/3 within the header
+ block that terminates each stream.
+
+6.1. Framing and Completeness
+
+ Message framing indicates how each message begins and ends, such that
+ each message can be distinguished from other messages or noise on the
+ same connection. Each major version of HTTP defines its own framing
+ mechanism.
+
+ HTTP/0.9 and early deployments of HTTP/1.0 used closure of the
+ underlying connection to end a response. For backwards
+ compatibility, this implicit framing is also allowed in HTTP/1.1.
+ However, implicit framing can fail to distinguish an incomplete
+ response if the connection closes early. For that reason, almost all
+ modern implementations use explicit framing in the form of length-
+ delimited sequences of message data.
+
+ A message is considered "complete" when all of the octets indicated
+ by its framing are available. Note that, when no explicit framing is
+ used, a response message that is ended by the underlying connection's
+ close is considered complete even though it might be
+ indistinguishable from an incomplete response, unless a transport-
+ level error indicates that it is not complete.
+
+6.2. Control Data
+
+ Messages start with control data that describe its primary purpose.
+ Request message control data includes a request method (Section 9),
+ request target (Section 7.1), and protocol version (Section 2.5).
+ Response message control data includes a status code (Section 15),
+ optional reason phrase, and protocol version.
+
+ In HTTP/1.1 ([HTTP/1.1]) and earlier, control data is sent as the
+ first line of a message. In HTTP/2 ([HTTP/2]) and HTTP/3 ([HTTP/3]),
+ control data is sent as pseudo-header fields with a reserved name
+ prefix (e.g., ":authority").
+
+ Every HTTP message has a protocol version. Depending on the version
+ in use, it might be identified within the message explicitly or
+ inferred by the connection over which the message is received.
+ Recipients use that version information to determine limitations or
+ potential for later communication with that sender.
+
+ When a message is forwarded by an intermediary, the protocol version
+ is updated to reflect the version used by that intermediary. The Via
+ header field (Section 7.6.3) is used to communicate upstream protocol
+ information within a forwarded message.
+
+ A client SHOULD send a request version equal to the highest version
+ to which the client is conformant and whose major version is no
+ higher than the highest version supported by the server, if this is
+ known. A client MUST NOT send a version to which it is not
+ conformant.
+
+ A client MAY send a lower request version if it is known that the
+ server incorrectly implements the HTTP specification, but only after
+ the client has attempted at least one normal request and determined
+ from the response status code or header fields (e.g., Server) that
+ the server improperly handles higher request versions.
+
+ A server SHOULD send a response version equal to the highest version
+ to which the server is conformant that has a major version less than
+ or equal to the one received in the request. A server MUST NOT send
+ a version to which it is not conformant. A server can send a 505
+ (HTTP Version Not Supported) response if it wishes, for any reason,
+ to refuse service of the client's major protocol version.
+
+ A recipient that receives a message with a major version number that
+ it implements and a minor version number higher than what it
+ implements SHOULD process the message as if it were in the highest
+ minor version within that major version to which the recipient is
+ conformant. A recipient can assume that a message with a higher
+ minor version, when sent to a recipient that has not yet indicated
+ support for that higher version, is sufficiently backwards-compatible
+ to be safely processed by any implementation of the same major
+ version.
+
+6.3. Header Fields
+
+ Fields (Section 5) that are sent or received before the content are
+ referred to as "header fields" (or just "headers", colloquially).
+
+ The "header section" of a message consists of a sequence of header
+ field lines. Each header field might modify or extend message
+ semantics, describe the sender, define the content, or provide
+ additional context.
+
+ | *Note:* We refer to named fields specifically as a "header
+ | field" when they are only allowed to be sent in the header
+ | section.
+
+6.4. Content
+
+ HTTP messages often transfer a complete or partial representation as
+ the message "content": a stream of octets sent after the header
+ section, as delineated by the message framing.
+
+ This abstract definition of content reflects the data after it has
+ been extracted from the message framing. For example, an HTTP/1.1
+ message body (Section 6 of [HTTP/1.1]) might consist of a stream of
+ data encoded with the chunked transfer coding -- a sequence of data
+ chunks, one zero-length chunk, and a trailer section -- whereas the
+ content of that same message includes only the data stream after the
+ transfer coding has been decoded; it does not include the chunk
+ lengths, chunked framing syntax, nor the trailer fields
+ (Section 6.5).
+
+ | *Note:* Some field names have a "Content-" prefix. This is an
+ | informal convention; while some of these fields refer to the
+ | content of the message, as defined above, others are scoped to
+ | the selected representation (Section 3.2). See the individual
+ | field's definition to disambiguate.
+
+6.4.1. Content Semantics
+
+ The purpose of content in a request is defined by the method
+ semantics (Section 9).
+
+ For example, a representation in the content of a PUT request
+ (Section 9.3.4) represents the desired state of the target resource
+ after the request is successfully applied, whereas a representation
+ in the content of a POST request (Section 9.3.3) represents
+ information to be processed by the target resource.
+
+ In a response, the content's purpose is defined by the request
+ method, response status code (Section 15), and response fields
+ describing that content. For example, the content of a 200 (OK)
+ response to GET (Section 9.3.1) represents the current state of the
+ target resource, as observed at the time of the message origination
+ date (Section 6.6.1), whereas the content of the same status code in
+ a response to POST might represent either the processing result or
+ the new state of the target resource after applying the processing.
+
+ The content of a 206 (Partial Content) response to GET contains
+ either a single part of the selected representation or a multipart
+ message body containing multiple parts of that representation, as
+ described in Section 15.3.7.
+
+ Response messages with an error status code usually contain content
+ that represents the error condition, such that the content describes
+ the error state and what steps are suggested for resolving it.
+
+ Responses to the HEAD request method (Section 9.3.2) never include
+ content; the associated response header fields indicate only what
+ their values would have been if the request method had been GET
+ (Section 9.3.1).
+
+ 2xx (Successful) responses to a CONNECT request method
+ (Section 9.3.6) switch the connection to tunnel mode instead of
+ having content.
+
+ All 1xx (Informational), 204 (No Content), and 304 (Not Modified)
+ responses do not include content.
+
+ All other responses do include content, although that content might
+ be of zero length.
+
+6.4.2. Identifying Content
+
+ When a complete or partial representation is transferred as message
+ content, it is often desirable for the sender to supply, or the
+ recipient to determine, an identifier for a resource corresponding to
+ that specific representation. For example, a client making a GET
+ request on a resource for "the current weather report" might want an
+ identifier specific to the content returned (e.g., "weather report
+ for Laguna Beach at 20210720T1711"). This can be useful for sharing
+ or bookmarking content from resources that are expected to have
+ changing representations over time.
+
+ For a request message:
+
+ * If the request has a Content-Location header field, then the
+ sender asserts that the content is a representation of the
+ resource identified by the Content-Location field value. However,
+ such an assertion cannot be trusted unless it can be verified by
+ other means (not defined by this specification). The information
+ might still be useful for revision history links.
+
+ * Otherwise, the content is unidentified by HTTP, but a more
+ specific identifier might be supplied within the content itself.
+
+ For a response message, the following rules are applied in order
+ until a match is found:
+
+ 1. If the request method is HEAD or the response status code is 204
+ (No Content) or 304 (Not Modified), there is no content in the
+ response.
+
+ 2. If the request method is GET and the response status code is 200
+ (OK), the content is a representation of the target resource
+ (Section 7.1).
+
+ 3. If the request method is GET and the response status code is 203
+ (Non-Authoritative Information), the content is a potentially
+ modified or enhanced representation of the target resource as
+ provided by an intermediary.
+
+ 4. If the request method is GET and the response status code is 206
+ (Partial Content), the content is one or more parts of a
+ representation of the target resource.
+
+ 5. If the response has a Content-Location header field and its field
+ value is a reference to the same URI as the target URI, the
+ content is a representation of the target resource.
+
+ 6. If the response has a Content-Location header field and its field
+ value is a reference to a URI different from the target URI, then
+ the sender asserts that the content is a representation of the
+ resource identified by the Content-Location field value.
+ However, such an assertion cannot be trusted unless it can be
+ verified by other means (not defined by this specification).
+
+ 7. Otherwise, the content is unidentified by HTTP, but a more
+ specific identifier might be supplied within the content itself.
+
+6.5. Trailer Fields
+
+ Fields (Section 5) that are located within a "trailer section" are
+ referred to as "trailer fields" (or just "trailers", colloquially).
+ Trailer fields can be useful for supplying message integrity checks,
+ digital signatures, delivery metrics, or post-processing status
+ information.
+
+ Trailer fields ought to be processed and stored separately from the
+ fields in the header section to avoid contradicting message semantics
+ known at the time the header section was complete. The presence or
+ absence of certain header fields might impact choices made for the
+ routing or processing of the message as a whole before the trailers
+ are received; those choices cannot be unmade by the later discovery
+ of trailer fields.
+
+6.5.1. Limitations on Use of Trailers
+
+ A trailer section is only possible when supported by the version of
+ HTTP in use and enabled by an explicit framing mechanism. For
+ example, the chunked transfer coding in HTTP/1.1 allows a trailer
+ section to be sent after the content (Section 7.1.2 of [HTTP/1.1]).
+
+ Many fields cannot be processed outside the header section because
+ their evaluation is necessary prior to receiving the content, such as
+ those that describe message framing, routing, authentication, request
+ modifiers, response controls, or content format. A sender MUST NOT
+ generate a trailer field unless the sender knows the corresponding
+ header field name's definition permits the field to be sent in
+ trailers.
+
+ Trailer fields can be difficult to process by intermediaries that
+ forward messages from one protocol version to another. If the entire
+ message can be buffered in transit, some intermediaries could merge
+ trailer fields into the header section (as appropriate) before it is
+ forwarded. However, in most cases, the trailers are simply
+ discarded. A recipient MUST NOT merge a trailer field into a header
+ section unless the recipient understands the corresponding header
+ field definition and that definition explicitly permits and defines
+ how trailer field values can be safely merged.
+
+ The presence of the keyword "trailers" in the TE header field
+ (Section 10.1.4) of a request indicates that the client is willing to
+ accept trailer fields, on behalf of itself and any downstream
+ clients. For requests from an intermediary, this implies that all
+ downstream clients are willing to accept trailer fields in the
+ forwarded response. Note that the presence of "trailers" does not
+ mean that the client(s) will process any particular trailer field in
+ the response; only that the trailer section(s) will not be dropped by
+ any of the clients.
+
+ Because of the potential for trailer fields to be discarded in
+ transit, a server SHOULD NOT generate trailer fields that it believes
+ are necessary for the user agent to receive.
+
+6.5.2. Processing Trailer Fields
+
+ The "Trailer" header field (Section 6.6.2) can be sent to indicate
+ fields likely to be sent in the trailer section, which allows
+ recipients to prepare for their receipt before processing the
+ content. For example, this could be useful if a field name indicates
+ that a dynamic checksum should be calculated as the content is
+ received and then immediately checked upon receipt of the trailer
+ field value.
+
+ Like header fields, trailer fields with the same name are processed
+ in the order received; multiple trailer field lines with the same
+ name have the equivalent semantics as appending the multiple values
+ as a list of members. Trailer fields that might be generated more
+ than once during a message MUST be defined as a list-based field even
+ if each member value is only processed once per field line received.
+
+ At the end of a message, a recipient MAY treat the set of received
+ trailer fields as a data structure of name/value pairs, similar to
+ (but separate from) the header fields. Additional processing
+ expectations, if any, can be defined within the field specification
+ for a field intended for use in trailers.
+
+6.6. Message Metadata
+
+ Fields that describe the message itself, such as when and how the
+ message has been generated, can appear in both requests and
+ responses.
+
+6.6.1. Date
+
+ The "Date" header field represents the date and time at which the
+ message was originated, having the same semantics as the Origination
+ Date Field (orig-date) defined in Section 3.6.1 of [RFC5322]. The
+ field value is an HTTP-date, as defined in Section 5.6.7.
+
+ Date = HTTP-date
+
+ An example is
+
+ Date: Tue, 15 Nov 1994 08:12:31 GMT
+
+ A sender that generates a Date header field SHOULD generate its field
+ value as the best available approximation of the date and time of
+ message generation. In theory, the date ought to represent the
+ moment just before generating the message content. In practice, a
+ sender can generate the date value at any time during message
+ origination.
+
+ An origin server with a clock (as defined in Section 5.6.7) MUST
+ generate a Date header field in all 2xx (Successful), 3xx
+ (Redirection), and 4xx (Client Error) responses, and MAY generate a
+ Date header field in 1xx (Informational) and 5xx (Server Error)
+ responses.
+
+ An origin server without a clock MUST NOT generate a Date header
+ field.
+
+ A recipient with a clock that receives a response message without a
+ Date header field MUST record the time it was received and append a
+ corresponding Date header field to the message's header section if it
+ is cached or forwarded downstream.
+
+ A recipient with a clock that receives a response with an invalid
+ Date header field value MAY replace that value with the time that
+ response was received.
+
+ A user agent MAY send a Date header field in a request, though
+ generally will not do so unless it is believed to convey useful
+ information to the server. For example, custom applications of HTTP
+ might convey a Date if the server is expected to adjust its
+ interpretation of the user's request based on differences between the
+ user agent and server clocks.
+
+6.6.2. Trailer
+
+ The "Trailer" header field provides a list of field names that the
+ sender anticipates sending as trailer fields within that message.
+ This allows a recipient to prepare for receipt of the indicated
+ metadata before it starts processing the content.
+
+ Trailer = #field-name
+
+ For example, a sender might indicate that a signature will be
+ computed as the content is being streamed and provide the final
+ signature as a trailer field. This allows a recipient to perform the
+ same check on the fly as it receives the content.
+
+ A sender that intends to generate one or more trailer fields in a
+ message SHOULD generate a Trailer header field in the header section
+ of that message to indicate which fields might be present in the
+ trailers.
+
+ If an intermediary discards the trailer section in transit, the
+ Trailer field could provide a hint of what metadata was lost, though
+ there is no guarantee that a sender of Trailer will always follow
+ through by sending the named fields.
+
+7. Routing HTTP Messages
+
+ HTTP request message routing is determined by each client based on
+ the target resource, the client's proxy configuration, and
+ establishment or reuse of an inbound connection. The corresponding
+ response routing follows the same connection chain back to the
+ client.
+
+7.1. Determining the Target Resource
+
+ Although HTTP is used in a wide variety of applications, most clients
+ rely on the same resource identification mechanism and configuration
+ techniques as general-purpose Web browsers. Even when communication
+ options are hard-coded in a client's configuration, we can think of
+ their combined effect as a URI reference (Section 4.1).
+
+ A URI reference is resolved to its absolute form in order to obtain
+ the "target URI". The target URI excludes the reference's fragment
+ component, if any, since fragment identifiers are reserved for
+ client-side processing ([URI], Section 3.5).
+
+ To perform an action on a "target resource", the client sends a
+ request message containing enough components of its parsed target URI
+ to enable recipients to identify that same resource. For historical
+ reasons, the parsed target URI components, collectively referred to
+ as the "request target", are sent within the message control data and
+ the Host header field (Section 7.2).
+
+ There are two unusual cases for which the request target components
+ are in a method-specific form:
+
+ * For CONNECT (Section 9.3.6), the request target is the host name
+ and port number of the tunnel destination, separated by a colon.
+
+ * For OPTIONS (Section 9.3.7), the request target can be a single
+ asterisk ("*").
+
+ See the respective method definitions for details. These forms MUST
+ NOT be used with other methods.
+
+ Upon receipt of a client's request, a server reconstructs the target
+ URI from the received components in accordance with their local
+ configuration and incoming connection context. This reconstruction
+ is specific to each major protocol version. For example, Section 3.3
+ of [HTTP/1.1] defines how a server determines the target URI of an
+ HTTP/1.1 request.
+
+ | *Note:* Previous specifications defined the recomposed target
+ | URI as a distinct concept, the "effective request URI".
+
+7.2. Host and :authority
+
+ The "Host" header field in a request provides the host and port
+ information from the target URI, enabling the origin server to
+ distinguish among resources while servicing requests for multiple
+ host names.
+
+ In HTTP/2 [HTTP/2] and HTTP/3 [HTTP/3], the Host header field is, in
+ some cases, supplanted by the ":authority" pseudo-header field of a
+ request's control data.
+
+ Host = uri-host [ ":" port ] ; Section 4
+
+ The target URI's authority information is critical for handling a
+ request. A user agent MUST generate a Host header field in a request
+ unless it sends that information as an ":authority" pseudo-header
+ field. A user agent that sends Host SHOULD send it as the first
+ field in the header section of a request.
+
+ For example, a GET request to the origin server for
+ <http://www.example.org/pub/WWW/> would begin with:
+
+ GET /pub/WWW/ HTTP/1.1
+ Host: www.example.org
+
+ Since the host and port information acts as an application-level
+ routing mechanism, it is a frequent target for malware seeking to
+ poison a shared cache or redirect a request to an unintended server.
+ An interception proxy is particularly vulnerable if it relies on the
+ host and port information for redirecting requests to internal
+ servers, or for use as a cache key in a shared cache, without first
+ verifying that the intercepted connection is targeting a valid IP
+ address for that host.
+
+7.3. Routing Inbound Requests
+
+ Once the target URI and its origin are determined, a client decides
+ whether a network request is necessary to accomplish the desired
+ semantics and, if so, where that request is to be directed.
+
+7.3.1. To a Cache
+
+ If the client has a cache [CACHING] and the request can be satisfied
+ by it, then the request is usually directed there first.
+
+7.3.2. To a Proxy
+
+ If the request is not satisfied by a cache, then a typical client
+ will check its configuration to determine whether a proxy is to be
+ used to satisfy the request. Proxy configuration is implementation-
+ dependent, but is often based on URI prefix matching, selective
+ authority matching, or both, and the proxy itself is usually
+ identified by an "http" or "https" URI.
+
+ If an "http" or "https" proxy is applicable, the client connects
+ inbound by establishing (or reusing) a connection to that proxy and
+ then sending it an HTTP request message containing a request target
+ that matches the client's target URI.
+
+7.3.3. To the Origin
+
+ If no proxy is applicable, a typical client will invoke a handler
+ routine (specific to the target URI's scheme) to obtain access to the
+ identified resource. How that is accomplished is dependent on the
+ target URI scheme and defined by its associated specification.
+
+ Section 4.3.2 defines how to obtain access to an "http" resource by
+ establishing (or reusing) an inbound connection to the identified
+ origin server and then sending it an HTTP request message containing
+ a request target that matches the client's target URI.
+
+ Section 4.3.3 defines how to obtain access to an "https" resource by
+ establishing (or reusing) an inbound secured connection to an origin
+ server that is authoritative for the identified origin and then
+ sending it an HTTP request message containing a request target that
+ matches the client's target URI.
+
+7.4. Rejecting Misdirected Requests
+
+ Once a request is received by a server and parsed sufficiently to
+ determine its target URI, the server decides whether to process the
+ request itself, forward the request to another server, redirect the
+ client to a different resource, respond with an error, or drop the
+ connection. This decision can be influenced by anything about the
+ request or connection context, but is specifically directed at
+ whether the server has been configured to process requests for that
+ target URI and whether the connection context is appropriate for that
+ request.
+
+ For example, a request might have been misdirected, deliberately or
+ accidentally, such that the information within a received Host header
+ field differs from the connection's host or port. If the connection
+ is from a trusted gateway, such inconsistency might be expected;
+ otherwise, it might indicate an attempt to bypass security filters,
+ trick the server into delivering non-public content, or poison a
+ cache. See Section 17 for security considerations regarding message
+ routing.
+
+ Unless the connection is from a trusted gateway, an origin server
+ MUST reject a request if any scheme-specific requirements for the
+ target URI are not met. In particular, a request for an "https"
+ resource MUST be rejected unless it has been received over a
+ connection that has been secured via a certificate valid for that
+ target URI's origin, as defined by Section 4.2.2.
+
+ The 421 (Misdirected Request) status code in a response indicates
+ that the origin server has rejected the request because it appears to
+ have been misdirected (Section 15.5.20).
+
+7.5. Response Correlation
+
+ A connection might be used for multiple request/response exchanges.
+ The mechanism used to correlate between request and response messages
+ is version dependent; some versions of HTTP use implicit ordering of
+ messages, while others use an explicit identifier.
+
+ All responses, regardless of the status code (including interim
+ responses) can be sent at any time after a request is received, even
+ if the request is not yet complete. A response can complete before
+ its corresponding request is complete (Section 6.1). Likewise,
+ clients are not expected to wait any specific amount of time for a
+ response. Clients (including intermediaries) might abandon a request
+ if the response is not received within a reasonable period of time.
+
+ A client that receives a response while it is still sending the
+ associated request SHOULD continue sending that request unless it
+ receives an explicit indication to the contrary (see, e.g.,
+ Section 9.5 of [HTTP/1.1] and Section 6.4 of [HTTP/2]).
+
+7.6. Message Forwarding
+
+ As described in Section 3.7, intermediaries can serve a variety of
+ roles in the processing of HTTP requests and responses. Some
+ intermediaries are used to improve performance or availability.
+ Others are used for access control or to filter content. Since an
+ HTTP stream has characteristics similar to a pipe-and-filter
+ architecture, there are no inherent limits to the extent an
+ intermediary can enhance (or interfere) with either direction of the
+ stream.
+
+ Intermediaries are expected to forward messages even when protocol
+ elements are not recognized (e.g., new methods, status codes, or
+ field names) since that preserves extensibility for downstream
+ recipients.
+
+ An intermediary not acting as a tunnel MUST implement the Connection
+ header field, as specified in Section 7.6.1, and exclude fields from
+ being forwarded that are only intended for the incoming connection.
+
+ An intermediary MUST NOT forward a message to itself unless it is
+ protected from an infinite request loop. In general, an intermediary
+ ought to recognize its own server names, including any aliases, local
+ variations, or literal IP addresses, and respond to such requests
+ directly.
+
+ An HTTP message can be parsed as a stream for incremental processing
+ or forwarding downstream. However, senders and recipients cannot
+ rely on incremental delivery of partial messages, since some
+ implementations will buffer or delay message forwarding for the sake
+ of network efficiency, security checks, or content transformations.
+
+7.6.1. Connection
+
+ The "Connection" header field allows the sender to list desired
+ control options for the current connection.
+
+ Connection = #connection-option
+ connection-option = token
+
+ Connection options are case-insensitive.
+
+ When a field aside from Connection is used to supply control
+ information for or about the current connection, the sender MUST list
+ the corresponding field name within the Connection header field.
+ Note that some versions of HTTP prohibit the use of fields for such
+ information, and therefore do not allow the Connection field.
+
+ Intermediaries MUST parse a received Connection header field before a
+ message is forwarded and, for each connection-option in this field,
+ remove any header or trailer field(s) from the message with the same
+ name as the connection-option, and then remove the Connection header
+ field itself (or replace it with the intermediary's own control
+ options for the forwarded message).
+
+ Hence, the Connection header field provides a declarative way of
+ distinguishing fields that are only intended for the immediate
+ recipient ("hop-by-hop") from those fields that are intended for all
+ recipients on the chain ("end-to-end"), enabling the message to be
+ self-descriptive and allowing future connection-specific extensions
+ to be deployed without fear that they will be blindly forwarded by
+ older intermediaries.
+
+ Furthermore, intermediaries SHOULD remove or replace fields that are
+ known to require removal before forwarding, whether or not they
+ appear as a connection-option, after applying those fields'
+ semantics. This includes but is not limited to:
+
+ * Proxy-Connection (Appendix C.2.2 of [HTTP/1.1])
+
+ * Keep-Alive (Section 19.7.1 of [RFC2068])
+
+ * TE (Section 10.1.4)
+
+ * Transfer-Encoding (Section 6.1 of [HTTP/1.1])
+
+ * Upgrade (Section 7.8)
+
+ A sender MUST NOT send a connection option corresponding to a field
+ that is intended for all recipients of the content. For example,
+ Cache-Control is never appropriate as a connection option
+ (Section 5.2 of [CACHING]).
+
+ Connection options do not always correspond to a field present in the
+ message, since a connection-specific field might not be needed if
+ there are no parameters associated with a connection option. In
+ contrast, a connection-specific field received without a
+ corresponding connection option usually indicates that the field has
+ been improperly forwarded by an intermediary and ought to be ignored
+ by the recipient.
+
+ When defining a new connection option that does not correspond to a
+ field, specification authors ought to reserve the corresponding field
+ name anyway in order to avoid later collisions. Such reserved field
+ names are registered in the "Hypertext Transfer Protocol (HTTP) Field
+ Name Registry" (Section 16.3.1).
+
+7.6.2. Max-Forwards
+
+ The "Max-Forwards" header field provides a mechanism with the TRACE
+ (Section 9.3.8) and OPTIONS (Section 9.3.7) request methods to limit
+ the number of times that the request is forwarded by proxies. This
+ can be useful when the client is attempting to trace a request that
+ appears to be failing or looping mid-chain.
+
+ Max-Forwards = 1*DIGIT
+
+ The Max-Forwards value is a decimal integer indicating the remaining
+ number of times this request message can be forwarded.
+
+ Each intermediary that receives a TRACE or OPTIONS request containing
+ a Max-Forwards header field MUST check and update its value prior to
+ forwarding the request. If the received value is zero (0), the
+ intermediary MUST NOT forward the request; instead, the intermediary
+ MUST respond as the final recipient. If the received Max-Forwards
+ value is greater than zero, the intermediary MUST generate an updated
+ Max-Forwards field in the forwarded message with a field value that
+ is the lesser of a) the received value decremented by one (1) or b)
+ the recipient's maximum supported value for Max-Forwards.
+
+ A recipient MAY ignore a Max-Forwards header field received with any
+ other request methods.
+
+7.6.3. Via
+
+ The "Via" header field indicates the presence of intermediate
+ protocols and recipients between the user agent and the server (on
+ requests) or between the origin server and the client (on responses),
+ similar to the "Received" header field in email (Section 3.6.7 of
+ [RFC5322]). Via can be used for tracking message forwards, avoiding
+ request loops, and identifying the protocol capabilities of senders
+ along the request/response chain.
+
+ Via = #( received-protocol RWS received-by [ RWS comment ] )
+
+ received-protocol = [ protocol-name "/" ] protocol-version
+ ; see Section 7.8
+ received-by = pseudonym [ ":" port ]
+ pseudonym = token
+
+ Each member of the Via field value represents a proxy or gateway that
+ has forwarded the message. Each intermediary appends its own
+ information about how the message was received, such that the end
+ result is ordered according to the sequence of forwarding recipients.
+
+ A proxy MUST send an appropriate Via header field, as described
+ below, in each message that it forwards. An HTTP-to-HTTP gateway
+ MUST send an appropriate Via header field in each inbound request
+ message and MAY send a Via header field in forwarded response
+ messages.
+
+ For each intermediary, the received-protocol indicates the protocol
+ and protocol version used by the upstream sender of the message.
+ Hence, the Via field value records the advertised protocol
+ capabilities of the request/response chain such that they remain
+ visible to downstream recipients; this can be useful for determining
+ what backwards-incompatible features might be safe to use in
+ response, or within a later request, as described in Section 2.5.
+ For brevity, the protocol-name is omitted when the received protocol
+ is HTTP.
+
+ The received-by portion is normally the host and optional port number
+ of a recipient server or client that subsequently forwarded the
+ message. However, if the real host is considered to be sensitive
+ information, a sender MAY replace it with a pseudonym. If a port is
+ not provided, a recipient MAY interpret that as meaning it was
+ received on the default port, if any, for the received-protocol.
+
+ A sender MAY generate comments to identify the software of each
+ recipient, analogous to the User-Agent and Server header fields.
+ However, comments in Via are optional, and a recipient MAY remove
+ them prior to forwarding the message.
+
+ For example, a request message could be sent from an HTTP/1.0 user
+ agent to an internal proxy code-named "fred", which uses HTTP/1.1 to
+ forward the request to a public proxy at p.example.net, which
+ completes the request by forwarding it to the origin server at
+ www.example.com. The request received by www.example.com would then
+ have the following Via header field:
+
+ Via: 1.0 fred, 1.1 p.example.net
+
+ An intermediary used as a portal through a network firewall SHOULD
+ NOT forward the names and ports of hosts within the firewall region
+ unless it is explicitly enabled to do so. If not enabled, such an
+ intermediary SHOULD replace each received-by host of any host behind
+ the firewall by an appropriate pseudonym for that host.
+
+ An intermediary MAY combine an ordered subsequence of Via header
+ field list members into a single member if the entries have identical
+ received-protocol values. For example,
+
+ Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
+
+ could be collapsed to
+
+ Via: 1.0 ricky, 1.1 mertz, 1.0 lucy
+
+ A sender SHOULD NOT combine multiple list members unless they are all
+ under the same organizational control and the hosts have already been
+ replaced by pseudonyms. A sender MUST NOT combine members that have
+ different received-protocol values.
+
+7.7. Message Transformations
+
+ Some intermediaries include features for transforming messages and
+ their content. A proxy might, for example, convert between image
+ formats in order to save cache space or to reduce the amount of
+ traffic on a slow link. However, operational problems might occur
+ when these transformations are applied to content intended for
+ critical applications, such as medical imaging or scientific data
+ analysis, particularly when integrity checks or digital signatures
+ are used to ensure that the content received is identical to the
+ original.
+
+ An HTTP-to-HTTP proxy is called a "transforming proxy" if it is
+ designed or configured to modify messages in a semantically
+ meaningful way (i.e., modifications, beyond those required by normal
+ HTTP processing, that change the message in a way that would be
+ significant to the original sender or potentially significant to
+ downstream recipients). For example, a transforming proxy might be
+ acting as a shared annotation server (modifying responses to include
+ references to a local annotation database), a malware filter, a
+ format transcoder, or a privacy filter. Such transformations are
+ presumed to be desired by whichever client (or client organization)
+ chose the proxy.
+
+ If a proxy receives a target URI with a host name that is not a fully
+ qualified domain name, it MAY add its own domain to the host name it
+ received when forwarding the request. A proxy MUST NOT change the
+ host name if the target URI contains a fully qualified domain name.
+
+ A proxy MUST NOT modify the "absolute-path" and "query" parts of the
+ received target URI when forwarding it to the next inbound server
+ except as required by that forwarding protocol. For example, a proxy
+ forwarding a request to an origin server via HTTP/1.1 will replace an
+ empty path with "/" (Section 3.2.1 of [HTTP/1.1]) or "*"
+ (Section 3.2.4 of [HTTP/1.1]), depending on the request method.
+
+ A proxy MUST NOT transform the content (Section 6.4) of a response
+ message that contains a no-transform cache directive (Section 5.2.2.6
+ of [CACHING]). Note that this does not apply to message
+ transformations that do not change the content, such as the addition
+ or removal of transfer codings (Section 7 of [HTTP/1.1]).
+
+ A proxy MAY transform the content of a message that does not contain
+ a no-transform cache directive. A proxy that transforms the content
+ of a 200 (OK) response can inform downstream recipients that a
+ transformation has been applied by changing the response status code
+ to 203 (Non-Authoritative Information) (Section 15.3.4).
+
+ A proxy SHOULD NOT modify header fields that provide information
+ about the endpoints of the communication chain, the resource state,
+ or the selected representation (other than the content) unless the
+ field's definition specifically allows such modification or the
+ modification is deemed necessary for privacy or security.
+
+7.8. Upgrade
+
+ The "Upgrade" header field is intended to provide a simple mechanism
+ for transitioning from HTTP/1.1 to some other protocol on the same
+ connection.
+
+ A client MAY send a list of protocol names in the Upgrade header
+ field of a request to invite the server to switch to one or more of
+ the named protocols, in order of descending preference, before
+ sending the final response. A server MAY ignore a received Upgrade
+ header field if it wishes to continue using the current protocol on
+ that connection. Upgrade cannot be used to insist on a protocol
+ change.
+
+ Upgrade = #protocol
+
+ protocol = protocol-name ["/" protocol-version]
+ protocol-name = token
+ protocol-version = token
+
+ Although protocol names are registered with a preferred case,
+ recipients SHOULD use case-insensitive comparison when matching each
+ protocol-name to supported protocols.
+
+ A server that sends a 101 (Switching Protocols) response MUST send an
+ Upgrade header field to indicate the new protocol(s) to which the
+ connection is being switched; if multiple protocol layers are being
+ switched, the sender MUST list the protocols in layer-ascending
+ order. A server MUST NOT switch to a protocol that was not indicated
+ by the client in the corresponding request's Upgrade header field. A
+ server MAY choose to ignore the order of preference indicated by the
+ client and select the new protocol(s) based on other factors, such as
+ the nature of the request or the current load on the server.
+
+ A server that sends a 426 (Upgrade Required) response MUST send an
+ Upgrade header field to indicate the acceptable protocols, in order
+ of descending preference.
+
+ A server MAY send an Upgrade header field in any other response to
+ advertise that it implements support for upgrading to the listed
+ protocols, in order of descending preference, when appropriate for a
+ future request.
+
+ The following is a hypothetical example sent by a client:
+
+ GET /hello HTTP/1.1
+ Host: www.example.com
+ Connection: upgrade
+ Upgrade: websocket, IRC/6.9, RTA/x11
+
+ The capabilities and nature of the application-level communication
+ after the protocol change is entirely dependent upon the new
+ protocol(s) chosen. However, immediately after sending the 101
+ (Switching Protocols) response, the server is expected to continue
+ responding to the original request as if it had received its
+ equivalent within the new protocol (i.e., the server still has an
+ outstanding request to satisfy after the protocol has been changed,
+ and is expected to do so without requiring the request to be
+ repeated).
+
+ For example, if the Upgrade header field is received in a GET request
+ and the server decides to switch protocols, it first responds with a
+ 101 (Switching Protocols) message in HTTP/1.1 and then immediately
+ follows that with the new protocol's equivalent of a response to a
+ GET on the target resource. This allows a connection to be upgraded
+ to protocols with the same semantics as HTTP without the latency cost
+ of an additional round trip. A server MUST NOT switch protocols
+ unless the received message semantics can be honored by the new
+ protocol; an OPTIONS request can be honored by any protocol.
+
+ The following is an example response to the above hypothetical
+ request:
+
+ HTTP/1.1 101 Switching Protocols
+ Connection: upgrade
+ Upgrade: websocket
+
+ [... data stream switches to websocket with an appropriate response
+ (as defined by new protocol) to the "GET /hello" request ...]
+
+ A sender of Upgrade MUST also send an "Upgrade" connection option in
+ the Connection header field (Section 7.6.1) to inform intermediaries
+ not to forward this field. A server that receives an Upgrade header
+ field in an HTTP/1.0 request MUST ignore that Upgrade field.
+
+ A client cannot begin using an upgraded protocol on the connection
+ until it has completely sent the request message (i.e., the client
+ can't change the protocol it is sending in the middle of a message).
+ If a server receives both an Upgrade and an Expect header field with
+ the "100-continue" expectation (Section 10.1.1), the server MUST send
+ a 100 (Continue) response before sending a 101 (Switching Protocols)
+ response.
+
+ The Upgrade header field only applies to switching protocols on top
+ of the existing connection; it cannot be used to switch the
+ underlying connection (transport) protocol, nor to switch the
+ existing communication to a different connection. For those
+ purposes, it is more appropriate to use a 3xx (Redirection) response
+ (Section 15.4).
+
+ This specification only defines the protocol name "HTTP" for use by
+ the family of Hypertext Transfer Protocols, as defined by the HTTP
+ version rules of Section 2.5 and future updates to this
+ specification. Additional protocol names ought to be registered
+ using the registration procedure defined in Section 16.7.
+
+8. Representation Data and Metadata
+
+8.1. Representation Data
+
+ The representation data associated with an HTTP message is either
+ provided as the content of the message or referred to by the message
+ semantics and the target URI. The representation data is in a format
+ and encoding defined by the representation metadata header fields.
+
+ The data type of the representation data is determined via the header
+ fields Content-Type and Content-Encoding. These define a two-layer,
+ ordered encoding model:
+
+ representation-data := Content-Encoding( Content-Type( data ) )
+
+8.2. Representation Metadata
+
+ Representation header fields provide metadata about the
+ representation. When a message includes content, the representation
+ header fields describe how to interpret that data. In a response to
+ a HEAD request, the representation header fields describe the
+ representation data that would have been enclosed in the content if
+ the same request had been a GET.
+
+8.3. Content-Type
+
+ The "Content-Type" header field indicates the media type of the
+ associated representation: either the representation enclosed in the
+ message content or the selected representation, as determined by the
+ message semantics. The indicated media type defines both the data
+ format and how that data is intended to be processed by a recipient,
+ within the scope of the received message semantics, after any content
+ codings indicated by Content-Encoding are decoded.
+
+ Content-Type = media-type
+
+ Media types are defined in Section 8.3.1. An example of the field is
+
+ Content-Type: text/html; charset=ISO-8859-4
+
+ A sender that generates a message containing content SHOULD generate
+ a Content-Type header field in that message unless the intended media
+ type of the enclosed representation is unknown to the sender. If a
+ Content-Type header field is not present, the recipient MAY either
+ assume a media type of "application/octet-stream" ([RFC2046],
+ Section 4.5.1) or examine the data to determine its type.
+
+ In practice, resource owners do not always properly configure their
+ origin server to provide the correct Content-Type for a given
+ representation. Some user agents examine the content and, in certain
+ cases, override the received type (for example, see [Sniffing]).
+ This "MIME sniffing" risks drawing incorrect conclusions about the
+ data, which might expose the user to additional security risks (e.g.,
+ "privilege escalation"). Furthermore, distinct media types often
+ share a common data format, differing only in how the data is
+ intended to be processed, which is impossible to distinguish by
+ inspecting the data alone. When sniffing is implemented,
+ implementers are encouraged to provide a means for the user to
+ disable it.
+
+ Although Content-Type is defined as a singleton field, it is
+ sometimes incorrectly generated multiple times, resulting in a
+ combined field value that appears to be a list. Recipients often
+ attempt to handle this error by using the last syntactically valid
+ member of the list, leading to potential interoperability and
+ security issues if different implementations have different error
+ handling behaviors.
+
+8.3.1. Media Type
+
+ HTTP uses media types [RFC2046] in the Content-Type (Section 8.3) and
+ Accept (Section 12.5.1) header fields in order to provide open and
+ extensible data typing and type negotiation. Media types define both
+ a data format and various processing models: how to process that data
+ in accordance with the message context.
+
+ media-type = type "/" subtype parameters
+ type = token
+ subtype = token
+
+ The type and subtype tokens are case-insensitive.
+
+ The type/subtype MAY be followed by semicolon-delimited parameters
+ (Section 5.6.6) in the form of name/value pairs. The presence or
+ absence of a parameter might be significant to the processing of a
+ media type, depending on its definition within the media type
+ registry. Parameter values might or might not be case-sensitive,
+ depending on the semantics of the parameter name.
+
+ For example, the following media types are equivalent in describing
+ HTML text data encoded in the UTF-8 character encoding scheme, but
+ the first is preferred for consistency (the "charset" parameter value
+ is defined as being case-insensitive in [RFC2046], Section 4.1.2):
+
+ text/html;charset=utf-8
+ Text/HTML;Charset="utf-8"
+ text/html; charset="utf-8"
+ text/html;charset=UTF-8
+
+ Media types ought to be registered with IANA according to the
+ procedures defined in [BCP13].
+
+8.3.2. Charset
+
+ HTTP uses "charset" names to indicate or negotiate the character
+ encoding scheme ([RFC6365], Section 2) of a textual representation.
+ In the fields defined by this document, charset names appear either
+ in parameters (Content-Type), or, for Accept-Encoding, in the form of
+ a plain token. In both cases, charset names are matched case-
+ insensitively.
+
+ Charset names ought to be registered in the IANA "Character Sets"
+ registry (<https://www.iana.org/assignments/character-sets>)
+ according to the procedures defined in Section 2 of [RFC2978].
+
+ | *Note:* In theory, charset names are defined by the "mime-
+ | charset" ABNF rule defined in Section 2.3 of [RFC2978] (as
+ | corrected in [Err1912]). That rule allows two characters that
+ | are not included in "token" ("{" and "}"), but no charset name
+ | registered at the time of this writing includes braces (see
+ | [Err5433]).
+
+8.3.3. Multipart Types
+
+ MIME provides for a number of "multipart" types -- encapsulations of
+ one or more representations within a single message body. All
+ multipart types share a common syntax, as defined in Section 5.1.1 of
+ [RFC2046], and include a boundary parameter as part of the media type
+ value. The message body is itself a protocol element; a sender MUST
+ generate only CRLF to represent line breaks between body parts.
+
+ HTTP message framing does not use the multipart boundary as an
+ indicator of message body length, though it might be used by
+ implementations that generate or process the content. For example,
+ the "multipart/form-data" type is often used for carrying form data
+ in a request, as described in [RFC7578], and the "multipart/
+ byteranges" type is defined by this specification for use in some 206
+ (Partial Content) responses (see Section 15.3.7).
+
+8.4. Content-Encoding
+
+ The "Content-Encoding" header field indicates what content codings
+ have been applied to the representation, beyond those inherent in the
+ media type, and thus what decoding mechanisms have to be applied in
+ order to obtain data in the media type referenced by the Content-Type
+ header field. Content-Encoding is primarily used to allow a
+ representation's data to be compressed without losing the identity of
+ its underlying media type.
+
+ Content-Encoding = #content-coding
+
+ An example of its use is
+
+ Content-Encoding: gzip
+
+ If one or more encodings have been applied to a representation, the
+ sender that applied the encodings MUST generate a Content-Encoding
+ header field that lists the content codings in the order in which
+ they were applied. Note that the coding named "identity" is reserved
+ for its special role in Accept-Encoding and thus SHOULD NOT be
+ included.
+
+ Additional information about the encoding parameters can be provided
+ by other header fields not defined by this specification.
+
+ Unlike Transfer-Encoding (Section 6.1 of [HTTP/1.1]), the codings
+ listed in Content-Encoding are a characteristic of the
+ representation; the representation is defined in terms of the coded
+ form, and all other metadata about the representation is about the
+ coded form unless otherwise noted in the metadata definition.
+ Typically, the representation is only decoded just prior to rendering
+ or analogous usage.
+
+ If the media type includes an inherent encoding, such as a data
+ format that is always compressed, then that encoding would not be
+ restated in Content-Encoding even if it happens to be the same
+ algorithm as one of the content codings. Such a content coding would
+ only be listed if, for some bizarre reason, it is applied a second
+ time to form the representation. Likewise, an origin server might
+ choose to publish the same data as multiple representations that
+ differ only in whether the coding is defined as part of Content-Type
+ or Content-Encoding, since some user agents will behave differently
+ in their handling of each response (e.g., open a "Save as ..." dialog
+ instead of automatic decompression and rendering of content).
+
+ An origin server MAY respond with a status code of 415 (Unsupported
+ Media Type) if a representation in the request message has a content
+ coding that is not acceptable.
+
+8.4.1. Content Codings
+
+ Content coding values indicate an encoding transformation that has
+ been or can be applied to a representation. Content codings are
+ primarily used to allow a representation to be compressed or
+ otherwise usefully transformed without losing the identity of its
+ underlying media type and without loss of information. Frequently,
+ the representation is stored in coded form, transmitted directly, and
+ only decoded by the final recipient.
+
+ content-coding = token
+
+ All content codings are case-insensitive and ought to be registered
+ within the "HTTP Content Coding Registry", as described in
+ Section 16.6
+
+ Content-coding values are used in the Accept-Encoding
+ (Section 12.5.3) and Content-Encoding (Section 8.4) header fields.
+
+8.4.1.1. Compress Coding
+
+ The "compress" coding is an adaptive Lempel-Ziv-Welch (LZW) coding
+ [Welch] that is commonly produced by the UNIX file compression
+ program "compress". A recipient SHOULD consider "x-compress" to be
+ equivalent to "compress".
+
+8.4.1.2. Deflate Coding
+
+ The "deflate" coding is a "zlib" data format [RFC1950] containing a
+ "deflate" compressed data stream [RFC1951] that uses a combination of
+ the Lempel-Ziv (LZ77) compression algorithm and Huffman coding.
+
+ | *Note:* Some non-conformant implementations send the "deflate"
+ | compressed data without the zlib wrapper.
+
+8.4.1.3. Gzip Coding
+
+ The "gzip" coding is an LZ77 coding with a 32-bit Cyclic Redundancy
+ Check (CRC) that is commonly produced by the gzip file compression
+ program [RFC1952]. A recipient SHOULD consider "x-gzip" to be
+ equivalent to "gzip".
+
+8.5. Content-Language
+
+ The "Content-Language" header field describes the natural language(s)
+ of the intended audience for the representation. Note that this
+ might not be equivalent to all the languages used within the
+ representation.
+
+ Content-Language = #language-tag
+
+ Language tags are defined in Section 8.5.1. The primary purpose of
+ Content-Language is to allow a user to identify and differentiate
+ representations according to the users' own preferred language.
+ Thus, if the content is intended only for a Danish-literate audience,
+ the appropriate field is
+
+ Content-Language: da
+
+ If no Content-Language is specified, the default is that the content
+ is intended for all language audiences. This might mean that the
+ sender does not consider it to be specific to any natural language,
+ or that the sender does not know for which language it is intended.
+
+ Multiple languages MAY be listed for content that is intended for
+ multiple audiences. For example, a rendition of the "Treaty of
+ Waitangi", presented simultaneously in the original Maori and English
+ versions, would call for
+
+ Content-Language: mi, en
+
+ However, just because multiple languages are present within a
+ representation does not mean that it is intended for multiple
+ linguistic audiences. An example would be a beginner's language
+ primer, such as "A First Lesson in Latin", which is clearly intended
+ to be used by an English-literate audience. In this case, the
+ Content-Language would properly only include "en".
+
+ Content-Language MAY be applied to any media type -- it is not
+ limited to textual documents.
+
+8.5.1. Language Tags
+
+ A language tag, as defined in [RFC5646], identifies a natural
+ language spoken, written, or otherwise conveyed by human beings for
+ communication of information to other human beings. Computer
+ languages are explicitly excluded.
+
+ HTTP uses language tags within the Accept-Language and
+ Content-Language header fields. Accept-Language uses the broader
+ language-range production defined in Section 12.5.4, whereas
+ Content-Language uses the language-tag production defined below.
+
+ language-tag = <Language-Tag, see [RFC5646], Section 2.1>
+
+ A language tag is a sequence of one or more case-insensitive subtags,
+ each separated by a hyphen character ("-", %x2D). In most cases, a
+ language tag consists of a primary language subtag that identifies a
+ broad family of related languages (e.g., "en" = English), which is
+ optionally followed by a series of subtags that refine or narrow that
+ language's range (e.g., "en-CA" = the variety of English as
+ communicated in Canada). Whitespace is not allowed within a language
+ tag. Example tags include:
+
+ fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN
+
+ See [RFC5646] for further information.
+
+8.6. Content-Length
+
+ The "Content-Length" header field indicates the associated
+ representation's data length as a decimal non-negative integer number
+ of octets. When transferring a representation as content, Content-
+ Length refers specifically to the amount of data enclosed so that it
+ can be used to delimit framing (e.g., Section 6.2 of [HTTP/1.1]). In
+ other cases, Content-Length indicates the selected representation's
+ current length, which can be used by recipients to estimate transfer
+ time or to compare with previously stored representations.
+
+ Content-Length = 1*DIGIT
+
+ An example is
+
+ Content-Length: 3495
+
+ A user agent SHOULD send Content-Length in a request when the method
+ defines a meaning for enclosed content and it is not sending
+ Transfer-Encoding. For example, a user agent normally sends Content-
+ Length in a POST request even when the value is 0 (indicating empty
+ content). A user agent SHOULD NOT send a Content-Length header field
+ when the request message does not contain content and the method
+ semantics do not anticipate such data.
+
+ A server MAY send a Content-Length header field in a response to a
+ HEAD request (Section 9.3.2); a server MUST NOT send Content-Length
+ in such a response unless its field value equals the decimal number
+ of octets that would have been sent in the content of a response if
+ the same request had used the GET method.
+
+ A server MAY send a Content-Length header field in a 304 (Not
+ Modified) response to a conditional GET request (Section 15.4.5); a
+ server MUST NOT send Content-Length in such a response unless its
+ field value equals the decimal number of octets that would have been
+ sent in the content of a 200 (OK) response to the same request.
+
+ A server MUST NOT send a Content-Length header field in any response
+ with a status code of 1xx (Informational) or 204 (No Content). A
+ server MUST NOT send a Content-Length header field in any 2xx
+ (Successful) response to a CONNECT request (Section 9.3.6).
+
+ Aside from the cases defined above, in the absence of Transfer-
+ Encoding, an origin server SHOULD send a Content-Length header field
+ when the content size is known prior to sending the complete header
+ section. This will allow downstream recipients to measure transfer
+ progress, know when a received message is complete, and potentially
+ reuse the connection for additional requests.
+
+ Any Content-Length field value greater than or equal to zero is
+ valid. Since there is no predefined limit to the length of content,
+ a recipient MUST anticipate potentially large decimal numerals and
+ prevent parsing errors due to integer conversion overflows or
+ precision loss due to integer conversion (Section 17.5).
+
+ Because Content-Length is used for message delimitation in HTTP/1.1,
+ its field value can impact how the message is parsed by downstream
+ recipients even when the immediate connection is not using HTTP/1.1.
+ If the message is forwarded by a downstream intermediary, a Content-
+ Length field value that is inconsistent with the received message
+ framing might cause a security failure due to request smuggling or
+ response splitting.
+
+ As a result, a sender MUST NOT forward a message with a Content-
+ Length header field value that is known to be incorrect.
+
+ Likewise, a sender MUST NOT forward a message with a Content-Length
+ header field value that does not match the ABNF above, with one
+ exception: a recipient of a Content-Length header field value
+ consisting of the same decimal value repeated as a comma-separated
+ list (e.g, "Content-Length: 42, 42") MAY either reject the message as
+ invalid or replace that invalid field value with a single instance of
+ the decimal value, since this likely indicates that a duplicate was
+ generated or combined by an upstream message processor.
+
+8.7. Content-Location
+
+ The "Content-Location" header field references a URI that can be used
+ as an identifier for a specific resource corresponding to the
+ representation in this message's content. In other words, if one
+ were to perform a GET request on this URI at the time of this
+ message's generation, then a 200 (OK) response would contain the same
+ representation that is enclosed as content in this message.
+
+ Content-Location = absolute-URI / partial-URI
+
+ The field value is either an absolute-URI or a partial-URI. In the
+ latter case (Section 4), the referenced URI is relative to the target
+ URI ([URI], Section 5).
+
+ The Content-Location value is not a replacement for the target URI
+ (Section 7.1). It is representation metadata. It has the same
+ syntax and semantics as the header field of the same name defined for
+ MIME body parts in Section 4 of [RFC2557]. However, its appearance
+ in an HTTP message has some special implications for HTTP recipients.
+
+ If Content-Location is included in a 2xx (Successful) response
+ message and its value refers (after conversion to absolute form) to a
+ URI that is the same as the target URI, then the recipient MAY
+ consider the content to be a current representation of that resource
+ at the time indicated by the message origination date. For a GET
+ (Section 9.3.1) or HEAD (Section 9.3.2) request, this is the same as
+ the default semantics when no Content-Location is provided by the
+ server. For a state-changing request like PUT (Section 9.3.4) or
+ POST (Section 9.3.3), it implies that the server's response contains
+ the new representation of that resource, thereby distinguishing it
+ from representations that might only report about the action (e.g.,
+ "It worked!"). This allows authoring applications to update their
+ local copies without the need for a subsequent GET request.
+
+ If Content-Location is included in a 2xx (Successful) response
+ message and its field value refers to a URI that differs from the
+ target URI, then the origin server claims that the URI is an
+ identifier for a different resource corresponding to the enclosed
+ representation. Such a claim can only be trusted if both identifiers
+ share the same resource owner, which cannot be programmatically
+ determined via HTTP.
+
+ * For a response to a GET or HEAD request, this is an indication
+ that the target URI refers to a resource that is subject to
+ content negotiation and the Content-Location field value is a more
+ specific identifier for the selected representation.
+
+ * For a 201 (Created) response to a state-changing method, a
+ Content-Location field value that is identical to the Location
+ field value indicates that this content is a current
+ representation of the newly created resource.
+
+ * Otherwise, such a Content-Location indicates that this content is
+ a representation reporting on the requested action's status and
+ that the same report is available (for future access with GET) at
+ the given URI. For example, a purchase transaction made via a
+ POST request might include a receipt document as the content of
+ the 200 (OK) response; the Content-Location field value provides
+ an identifier for retrieving a copy of that same receipt in the
+ future.
+
+ A user agent that sends Content-Location in a request message is
+ stating that its value refers to where the user agent originally
+ obtained the content of the enclosed representation (prior to any
+ modifications made by that user agent). In other words, the user
+ agent is providing a back link to the source of the original
+ representation.
+
+ An origin server that receives a Content-Location field in a request
+ message MUST treat the information as transitory request context
+ rather than as metadata to be saved verbatim as part of the
+ representation. An origin server MAY use that context to guide in
+ processing the request or to save it for other uses, such as within
+ source links or versioning metadata. However, an origin server MUST
+ NOT use such context information to alter the request semantics.
+
+ For example, if a client makes a PUT request on a negotiated resource
+ and the origin server accepts that PUT (without redirection), then
+ the new state of that resource is expected to be consistent with the
+ one representation supplied in that PUT; the Content-Location cannot
+ be used as a form of reverse content selection identifier to update
+ only one of the negotiated representations. If the user agent had
+ wanted the latter semantics, it would have applied the PUT directly
+ to the Content-Location URI.
+
+8.8. Validator Fields
+
+ Resource metadata is referred to as a "validator" if it can be used
+ within a precondition (Section 13.1) to make a conditional request
+ (Section 13). Validator fields convey a current validator for the
+ selected representation (Section 3.2).
+
+ In responses to safe requests, validator fields describe the selected
+ representation chosen by the origin server while handling the
+ response. Note that, depending on the method and status code
+ semantics, the selected representation for a given response is not
+ necessarily the same as the representation enclosed as response
+ content.
+
+ In a successful response to a state-changing request, validator
+ fields describe the new representation that has replaced the prior
+ selected representation as a result of processing the request.
+
+ For example, an ETag field in a 201 (Created) response communicates
+ the entity tag of the newly created resource's representation, so
+ that the entity tag can be used as a validator in later conditional
+ requests to prevent the "lost update" problem.
+
+ This specification defines two forms of metadata that are commonly
+ used to observe resource state and test for preconditions:
+ modification dates (Section 8.8.2) and opaque entity tags
+ (Section 8.8.3). Additional metadata that reflects resource state
+ has been defined by various extensions of HTTP, such as Web
+ Distributed Authoring and Versioning [WEBDAV], that are beyond the
+ scope of this specification.
+
+8.8.1. Weak versus Strong
+
+ Validators come in two flavors: strong or weak. Weak validators are
+ easy to generate but are far less useful for comparisons. Strong
+ validators are ideal for comparisons but can be very difficult (and
+ occasionally impossible) to generate efficiently. Rather than impose
+ that all forms of resource adhere to the same strength of validator,
+ HTTP exposes the type of validator in use and imposes restrictions on
+ when weak validators can be used as preconditions.
+
+ A "strong validator" is representation metadata that changes value
+ whenever a change occurs to the representation data that would be
+ observable in the content of a 200 (OK) response to GET.
+
+ A strong validator might change for reasons other than a change to
+ the representation data, such as when a semantically significant part
+ of the representation metadata is changed (e.g., Content-Type), but
+ it is in the best interests of the origin server to only change the
+ value when it is necessary to invalidate the stored responses held by
+ remote caches and authoring tools.
+
+ Cache entries might persist for arbitrarily long periods, regardless
+ of expiration times. Thus, a cache might attempt to validate an
+ entry using a validator that it obtained in the distant past. A
+ strong validator is unique across all versions of all representations
+ associated with a particular resource over time. However, there is
+ no implication of uniqueness across representations of different
+ resources (i.e., the same strong validator might be in use for
+ representations of multiple resources at the same time and does not
+ imply that those representations are equivalent).
+
+ There are a variety of strong validators used in practice. The best
+ are based on strict revision control, wherein each change to a
+ representation always results in a unique node name and revision
+ identifier being assigned before the representation is made
+ accessible to GET. A collision-resistant hash function applied to
+ the representation data is also sufficient if the data is available
+ prior to the response header fields being sent and the digest does
+ not need to be recalculated every time a validation request is
+ received. However, if a resource has distinct representations that
+ differ only in their metadata, such as might occur with content
+ negotiation over media types that happen to share the same data
+ format, then the origin server needs to incorporate additional
+ information in the validator to distinguish those representations.
+
+ In contrast, a "weak validator" is representation metadata that might
+ not change for every change to the representation data. This
+ weakness might be due to limitations in how the value is calculated
+ (e.g., clock resolution), an inability to ensure uniqueness for all
+ possible representations of the resource, or a desire of the resource
+ owner to group representations by some self-determined set of
+ equivalency rather than unique sequences of data.
+
+ An origin server SHOULD change a weak entity tag whenever it
+ considers prior representations to be unacceptable as a substitute
+ for the current representation. In other words, a weak entity tag
+ ought to change whenever the origin server wants caches to invalidate
+ old responses.
+
+ For example, the representation of a weather report that changes in
+ content every second, based on dynamic measurements, might be grouped
+ into sets of equivalent representations (from the origin server's
+ perspective) with the same weak validator in order to allow cached
+ representations to be valid for a reasonable period of time (perhaps
+ adjusted dynamically based on server load or weather quality).
+ Likewise, a representation's modification time, if defined with only
+ one-second resolution, might be a weak validator if it is possible
+ for the representation to be modified twice during a single second
+ and retrieved between those modifications.
+
+ Likewise, a validator is weak if it is shared by two or more
+ representations of a given resource at the same time, unless those
+ representations have identical representation data. For example, if
+ the origin server sends the same validator for a representation with
+ a gzip content coding applied as it does for a representation with no
+ content coding, then that validator is weak. However, two
+ simultaneous representations might share the same strong validator if
+ they differ only in the representation metadata, such as when two
+ different media types are available for the same representation data.
+
+ Strong validators are usable for all conditional requests, including
+ cache validation, partial content ranges, and "lost update"
+ avoidance. Weak validators are only usable when the client does not
+ require exact equality with previously obtained representation data,
+ such as when validating a cache entry or limiting a web traversal to
+ recent changes.
+
+8.8.2. Last-Modified
+
+ The "Last-Modified" header field in a response provides a timestamp
+ indicating the date and time at which the origin server believes the
+ selected representation was last modified, as determined at the
+ conclusion of handling the request.
+
+ Last-Modified = HTTP-date
+
+ An example of its use is
+
+ Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
+
+8.8.2.1. Generation
+
+ An origin server SHOULD send Last-Modified for any selected
+ representation for which a last modification date can be reasonably
+ and consistently determined, since its use in conditional requests
+ and evaluating cache freshness ([CACHING]) can substantially reduce
+ unnecessary transfers and significantly improve service availability
+ and scalability.
+
+ A representation is typically the sum of many parts behind the
+ resource interface. The last-modified time would usually be the most
+ recent time that any of those parts were changed. How that value is
+ determined for any given resource is an implementation detail beyond
+ the scope of this specification.
+
+ An origin server SHOULD obtain the Last-Modified value of the
+ representation as close as possible to the time that it generates the
+ Date field value for its response. This allows a recipient to make
+ an accurate assessment of the representation's modification time,
+ especially if the representation changes near the time that the
+ response is generated.
+
+ An origin server with a clock (as defined in Section 5.6.7) MUST NOT
+ generate a Last-Modified date that is later than the server's time of
+ message origination (Date, Section 6.6.1). If the last modification
+ time is derived from implementation-specific metadata that evaluates
+ to some time in the future, according to the origin server's clock,
+ then the origin server MUST replace that value with the message
+ origination date. This prevents a future modification date from
+ having an adverse impact on cache validation.
+
+ An origin server without a clock MUST NOT generate a Last-Modified
+ date for a response unless that date value was assigned to the
+ resource by some other system (presumably one with a clock).
+
+8.8.2.2. Comparison
+
+ A Last-Modified time, when used as a validator in a request, is
+ implicitly weak unless it is possible to deduce that it is strong,
+ using the following rules:
+
+ * The validator is being compared by an origin server to the actual
+ current validator for the representation and,
+
+ * That origin server reliably knows that the associated
+ representation did not change twice during the second covered by
+ the presented validator;
+
+ or
+
+ * The validator is about to be used by a client in an
+ If-Modified-Since, If-Unmodified-Since, or If-Range header field,
+ because the client has a cache entry for the associated
+ representation, and
+
+ * That cache entry includes a Date value which is at least one
+ second after the Last-Modified value and the client has reason to
+ believe that they were generated by the same clock or that there
+ is enough difference between the Last-Modified and Date values to
+ make clock synchronization issues unlikely;
+
+ or
+
+ * The validator is being compared by an intermediate cache to the
+ validator stored in its cache entry for the representation, and
+
+ * That cache entry includes a Date value which is at least one
+ second after the Last-Modified value and the cache has reason to
+ believe that they were generated by the same clock or that there
+ is enough difference between the Last-Modified and Date values to
+ make clock synchronization issues unlikely.
+
+ This method relies on the fact that if two different responses were
+ sent by the origin server during the same second, but both had the
+ same Last-Modified time, then at least one of those responses would
+ have a Date value equal to its Last-Modified time.
+
+8.8.3. ETag
+
+ The "ETag" field in a response provides the current entity tag for
+ the selected representation, as determined at the conclusion of
+ handling the request. An entity tag is an opaque validator for
+ differentiating between multiple representations of the same
+ resource, regardless of whether those multiple representations are
+ due to resource state changes over time, content negotiation
+ resulting in multiple representations being valid at the same time,
+ or both. An entity tag consists of an opaque quoted string, possibly
+ prefixed by a weakness indicator.
+
+ ETag = entity-tag
+
+ entity-tag = [ weak ] opaque-tag
+ weak = %s"W/"
+ opaque-tag = DQUOTE *etagc DQUOTE
+ etagc = %x21 / %x23-7E / obs-text
+ ; VCHAR except double quotes, plus obs-text
+
+ | *Note:* Previously, opaque-tag was defined to be a quoted-
+ | string ([RFC2616], Section 3.11); thus, some recipients might
+ | perform backslash unescaping. Servers therefore ought to avoid
+ | backslash characters in entity tags.
+
+ An entity tag can be more reliable for validation than a modification
+ date in situations where it is inconvenient to store modification
+ dates, where the one-second resolution of HTTP-date values is not
+ sufficient, or where modification dates are not consistently
+ maintained.
+
+ Examples:
+
+ ETag: "xyzzy"
+ ETag: W/"xyzzy"
+ ETag: ""
+
+ An entity tag can be either a weak or strong validator, with strong
+ being the default. If an origin server provides an entity tag for a
+ representation and the generation of that entity tag does not satisfy
+ all of the characteristics of a strong validator (Section 8.8.1),
+ then the origin server MUST mark the entity tag as weak by prefixing
+ its opaque value with "W/" (case-sensitive).
+
+ A sender MAY send the ETag field in a trailer section (see
+ Section 6.5). However, since trailers are often ignored, it is
+ preferable to send ETag as a header field unless the entity tag is
+ generated while sending the content.
+
+8.8.3.1. Generation
+
+ The principle behind entity tags is that only the service author
+ knows the implementation of a resource well enough to select the most
+ accurate and efficient validation mechanism for that resource, and
+ that any such mechanism can be mapped to a simple sequence of octets
+ for easy comparison. Since the value is opaque, there is no need for
+ the client to be aware of how each entity tag is constructed.
+
+ For example, a resource that has implementation-specific versioning
+ applied to all changes might use an internal revision number, perhaps
+ combined with a variance identifier for content negotiation, to
+ accurately differentiate between representations. Other
+ implementations might use a collision-resistant hash of
+ representation content, a combination of various file attributes, or
+ a modification timestamp that has sub-second resolution.
+
+ An origin server SHOULD send an ETag for any selected representation
+ for which detection of changes can be reasonably and consistently
+ determined, since the entity tag's use in conditional requests and
+ evaluating cache freshness ([CACHING]) can substantially reduce
+ unnecessary transfers and significantly improve service availability,
+ scalability, and reliability.
+
+8.8.3.2. Comparison
+
+ There are two entity tag comparison functions, depending on whether
+ or not the comparison context allows the use of weak validators:
+
+ "Strong comparison": two entity tags are equivalent if both are not
+ weak and their opaque-tags match character-by-character.
+
+ "Weak comparison": two entity tags are equivalent if their opaque-
+ tags match character-by-character, regardless of either or both
+ being tagged as "weak".
+
+ The example below shows the results for a set of entity tag pairs and
+ both the weak and strong comparison function results:
+
+ +========+========+===================+=================+
+ | ETag 1 | ETag 2 | Strong Comparison | Weak Comparison |
+ +========+========+===================+=================+
+ | W/"1" | W/"1" | no match | match |
+ +--------+--------+-------------------+-----------------+
+ | W/"1" | W/"2" | no match | no match |
+ +--------+--------+-------------------+-----------------+
+ | W/"1" | "1" | no match | match |
+ +--------+--------+-------------------+-----------------+
+ | "1" | "1" | match | match |
+ +--------+--------+-------------------+-----------------+
+
+ Table 3
+
+8.8.3.3. Example: Entity Tags Varying on Content-Negotiated Resources
+
+ Consider a resource that is subject to content negotiation
+ (Section 12), and where the representations sent in response to a GET
+ request vary based on the Accept-Encoding request header field
+ (Section 12.5.3):
+
+ >> Request:
+
+ GET /index HTTP/1.1
+ Host: www.example.com
+ Accept-Encoding: gzip
+
+ In this case, the response might or might not use the gzip content
+ coding. If it does not, the response might look like:
+
+ >> Response:
+
+ HTTP/1.1 200 OK
+ Date: Fri, 26 Mar 2010 00:05:00 GMT
+ ETag: "123-a"
+ Content-Length: 70
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+
+ Hello World!
+ Hello World!
+ Hello World!
+ Hello World!
+ Hello World!
+
+ An alternative representation that does use gzip content coding would
+ be:
+
+ >> Response:
+
+ HTTP/1.1 200 OK
+ Date: Fri, 26 Mar 2010 00:05:00 GMT
+ ETag: "123-b"
+ Content-Length: 43
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+ Content-Encoding: gzip
+
+ ...binary data...
+
+ | *Note:* Content codings are a property of the representation
+ | data, so a strong entity tag for a content-encoded
+ | representation has to be distinct from the entity tag of an
+ | unencoded representation to prevent potential conflicts during
+ | cache updates and range requests. In contrast, transfer
+ | codings (Section 7 of [HTTP/1.1]) apply only during message
+ | transfer and do not result in distinct entity tags.
+
+9. Methods
+
+9.1. Overview
+
+ The request method token is the primary source of request semantics;
+ it indicates the purpose for which the client has made this request
+ and what is expected by the client as a successful result.
+
+ The request method's semantics might be further specialized by the
+ semantics of some header fields when present in a request if those
+ additional semantics do not conflict with the method. For example, a
+ client can send conditional request header fields (Section 13.1) to
+ make the requested action conditional on the current state of the
+ target resource.
+
+ HTTP is designed to be usable as an interface to distributed object
+ systems. The request method invokes an action to be applied to a
+ target resource in much the same way that a remote method invocation
+ can be sent to an identified object.
+
+ method = token
+
+ The method token is case-sensitive because it might be used as a
+ gateway to object-based systems with case-sensitive method names. By
+ convention, standardized methods are defined in all-uppercase US-
+ ASCII letters.
+
+ Unlike distributed objects, the standardized request methods in HTTP
+ are not resource-specific, since uniform interfaces provide for
+ better visibility and reuse in network-based systems [REST]. Once
+ defined, a standardized method ought to have the same semantics when
+ applied to any resource, though each resource determines for itself
+ whether those semantics are implemented or allowed.
+
+ This specification defines a number of standardized methods that are
+ commonly used in HTTP, as outlined by the following table.
+
+ +=========+============================================+=========+
+ | Method | Description | Section |
+ | Name | | |
+ +=========+============================================+=========+
+ | GET | Transfer a current representation of the | 9.3.1 |
+ | | target resource. | |
+ +---------+--------------------------------------------+---------+
+ | HEAD | Same as GET, but do not transfer the | 9.3.2 |
+ | | response content. | |
+ +---------+--------------------------------------------+---------+
+ | POST | Perform resource-specific processing on | 9.3.3 |
+ | | the request content. | |
+ +---------+--------------------------------------------+---------+
+ | PUT | Replace all current representations of the | 9.3.4 |
+ | | target resource with the request content. | |
+ +---------+--------------------------------------------+---------+
+ | DELETE | Remove all current representations of the | 9.3.5 |
+ | | target resource. | |
+ +---------+--------------------------------------------+---------+
+ | CONNECT | Establish a tunnel to the server | 9.3.6 |
+ | | identified by the target resource. | |
+ +---------+--------------------------------------------+---------+
+ | OPTIONS | Describe the communication options for the | 9.3.7 |
+ | | target resource. | |
+ +---------+--------------------------------------------+---------+
+ | TRACE | Perform a message loop-back test along the | 9.3.8 |
+ | | path to the target resource. | |
+ +---------+--------------------------------------------+---------+
+
+ Table 4
+
+ All general-purpose servers MUST support the methods GET and HEAD.
+ All other methods are OPTIONAL.
+
+ The set of methods allowed by a target resource can be listed in an
+ Allow header field (Section 10.2.1). However, the set of allowed
+ methods can change dynamically. An origin server that receives a
+ request method that is unrecognized or not implemented SHOULD respond
+ with the 501 (Not Implemented) status code. An origin server that
+ receives a request method that is recognized and implemented, but not
+ allowed for the target resource, SHOULD respond with the 405 (Method
+ Not Allowed) status code.
+
+ Additional methods, outside the scope of this specification, have
+ been specified for use in HTTP. All such methods ought to be
+ registered within the "Hypertext Transfer Protocol (HTTP) Method
+ Registry", as described in Section 16.1.
+
+9.2. Common Method Properties
+
+9.2.1. Safe Methods
+
+ Request methods are considered "safe" if their defined semantics are
+ essentially read-only; i.e., the client does not request, and does
+ not expect, any state change on the origin server as a result of
+ applying a safe method to a target resource. Likewise, reasonable
+ use of a safe method is not expected to cause any harm, loss of
+ property, or unusual burden on the origin server.
+
+ This definition of safe methods does not prevent an implementation
+ from including behavior that is potentially harmful, that is not
+ entirely read-only, or that causes side effects while invoking a safe
+ method. What is important, however, is that the client did not
+ request that additional behavior and cannot be held accountable for
+ it. For example, most servers append request information to access
+ log files at the completion of every response, regardless of the
+ method, and that is considered safe even though the log storage might
+ become full and cause the server to fail. Likewise, a safe request
+ initiated by selecting an advertisement on the Web will often have
+ the side effect of charging an advertising account.
+
+ Of the request methods defined by this specification, the GET, HEAD,
+ OPTIONS, and TRACE methods are defined to be safe.
+
+ The purpose of distinguishing between safe and unsafe methods is to
+ allow automated retrieval processes (spiders) and cache performance
+ optimization (pre-fetching) to work without fear of causing harm. In
+ addition, it allows a user agent to apply appropriate constraints on
+ the automated use of unsafe methods when processing potentially
+ untrusted content.
+
+ A user agent SHOULD distinguish between safe and unsafe methods when
+ presenting potential actions to a user, such that the user can be
+ made aware of an unsafe action before it is requested.
+
+ When a resource is constructed such that parameters within the target
+ URI have the effect of selecting an action, it is the resource
+ owner's responsibility to ensure that the action is consistent with
+ the request method semantics. For example, it is common for Web-
+ based content editing software to use actions within query
+ parameters, such as "page?do=delete". If the purpose of such a
+ resource is to perform an unsafe action, then the resource owner MUST
+ disable or disallow that action when it is accessed using a safe
+ request method. Failure to do so will result in unfortunate side
+ effects when automated processes perform a GET on every URI reference
+ for the sake of link maintenance, pre-fetching, building a search
+ index, etc.
+
+9.2.2. Idempotent Methods
+
+ A request method is considered "idempotent" if the intended effect on
+ the server of multiple identical requests with that method is the
+ same as the effect for a single such request. Of the request methods
+ defined by this specification, PUT, DELETE, and safe request methods
+ are idempotent.
+
+ Like the definition of safe, the idempotent property only applies to
+ what has been requested by the user; a server is free to log each
+ request separately, retain a revision control history, or implement
+ other non-idempotent side effects for each idempotent request.
+
+ Idempotent methods are distinguished because the request can be
+ repeated automatically if a communication failure occurs before the
+ client is able to read the server's response. For example, if a
+ client sends a PUT request and the underlying connection is closed
+ before any response is received, then the client can establish a new
+ connection and retry the idempotent request. It knows that repeating
+ the request will have the same intended effect, even if the original
+ request succeeded, though the response might differ.
+
+ A client SHOULD NOT automatically retry a request with a non-
+ idempotent method unless it has some means to know that the request
+ semantics are actually idempotent, regardless of the method, or some
+ means to detect that the original request was never applied.
+
+ For example, a user agent can repeat a POST request automatically if
+ it knows (through design or configuration) that the request is safe
+ for that resource. Likewise, a user agent designed specifically to
+ operate on a version control repository might be able to recover from
+ partial failure conditions by checking the target resource
+ revision(s) after a failed connection, reverting or fixing any
+ changes that were partially applied, and then automatically retrying
+ the requests that failed.
+
+ Some clients take a riskier approach and attempt to guess when an
+ automatic retry is possible. For example, a client might
+ automatically retry a POST request if the underlying transport
+ connection closed before any part of a response is received,
+ particularly if an idle persistent connection was used.
+
+ A proxy MUST NOT automatically retry non-idempotent requests. A
+ client SHOULD NOT automatically retry a failed automatic retry.
+
+9.2.3. Methods and Caching
+
+ For a cache to store and use a response, the associated method needs
+ to explicitly allow caching and to detail under what conditions a
+ response can be used to satisfy subsequent requests; a method
+ definition that does not do so cannot be cached. For additional
+ requirements see [CACHING].
+
+ This specification defines caching semantics for GET, HEAD, and POST,
+ although the overwhelming majority of cache implementations only
+ support GET and HEAD.
+
+9.3. Method Definitions
+
+9.3.1. GET
+
+ The GET method requests transfer of a current selected representation
+ for the target resource. A successful response reflects the quality
+ of "sameness" identified by the target URI (Section 1.2.2 of [URI]).
+ Hence, retrieving identifiable information via HTTP is usually
+ performed by making a GET request on an identifier associated with
+ the potential for providing that information in a 200 (OK) response.
+
+ GET is the primary mechanism of information retrieval and the focus
+ of almost all performance optimizations. Applications that produce a
+ URI for each important resource can benefit from those optimizations
+ while enabling their reuse by other applications, creating a network
+ effect that promotes further expansion of the Web.
+
+ It is tempting to think of resource identifiers as remote file system
+ pathnames and of representations as being a copy of the contents of
+ such files. In fact, that is how many resources are implemented (see
+ Section 17.3 for related security considerations). However, there
+ are no such limitations in practice.
+
+ The HTTP interface for a resource is just as likely to be implemented
+ as a tree of content objects, a programmatic view on various database
+ records, or a gateway to other information systems. Even when the
+ URI mapping mechanism is tied to a file system, an origin server
+ might be configured to execute the files with the request as input
+ and send the output as the representation rather than transfer the
+ files directly. Regardless, only the origin server needs to know how
+ each resource identifier corresponds to an implementation and how
+ that implementation manages to select and send a current
+ representation of the target resource.
+
+ A client can alter the semantics of GET to be a "range request",
+ requesting transfer of only some part(s) of the selected
+ representation, by sending a Range header field in the request
+ (Section 14.2).
+
+ Although request message framing is independent of the method used,
+ content received in a GET request has no generally defined semantics,
+ cannot alter the meaning or target of the request, and might lead
+ some implementations to reject the request and close the connection
+ because of its potential as a request smuggling attack (Section 11.2
+ of [HTTP/1.1]). A client SHOULD NOT generate content in a GET
+ request unless it is made directly to an origin server that has
+ previously indicated, in or out of band, that such a request has a
+ purpose and will be adequately supported. An origin server SHOULD
+ NOT rely on private agreements to receive content, since participants
+ in HTTP communication are often unaware of intermediaries along the
+ request chain.
+
+ The response to a GET request is cacheable; a cache MAY use it to
+ satisfy subsequent GET and HEAD requests unless otherwise indicated
+ by the Cache-Control header field (Section 5.2 of [CACHING]).
+
+ When information retrieval is performed with a mechanism that
+ constructs a target URI from user-provided information, such as the
+ query fields of a form using GET, potentially sensitive data might be
+ provided that would not be appropriate for disclosure within a URI
+ (see Section 17.9). In some cases, the data can be filtered or
+ transformed such that it would not reveal such information. In
+ others, particularly when there is no benefit from caching a
+ response, using the POST method (Section 9.3.3) instead of GET can
+ transmit such information in the request content rather than within
+ the target URI.
+
+9.3.2. HEAD
+
+ The HEAD method is identical to GET except that the server MUST NOT
+ send content in the response. HEAD is used to obtain metadata about
+ the selected representation without transferring its representation
+ data, often for the sake of testing hypertext links or finding recent
+ modifications.
+
+ The server SHOULD send the same header fields in response to a HEAD
+ request as it would have sent if the request method had been GET.
+ However, a server MAY omit header fields for which a value is
+ determined only while generating the content. For example, some
+ servers buffer a dynamic response to GET until a minimum amount of
+ data is generated so that they can more efficiently delimit small
+ responses or make late decisions with regard to content selection.
+ Such a response to GET might contain Content-Length and Vary fields,
+ for example, that are not generated within a HEAD response. These
+ minor inconsistencies are considered preferable to generating and
+ discarding the content for a HEAD request, since HEAD is usually
+ requested for the sake of efficiency.
+
+ Although request message framing is independent of the method used,
+ content received in a HEAD request has no generally defined
+ semantics, cannot alter the meaning or target of the request, and
+ might lead some implementations to reject the request and close the
+ connection because of its potential as a request smuggling attack
+ (Section 11.2 of [HTTP/1.1]). A client SHOULD NOT generate content
+ in a HEAD request unless it is made directly to an origin server that
+ has previously indicated, in or out of band, that such a request has
+ a purpose and will be adequately supported. An origin server SHOULD
+ NOT rely on private agreements to receive content, since participants
+ in HTTP communication are often unaware of intermediaries along the
+ request chain.
+
+ The response to a HEAD request is cacheable; a cache MAY use it to
+ satisfy subsequent HEAD requests unless otherwise indicated by the
+ Cache-Control header field (Section 5.2 of [CACHING]). A HEAD
+ response might also affect previously cached responses to GET; see
+ Section 4.3.5 of [CACHING].
+
+9.3.3. POST
+
+ The POST method requests that the target resource process the
+ representation enclosed in the request according to the resource's
+ own specific semantics. For example, POST is used for the following
+ functions (among others):
+
+ * Providing a block of data, such as the fields entered into an HTML
+ form, to a data-handling process;
+
+ * Posting a message to a bulletin board, newsgroup, mailing list,
+ blog, or similar group of articles;
+
+ * Creating a new resource that has yet to be identified by the
+ origin server; and
+
+ * Appending data to a resource's existing representation(s).
+
+ An origin server indicates response semantics by choosing an
+ appropriate status code depending on the result of processing the
+ POST request; almost all of the status codes defined by this
+ specification could be received in a response to POST (the exceptions
+ being 206 (Partial Content), 304 (Not Modified), and 416 (Range Not
+ Satisfiable)).
+
+ If one or more resources has been created on the origin server as a
+ result of successfully processing a POST request, the origin server
+ SHOULD send a 201 (Created) response containing a Location header
+ field that provides an identifier for the primary resource created
+ (Section 10.2.2) and a representation that describes the status of
+ the request while referring to the new resource(s).
+
+ Responses to POST requests are only cacheable when they include
+ explicit freshness information (see Section 4.2.1 of [CACHING]) and a
+ Content-Location header field that has the same value as the POST's
+ target URI (Section 8.7). A cached POST response can be reused to
+ satisfy a later GET or HEAD request. In contrast, a POST request
+ cannot be satisfied by a cached POST response because POST is
+ potentially unsafe; see Section 4 of [CACHING].
+
+ If the result of processing a POST would be equivalent to a
+ representation of an existing resource, an origin server MAY redirect
+ the user agent to that resource by sending a 303 (See Other) response
+ with the existing resource's identifier in the Location field. This
+ has the benefits of providing the user agent a resource identifier
+ and transferring the representation via a method more amenable to
+ shared caching, though at the cost of an extra request if the user
+ agent does not already have the representation cached.
+
+9.3.4. PUT
+
+ The PUT method requests that the state of the target resource be
+ created or replaced with the state defined by the representation
+ enclosed in the request message content. A successful PUT of a given
+ representation would suggest that a subsequent GET on that same
+ target resource will result in an equivalent representation being
+ sent in a 200 (OK) response. However, there is no guarantee that
+ such a state change will be observable, since the target resource
+ might be acted upon by other user agents in parallel, or might be
+ subject to dynamic processing by the origin server, before any
+ subsequent GET is received. A successful response only implies that
+ the user agent's intent was achieved at the time of its processing by
+ the origin server.
+
+ If the target resource does not have a current representation and the
+ PUT successfully creates one, then the origin server MUST inform the
+ user agent by sending a 201 (Created) response. If the target
+ resource does have a current representation and that representation
+ is successfully modified in accordance with the state of the enclosed
+ representation, then the origin server MUST send either a 200 (OK) or
+ a 204 (No Content) response to indicate successful completion of the
+ request.
+
+ An origin server SHOULD verify that the PUT representation is
+ consistent with its configured constraints for the target resource.
+ For example, if an origin server determines a resource's
+ representation metadata based on the URI, then the origin server
+ needs to ensure that the content received in a successful PUT request
+ is consistent with that metadata. When a PUT representation is
+ inconsistent with the target resource, the origin server SHOULD
+ either make them consistent, by transforming the representation or
+ changing the resource configuration, or respond with an appropriate
+ error message containing sufficient information to explain why the
+ representation is unsuitable. The 409 (Conflict) or 415 (Unsupported
+ Media Type) status codes are suggested, with the latter being
+ specific to constraints on Content-Type values.
+
+ For example, if the target resource is configured to always have a
+ Content-Type of "text/html" and the representation being PUT has a
+ Content-Type of "image/jpeg", the origin server ought to do one of:
+
+ a. reconfigure the target resource to reflect the new media type;
+
+ b. transform the PUT representation to a format consistent with that
+ of the resource before saving it as the new resource state; or,
+
+ c. reject the request with a 415 (Unsupported Media Type) response
+ indicating that the target resource is limited to "text/html",
+ perhaps including a link to a different resource that would be a
+ suitable target for the new representation.
+
+ HTTP does not define exactly how a PUT method affects the state of an
+ origin server beyond what can be expressed by the intent of the user
+ agent request and the semantics of the origin server response. It
+ does not define what a resource might be, in any sense of that word,
+ beyond the interface provided via HTTP. It does not define how
+ resource state is "stored", nor how such storage might change as a
+ result of a change in resource state, nor how the origin server
+ translates resource state into representations. Generally speaking,
+ all implementation details behind the resource interface are
+ intentionally hidden by the server.
+
+ This extends to how header and trailer fields are stored; while
+ common header fields like Content-Type will typically be stored and
+ returned upon subsequent GET requests, header and trailer field
+ handling is specific to the resource that received the request. As a
+ result, an origin server SHOULD ignore unrecognized header and
+ trailer fields received in a PUT request (i.e., not save them as part
+ of the resource state).
+
+ An origin server MUST NOT send a validator field (Section 8.8), such
+ as an ETag or Last-Modified field, in a successful response to PUT
+ unless the request's representation data was saved without any
+ transformation applied to the content (i.e., the resource's new
+ representation data is identical to the content received in the PUT
+ request) and the validator field value reflects the new
+ representation. This requirement allows a user agent to know when
+ the representation it sent (and retains in memory) is the result of
+ the PUT, and thus it doesn't need to be retrieved again from the
+ origin server. The new validator(s) received in the response can be
+ used for future conditional requests in order to prevent accidental
+ overwrites (Section 13.1).
+
+ The fundamental difference between the POST and PUT methods is
+ highlighted by the different intent for the enclosed representation.
+ The target resource in a POST request is intended to handle the
+ enclosed representation according to the resource's own semantics,
+ whereas the enclosed representation in a PUT request is defined as
+ replacing the state of the target resource. Hence, the intent of PUT
+ is idempotent and visible to intermediaries, even though the exact
+ effect is only known by the origin server.
+
+ Proper interpretation of a PUT request presumes that the user agent
+ knows which target resource is desired. A service that selects a
+ proper URI on behalf of the client, after receiving a state-changing
+ request, SHOULD be implemented using the POST method rather than PUT.
+ If the origin server will not make the requested PUT state change to
+ the target resource and instead wishes to have it applied to a
+ different resource, such as when the resource has been moved to a
+ different URI, then the origin server MUST send an appropriate 3xx
+ (Redirection) response; the user agent MAY then make its own decision
+ regarding whether or not to redirect the request.
+
+ A PUT request applied to the target resource can have side effects on
+ other resources. For example, an article might have a URI for
+ identifying "the current version" (a resource) that is separate from
+ the URIs identifying each particular version (different resources
+ that at one point shared the same state as the current version
+ resource). A successful PUT request on "the current version" URI
+ might therefore create a new version resource in addition to changing
+ the state of the target resource, and might also cause links to be
+ added between the related resources.
+
+ Some origin servers support use of the Content-Range header field
+ (Section 14.4) as a request modifier to perform a partial PUT, as
+ described in Section 14.5.
+
+ Responses to the PUT method are not cacheable. If a successful PUT
+ request passes through a cache that has one or more stored responses
+ for the target URI, those stored responses will be invalidated (see
+ Section 4.4 of [CACHING]).
+
+9.3.5. DELETE
+
+ The DELETE method requests that the origin server remove the
+ association between the target resource and its current
+ functionality. In effect, this method is similar to the "rm" command
+ in UNIX: it expresses a deletion operation on the URI mapping of the
+ origin server rather than an expectation that the previously
+ associated information be deleted.
+
+ If the target resource has one or more current representations, they
+ might or might not be destroyed by the origin server, and the
+ associated storage might or might not be reclaimed, depending
+ entirely on the nature of the resource and its implementation by the
+ origin server (which are beyond the scope of this specification).
+ Likewise, other implementation aspects of a resource might need to be
+ deactivated or archived as a result of a DELETE, such as database or
+ gateway connections. In general, it is assumed that the origin
+ server will only allow DELETE on resources for which it has a
+ prescribed mechanism for accomplishing the deletion.
+
+ Relatively few resources allow the DELETE method -- its primary use
+ is for remote authoring environments, where the user has some
+ direction regarding its effect. For example, a resource that was
+ previously created using a PUT request, or identified via the
+ Location header field after a 201 (Created) response to a POST
+ request, might allow a corresponding DELETE request to undo those
+ actions. Similarly, custom user agent implementations that implement
+ an authoring function, such as revision control clients using HTTP
+ for remote operations, might use DELETE based on an assumption that
+ the server's URI space has been crafted to correspond to a version
+ repository.
+
+ If a DELETE method is successfully applied, the origin server SHOULD
+ send
+
+ * a 202 (Accepted) status code if the action will likely succeed but
+ has not yet been enacted,
+
+ * a 204 (No Content) status code if the action has been enacted and
+ no further information is to be supplied, or
+
+ * a 200 (OK) status code if the action has been enacted and the
+ response message includes a representation describing the status.
+
+ Although request message framing is independent of the method used,
+ content received in a DELETE request has no generally defined
+ semantics, cannot alter the meaning or target of the request, and
+ might lead some implementations to reject the request and close the
+ connection because of its potential as a request smuggling attack
+ (Section 11.2 of [HTTP/1.1]). A client SHOULD NOT generate content
+ in a DELETE request unless it is made directly to an origin server
+ that has previously indicated, in or out of band, that such a request
+ has a purpose and will be adequately supported. An origin server
+ SHOULD NOT rely on private agreements to receive content, since
+ participants in HTTP communication are often unaware of
+ intermediaries along the request chain.
+
+ Responses to the DELETE method are not cacheable. If a successful
+ DELETE request passes through a cache that has one or more stored
+ responses for the target URI, those stored responses will be
+ invalidated (see Section 4.4 of [CACHING]).
+
+9.3.6. CONNECT
+
+ The CONNECT method requests that the recipient establish a tunnel to
+ the destination origin server identified by the request target and,
+ if successful, thereafter restrict its behavior to blind forwarding
+ of data, in both directions, until the tunnel is closed. Tunnels are
+ commonly used to create an end-to-end virtual connection, through one
+ or more proxies, which can then be secured using TLS (Transport Layer
+ Security, [TLS13]).
+
+ CONNECT uses a special form of request target, unique to this method,
+ consisting of only the host and port number of the tunnel
+ destination, separated by a colon. There is no default port; a
+ client MUST send the port number even if the CONNECT request is based
+ on a URI reference that contains an authority component with an
+ elided port (Section 4.1). For example,
+
+ CONNECT server.example.com:80 HTTP/1.1
+ Host: server.example.com
+
+ A server MUST reject a CONNECT request that targets an empty or
+ invalid port number, typically by responding with a 400 (Bad Request)
+ status code.
+
+ Because CONNECT changes the request/response nature of an HTTP
+ connection, specific HTTP versions might have different ways of
+ mapping its semantics into the protocol's wire format.
+
+ CONNECT is intended for use in requests to a proxy. The recipient
+ can establish a tunnel either by directly connecting to the server
+ identified by the request target or, if configured to use another
+ proxy, by forwarding the CONNECT request to the next inbound proxy.
+ An origin server MAY accept a CONNECT request, but most origin
+ servers do not implement CONNECT.
+
+ Any 2xx (Successful) response indicates that the sender (and all
+ inbound proxies) will switch to tunnel mode immediately after the
+ response header section; data received after that header section is
+ from the server identified by the request target. Any response other
+ than a successful response indicates that the tunnel has not yet been
+ formed.
+
+ A tunnel is closed when a tunnel intermediary detects that either
+ side has closed its connection: the intermediary MUST attempt to send
+ any outstanding data that came from the closed side to the other
+ side, close both connections, and then discard any remaining data
+ left undelivered.
+
+ Proxy authentication might be used to establish the authority to
+ create a tunnel. For example,
+
+ CONNECT server.example.com:443 HTTP/1.1
+ Host: server.example.com:443
+ Proxy-Authorization: basic aGVsbG86d29ybGQ=
+
+ There are significant risks in establishing a tunnel to arbitrary
+ servers, particularly when the destination is a well-known or
+ reserved TCP port that is not intended for Web traffic. For example,
+ a CONNECT to "example.com:25" would suggest that the proxy connect to
+ the reserved port for SMTP traffic; if allowed, that could trick the
+ proxy into relaying spam email. Proxies that support CONNECT SHOULD
+ restrict its use to a limited set of known ports or a configurable
+ list of safe request targets.
+
+ A server MUST NOT send any Transfer-Encoding or Content-Length header
+ fields in a 2xx (Successful) response to CONNECT. A client MUST
+ ignore any Content-Length or Transfer-Encoding header fields received
+ in a successful response to CONNECT.
+
+ A CONNECT request message does not have content. The interpretation
+ of data sent after the header section of the CONNECT request message
+ is specific to the version of HTTP in use.
+
+ Responses to the CONNECT method are not cacheable.
+
+9.3.7. OPTIONS
+
+ The OPTIONS method requests information about the communication
+ options available for the target resource, at either the origin
+ server or an intervening intermediary. This method allows a client
+ to determine the options and/or requirements associated with a
+ resource, or the capabilities of a server, without implying a
+ resource action.
+
+ An OPTIONS request with an asterisk ("*") as the request target
+ (Section 7.1) applies to the server in general rather than to a
+ specific resource. Since a server's communication options typically
+ depend on the resource, the "*" request is only useful as a "ping" or
+ "no-op" type of method; it does nothing beyond allowing the client to
+ test the capabilities of the server. For example, this can be used
+ to test a proxy for HTTP/1.1 conformance (or lack thereof).
+
+ If the request target is not an asterisk, the OPTIONS request applies
+ to the options that are available when communicating with the target
+ resource.
+
+ A server generating a successful response to OPTIONS SHOULD send any
+ header that might indicate optional features implemented by the
+ server and applicable to the target resource (e.g., Allow), including
+ potential extensions not defined by this specification. The response
+ content, if any, might also describe the communication options in a
+ machine or human-readable representation. A standard format for such
+ a representation is not defined by this specification, but might be
+ defined by future extensions to HTTP.
+
+ A client MAY send a Max-Forwards header field in an OPTIONS request
+ to target a specific recipient in the request chain (see
+ Section 7.6.2). A proxy MUST NOT generate a Max-Forwards header
+ field while forwarding a request unless that request was received
+ with a Max-Forwards field.
+
+ A client that generates an OPTIONS request containing content MUST
+ send a valid Content-Type header field describing the representation
+ media type. Note that this specification does not define any use for
+ such content.
+
+ Responses to the OPTIONS method are not cacheable.
+
+9.3.8. TRACE
+
+ The TRACE method requests a remote, application-level loop-back of
+ the request message. The final recipient of the request SHOULD
+ reflect the message received, excluding some fields described below,
+ back to the client as the content of a 200 (OK) response. The
+ "message/http" format (Section 10.1 of [HTTP/1.1]) is one way to do
+ so. The final recipient is either the origin server or the first
+ server to receive a Max-Forwards value of zero (0) in the request
+ (Section 7.6.2).
+
+ A client MUST NOT generate fields in a TRACE request containing
+ sensitive data that might be disclosed by the response. For example,
+ it would be foolish for a user agent to send stored user credentials
+ (Section 11) or cookies [COOKIE] in a TRACE request. The final
+ recipient of the request SHOULD exclude any request fields that are
+ likely to contain sensitive data when that recipient generates the
+ response content.
+
+ TRACE allows the client to see what is being received at the other
+ end of the request chain and use that data for testing or diagnostic
+ information. The value of the Via header field (Section 7.6.3) is of
+ particular interest, since it acts as a trace of the request chain.
+ Use of the Max-Forwards header field allows the client to limit the
+ length of the request chain, which is useful for testing a chain of
+ proxies forwarding messages in an infinite loop.
+
+ A client MUST NOT send content in a TRACE request.
+
+ Responses to the TRACE method are not cacheable.
+
+10. Message Context
+
+10.1. Request Context Fields
+
+ The request header fields below provide additional information about
+ the request context, including information about the user, user
+ agent, and resource behind the request.
+
+10.1.1. Expect
+
+ The "Expect" header field in a request indicates a certain set of
+ behaviors (expectations) that need to be supported by the server in
+ order to properly handle this request.
+
+ Expect = #expectation
+ expectation = token [ "=" ( token / quoted-string ) parameters ]
+
+ The Expect field value is case-insensitive.
+
+ The only expectation defined by this specification is "100-continue"
+ (with no defined parameters).
+
+ A server that receives an Expect field value containing a member
+ other than 100-continue MAY respond with a 417 (Expectation Failed)
+ status code to indicate that the unexpected expectation cannot be
+ met.
+
+ A "100-continue" expectation informs recipients that the client is
+ about to send (presumably large) content in this request and wishes
+ to receive a 100 (Continue) interim response if the method, target
+ URI, and header fields are not sufficient to cause an immediate
+ success, redirect, or error response. This allows the client to wait
+ for an indication that it is worthwhile to send the content before
+ actually doing so, which can improve efficiency when the data is huge
+ or when the client anticipates that an error is likely (e.g., when
+ sending a state-changing method, for the first time, without
+ previously verified authentication credentials).
+
+ For example, a request that begins with
+
+ PUT /somewhere/fun HTTP/1.1
+ Host: origin.example.com
+ Content-Type: video/h264
+ Content-Length: 1234567890987
+ Expect: 100-continue
+
+ allows the origin server to immediately respond with an error
+ message, such as 401 (Unauthorized) or 405 (Method Not Allowed),
+ before the client starts filling the pipes with an unnecessary data
+ transfer.
+
+ Requirements for clients:
+
+ * A client MUST NOT generate a 100-continue expectation in a request
+ that does not include content.
+
+ * A client that will wait for a 100 (Continue) response before
+ sending the request content MUST send an Expect header field
+ containing a 100-continue expectation.
+
+ * A client that sends a 100-continue expectation is not required to
+ wait for any specific length of time; such a client MAY proceed to
+ send the content even if it has not yet received a response.
+ Furthermore, since 100 (Continue) responses cannot be sent through
+ an HTTP/1.0 intermediary, such a client SHOULD NOT wait for an
+ indefinite period before sending the content.
+
+ * A client that receives a 417 (Expectation Failed) status code in
+ response to a request containing a 100-continue expectation SHOULD
+ repeat that request without a 100-continue expectation, since the
+ 417 response merely indicates that the response chain does not
+ support expectations (e.g., it passes through an HTTP/1.0 server).
+
+ Requirements for servers:
+
+ * A server that receives a 100-continue expectation in an HTTP/1.0
+ request MUST ignore that expectation.
+
+ * A server MAY omit sending a 100 (Continue) response if it has
+ already received some or all of the content for the corresponding
+ request, or if the framing indicates that there is no content.
+
+ * A server that sends a 100 (Continue) response MUST ultimately send
+ a final status code, once it receives and processes the request
+ content, unless the connection is closed prematurely.
+
+ * A server that responds with a final status code before reading the
+ entire request content SHOULD indicate whether it intends to close
+ the connection (e.g., see Section 9.6 of [HTTP/1.1]) or continue
+ reading the request content.
+
+ Upon receiving an HTTP/1.1 (or later) request that has a method,
+ target URI, and complete header section that contains a 100-continue
+ expectation and an indication that request content will follow, an
+ origin server MUST send either:
+
+ * an immediate response with a final status code, if that status can
+ be determined by examining just the method, target URI, and header
+ fields, or
+
+ * an immediate 100 (Continue) response to encourage the client to
+ send the request content.
+
+ The origin server MUST NOT wait for the content before sending the
+ 100 (Continue) response.
+
+ Upon receiving an HTTP/1.1 (or later) request that has a method,
+ target URI, and complete header section that contains a 100-continue
+ expectation and indicates a request content will follow, a proxy MUST
+ either:
+
+ * send an immediate response with a final status code, if that
+ status can be determined by examining just the method, target URI,
+ and header fields, or
+
+ * forward the request toward the origin server by sending a
+ corresponding request-line and header section to the next inbound
+ server.
+
+ If the proxy believes (from configuration or past interaction) that
+ the next inbound server only supports HTTP/1.0, the proxy MAY
+ generate an immediate 100 (Continue) response to encourage the client
+ to begin sending the content.
+
+10.1.2. From
+
+ The "From" header field contains an Internet email address for a
+ human user who controls the requesting user agent. The address ought
+ to be machine-usable, as defined by "mailbox" in Section 3.4 of
+ [RFC5322]:
+
+ From = mailbox
+
+ mailbox = <mailbox, see [RFC5322], Section 3.4>
+
+ An example is:
+
+ From: spider-admin@example.org
+
+ The From header field is rarely sent by non-robotic user agents. A
+ user agent SHOULD NOT send a From header field without explicit
+ configuration by the user, since that might conflict with the user's
+ privacy interests or their site's security policy.
+
+ A robotic user agent SHOULD send a valid From header field so that
+ the person responsible for running the robot can be contacted if
+ problems occur on servers, such as if the robot is sending excessive,
+ unwanted, or invalid requests.
+
+ A server SHOULD NOT use the From header field for access control or
+ authentication, since its value is expected to be visible to anyone
+ receiving or observing the request and is often recorded within
+ logfiles and error reports without any expectation of privacy.
+
+10.1.3. Referer
+
+ The "Referer" [sic] header field allows the user agent to specify a
+ URI reference for the resource from which the target URI was obtained
+ (i.e., the "referrer", though the field name is misspelled). A user
+ agent MUST NOT include the fragment and userinfo components of the
+ URI reference [URI], if any, when generating the Referer field value.
+
+ Referer = absolute-URI / partial-URI
+
+ The field value is either an absolute-URI or a partial-URI. In the
+ latter case (Section 4), the referenced URI is relative to the target
+ URI ([URI], Section 5).
+
+ The Referer header field allows servers to generate back-links to
+ other resources for simple analytics, logging, optimized caching,
+ etc. It also allows obsolete or mistyped links to be found for
+ maintenance. Some servers use the Referer header field as a means of
+ denying links from other sites (so-called "deep linking") or
+ restricting cross-site request forgery (CSRF), but not all requests
+ contain it.
+
+ Example:
+
+ Referer: http://www.example.org/hypertext/Overview.html
+
+ If the target URI was obtained from a source that does not have its
+ own URI (e.g., input from the user keyboard, or an entry within the
+ user's bookmarks/favorites), the user agent MUST either exclude the
+ Referer header field or send it with a value of "about:blank".
+
+ The Referer header field value need not convey the full URI of the
+ referring resource; a user agent MAY truncate parts other than the
+ referring origin.
+
+ The Referer header field has the potential to reveal information
+ about the request context or browsing history of the user, which is a
+ privacy concern if the referring resource's identifier reveals
+ personal information (such as an account name) or a resource that is
+ supposed to be confidential (such as behind a firewall or internal to
+ a secured service). Most general-purpose user agents do not send the
+ Referer header field when the referring resource is a local "file" or
+ "data" URI. A user agent SHOULD NOT send a Referer header field if
+ the referring resource was accessed with a secure protocol and the
+ request target has an origin differing from that of the referring
+ resource, unless the referring resource explicitly allows Referer to
+ be sent. A user agent MUST NOT send a Referer header field in an
+ unsecured HTTP request if the referring resource was accessed with a
+ secure protocol. See Section 17.9 for additional security
+ considerations.
+
+ Some intermediaries have been known to indiscriminately remove
+ Referer header fields from outgoing requests. This has the
+ unfortunate side effect of interfering with protection against CSRF
+ attacks, which can be far more harmful to their users.
+ Intermediaries and user agent extensions that wish to limit
+ information disclosure in Referer ought to restrict their changes to
+ specific edits, such as replacing internal domain names with
+ pseudonyms or truncating the query and/or path components. An
+ intermediary SHOULD NOT modify or delete the Referer header field
+ when the field value shares the same scheme and host as the target
+ URI.
+
+10.1.4. TE
+
+ The "TE" header field describes capabilities of the client with
+ regard to transfer codings and trailer sections.
+
+ As described in Section 6.5, a TE field with a "trailers" member sent
+ in a request indicates that the client will not discard trailer
+ fields.
+
+ TE is also used within HTTP/1.1 to advise servers about which
+ transfer codings the client is able to accept in a response. As of
+ publication, only HTTP/1.1 uses transfer codings (see Section 7 of
+ [HTTP/1.1]).
+
+ The TE field value is a list of members, with each member (aside from
+ "trailers") consisting of a transfer coding name token with an
+ optional weight indicating the client's relative preference for that
+ transfer coding (Section 12.4.2) and optional parameters for that
+ transfer coding.
+
+ TE = #t-codings
+ t-codings = "trailers" / ( transfer-coding [ weight ] )
+ transfer-coding = token *( OWS ";" OWS transfer-parameter )
+ transfer-parameter = token BWS "=" BWS ( token / quoted-string )
+
+ A sender of TE MUST also send a "TE" connection option within the
+ Connection header field (Section 7.6.1) to inform intermediaries not
+ to forward this field.
+
+10.1.5. User-Agent
+
+ The "User-Agent" header field contains information about the user
+ agent originating the request, which is often used by servers to help
+ identify the scope of reported interoperability problems, to work
+ around or tailor responses to avoid particular user agent
+ limitations, and for analytics regarding browser or operating system
+ use. A user agent SHOULD send a User-Agent header field in each
+ request unless specifically configured not to do so.
+
+ User-Agent = product *( RWS ( product / comment ) )
+
+ The User-Agent field value consists of one or more product
+ identifiers, each followed by zero or more comments (Section 5.6.5),
+ which together identify the user agent software and its significant
+ subproducts. By convention, the product identifiers are listed in
+ decreasing order of their significance for identifying the user agent
+ software. Each product identifier consists of a name and optional
+ version.
+
+ product = token ["/" product-version]
+ product-version = token
+
+ A sender SHOULD limit generated product identifiers to what is
+ necessary to identify the product; a sender MUST NOT generate
+ advertising or other nonessential information within the product
+ identifier. A sender SHOULD NOT generate information in
+ product-version that is not a version identifier (i.e., successive
+ versions of the same product name ought to differ only in the
+ product-version portion of the product identifier).
+
+ Example:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+
+ A user agent SHOULD NOT generate a User-Agent header field containing
+ needlessly fine-grained detail and SHOULD limit the addition of
+ subproducts by third parties. Overly long and detailed User-Agent
+ field values increase request latency and the risk of a user being
+ identified against their wishes ("fingerprinting").
+
+ Likewise, implementations are encouraged not to use the product
+ tokens of other implementations in order to declare compatibility
+ with them, as this circumvents the purpose of the field. If a user
+ agent masquerades as a different user agent, recipients can assume
+ that the user intentionally desires to see responses tailored for
+ that identified user agent, even if they might not work as well for
+ the actual user agent being used.
+
+10.2. Response Context Fields
+
+ The response header fields below provide additional information about
+ the response, beyond what is implied by the status code, including
+ information about the server, about the target resource, or about
+ related resources.
+
+10.2.1. Allow
+
+ The "Allow" header field lists the set of methods advertised as
+ supported by the target resource. The purpose of this field is
+ strictly to inform the recipient of valid request methods associated
+ with the resource.
+
+ Allow = #method
+
+ Example of use:
+
+ Allow: GET, HEAD, PUT
+
+ The actual set of allowed methods is defined by the origin server at
+ the time of each request. An origin server MUST generate an Allow
+ header field in a 405 (Method Not Allowed) response and MAY do so in
+ any other response. An empty Allow field value indicates that the
+ resource allows no methods, which might occur in a 405 response if
+ the resource has been temporarily disabled by configuration.
+
+ A proxy MUST NOT modify the Allow header field -- it does not need to
+ understand all of the indicated methods in order to handle them
+ according to the generic message handling rules.
+
+10.2.2. Location
+
+ The "Location" header field is used in some responses to refer to a
+ specific resource in relation to the response. The type of
+ relationship is defined by the combination of request method and
+ status code semantics.
+
+ Location = URI-reference
+
+ The field value consists of a single URI-reference. When it has the
+ form of a relative reference ([URI], Section 4.2), the final value is
+ computed by resolving it against the target URI ([URI], Section 5).
+
+ For 201 (Created) responses, the Location value refers to the primary
+ resource created by the request. For 3xx (Redirection) responses,
+ the Location value refers to the preferred target resource for
+ automatically redirecting the request.
+
+ If the Location value provided in a 3xx (Redirection) response does
+ not have a fragment component, a user agent MUST process the
+ redirection as if the value inherits the fragment component of the
+ URI reference used to generate the target URI (i.e., the redirection
+ inherits the original reference's fragment, if any).
+
+ For example, a GET request generated for the URI reference
+ "http://www.example.org/~tim" might result in a 303 (See Other)
+ response containing the header field:
+
+ Location: /People.html#tim
+
+ which suggests that the user agent redirect to
+ "http://www.example.org/People.html#tim"
+
+ Likewise, a GET request generated for the URI reference
+ "http://www.example.org/index.html#larry" might result in a 301
+ (Moved Permanently) response containing the header field:
+
+ Location: http://www.example.net/index.html
+
+ which suggests that the user agent redirect to
+ "http://www.example.net/index.html#larry", preserving the original
+ fragment identifier.
+
+ There are circumstances in which a fragment identifier in a Location
+ value would not be appropriate. For example, the Location header
+ field in a 201 (Created) response is supposed to provide a URI that
+ is specific to the created resource.
+
+ | *Note:* Some recipients attempt to recover from Location header
+ | fields that are not valid URI references. This specification
+ | does not mandate or define such processing, but does allow it
+ | for the sake of robustness. A Location field value cannot
+ | allow a list of members because the comma list separator is a
+ | valid data character within a URI-reference. If an invalid
+ | message is sent with multiple Location field lines, a recipient
+ | along the path might combine those field lines into one value.
+ | Recovery of a valid Location field value from that situation is
+ | difficult and not interoperable across implementations.
+
+ | *Note:* The Content-Location header field (Section 8.7) differs
+ | from Location in that the Content-Location refers to the most
+ | specific resource corresponding to the enclosed representation.
+ | It is therefore possible for a response to contain both the
+ | Location and Content-Location header fields.
+
+10.2.3. Retry-After
+
+ Servers send the "Retry-After" header field to indicate how long the
+ user agent ought to wait before making a follow-up request. When
+ sent with a 503 (Service Unavailable) response, Retry-After indicates
+ how long the service is expected to be unavailable to the client.
+ When sent with any 3xx (Redirection) response, Retry-After indicates
+ the minimum time that the user agent is asked to wait before issuing
+ the redirected request.
+
+ The Retry-After field value can be either an HTTP-date or a number of
+ seconds to delay after receiving the response.
+
+ Retry-After = HTTP-date / delay-seconds
+
+ A delay-seconds value is a non-negative decimal integer, representing
+ time in seconds.
+
+ delay-seconds = 1*DIGIT
+
+ Two examples of its use are
+
+ Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
+ Retry-After: 120
+
+ In the latter example, the delay is 2 minutes.
+
+10.2.4. Server
+
+ The "Server" header field contains information about the software
+ used by the origin server to handle the request, which is often used
+ by clients to help identify the scope of reported interoperability
+ problems, to work around or tailor requests to avoid particular
+ server limitations, and for analytics regarding server or operating
+ system use. An origin server MAY generate a Server header field in
+ its responses.
+
+ Server = product *( RWS ( product / comment ) )
+
+ The Server header field value consists of one or more product
+ identifiers, each followed by zero or more comments (Section 5.6.5),
+ which together identify the origin server software and its
+ significant subproducts. By convention, the product identifiers are
+ listed in decreasing order of their significance for identifying the
+ origin server software. Each product identifier consists of a name
+ and optional version, as defined in Section 10.1.5.
+
+ Example:
+
+ Server: CERN/3.0 libwww/2.17
+
+ An origin server SHOULD NOT generate a Server header field containing
+ needlessly fine-grained detail and SHOULD limit the addition of
+ subproducts by third parties. Overly long and detailed Server field
+ values increase response latency and potentially reveal internal
+ implementation details that might make it (slightly) easier for
+ attackers to find and exploit known security holes.
+
+11. HTTP Authentication
+
+11.1. Authentication Scheme
+
+ HTTP provides a general framework for access control and
+ authentication, via an extensible set of challenge-response
+ authentication schemes, which can be used by a server to challenge a
+ client request and by a client to provide authentication information.
+ It uses a case-insensitive token to identify the authentication
+ scheme:
+
+ auth-scheme = token
+
+ Aside from the general framework, this document does not specify any
+ authentication schemes. New and existing authentication schemes are
+ specified independently and ought to be registered within the
+ "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry".
+ For example, the "basic" and "digest" authentication schemes are
+ defined by [RFC7617] and [RFC7616], respectively.
+
+11.2. Authentication Parameters
+
+ The authentication scheme is followed by additional information
+ necessary for achieving authentication via that scheme as either a
+ comma-separated list of parameters or a single sequence of characters
+ capable of holding base64-encoded information.
+
+ token68 = 1*( ALPHA / DIGIT /
+ "-" / "." / "_" / "~" / "+" / "/" ) *"="
+
+ The token68 syntax allows the 66 unreserved URI characters ([URI]),
+ plus a few others, so that it can hold a base64, base64url (URL and
+ filename safe alphabet), base32, or base16 (hex) encoding, with or
+ without padding, but excluding whitespace ([RFC4648]).
+
+ Authentication parameters are name/value pairs, where the name token
+ is matched case-insensitively and each parameter name MUST only occur
+ once per challenge.
+
+ auth-param = token BWS "=" BWS ( token / quoted-string )
+
+ Parameter values can be expressed either as "token" or as "quoted-
+ string" (Section 5.6). Authentication scheme definitions need to
+ accept both notations, both for senders and recipients, to allow
+ recipients to use generic parsing components regardless of the
+ authentication scheme.
+
+ For backwards compatibility, authentication scheme definitions can
+ restrict the format for senders to one of the two variants. This can
+ be important when it is known that deployed implementations will fail
+ when encountering one of the two formats.
+
+11.3. Challenge and Response
+
+ A 401 (Unauthorized) response message is used by an origin server to
+ challenge the authorization of a user agent, including a
+ WWW-Authenticate header field containing at least one challenge
+ applicable to the requested resource.
+
+ A 407 (Proxy Authentication Required) response message is used by a
+ proxy to challenge the authorization of a client, including a
+ Proxy-Authenticate header field containing at least one challenge
+ applicable to the proxy for the requested resource.
+
+ challenge = auth-scheme [ 1*SP ( token68 / #auth-param ) ]
+
+ | *Note:* Many clients fail to parse a challenge that contains an
+ | unknown scheme. A workaround for this problem is to list well-
+ | supported schemes (such as "basic") first.
+
+ A user agent that wishes to authenticate itself with an origin server
+ -- usually, but not necessarily, after receiving a 401 (Unauthorized)
+ -- can do so by including an Authorization header field with the
+ request.
+
+ A client that wishes to authenticate itself with a proxy -- usually,
+ but not necessarily, after receiving a 407 (Proxy Authentication
+ Required) -- can do so by including a Proxy-Authorization header
+ field with the request.
+
+11.4. Credentials
+
+ Both the Authorization field value and the Proxy-Authorization field
+ value contain the client's credentials for the realm of the resource
+ being requested, based upon a challenge received in a response
+ (possibly at some point in the past). When creating their values,
+ the user agent ought to do so by selecting the challenge with what it
+ considers to be the most secure auth-scheme that it understands,
+ obtaining credentials from the user as appropriate. Transmission of
+ credentials within header field values implies significant security
+ considerations regarding the confidentiality of the underlying
+ connection, as described in Section 17.16.1.
+
+ credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ]
+
+ Upon receipt of a request for a protected resource that omits
+ credentials, contains invalid credentials (e.g., a bad password) or
+ partial credentials (e.g., when the authentication scheme requires
+ more than one round trip), an origin server SHOULD send a 401
+ (Unauthorized) response that contains a WWW-Authenticate header field
+ with at least one (possibly new) challenge applicable to the
+ requested resource.
+
+ Likewise, upon receipt of a request that omits proxy credentials or
+ contains invalid or partial proxy credentials, a proxy that requires
+ authentication SHOULD generate a 407 (Proxy Authentication Required)
+ response that contains a Proxy-Authenticate header field with at
+ least one (possibly new) challenge applicable to the proxy.
+
+ A server that receives valid credentials that are not adequate to
+ gain access ought to respond with the 403 (Forbidden) status code
+ (Section 15.5.4).
+
+ HTTP does not restrict applications to this simple challenge-response
+ framework for access authentication. Additional mechanisms can be
+ used, such as authentication at the transport level or via message
+ encapsulation, and with additional header fields specifying
+ authentication information. However, such additional mechanisms are
+ not defined by this specification.
+
+ Note that various custom mechanisms for user authentication use the
+ Set-Cookie and Cookie header fields, defined in [COOKIE], for passing
+ tokens related to authentication.
+
+11.5. Establishing a Protection Space (Realm)
+
+ The "realm" authentication parameter is reserved for use by
+ authentication schemes that wish to indicate a scope of protection.
+
+ A "protection space" is defined by the origin (see Section 4.3.1) of
+ the server being accessed, in combination with the realm value if
+ present. These realms allow the protected resources on a server to
+ be partitioned into a set of protection spaces, each with its own
+ authentication scheme and/or authorization database. The realm value
+ is a string, generally assigned by the origin server, that can have
+ additional semantics specific to the authentication scheme. Note
+ that a response can have multiple challenges with the same auth-
+ scheme but with different realms.
+
+ The protection space determines the domain over which credentials can
+ be automatically applied. If a prior request has been authorized,
+ the user agent MAY reuse the same credentials for all other requests
+ within that protection space for a period of time determined by the
+ authentication scheme, parameters, and/or user preferences (such as a
+ configurable inactivity timeout).
+
+ The extent of a protection space, and therefore the requests to which
+ credentials might be automatically applied, is not necessarily known
+ to clients without additional information. An authentication scheme
+ might define parameters that describe the extent of a protection
+ space. Unless specifically allowed by the authentication scheme, a
+ single protection space cannot extend outside the scope of its
+ server.
+
+ For historical reasons, a sender MUST only generate the quoted-string
+ syntax. Recipients might have to support both token and quoted-
+ string syntax for maximum interoperability with existing clients that
+ have been accepting both notations for a long time.
+
+11.6. Authenticating Users to Origin Servers
+
+11.6.1. WWW-Authenticate
+
+ The "WWW-Authenticate" response header field indicates the
+ authentication scheme(s) and parameters applicable to the target
+ resource.
+
+ WWW-Authenticate = #challenge
+
+ A server generating a 401 (Unauthorized) response MUST send a WWW-
+ Authenticate header field containing at least one challenge. A
+ server MAY generate a WWW-Authenticate header field in other response
+ messages to indicate that supplying credentials (or different
+ credentials) might affect the response.
+
+ A proxy forwarding a response MUST NOT modify any WWW-Authenticate
+ header fields in that response.
+
+ User agents are advised to take special care in parsing the field
+ value, as it might contain more than one challenge, and each
+ challenge can contain a comma-separated list of authentication
+ parameters. Furthermore, the header field itself can occur multiple
+ times.
+
+ For instance:
+
+ WWW-Authenticate: Basic realm="simple", Newauth realm="apps",
+ type=1, title="Login to \"apps\""
+
+ This header field contains two challenges, one for the "Basic" scheme
+ with a realm value of "simple" and another for the "Newauth" scheme
+ with a realm value of "apps". It also contains two additional
+ parameters, "type" and "title".
+
+ Some user agents do not recognize this form, however. As a result,
+ sending a WWW-Authenticate field value with more than one member on
+ the same field line might not be interoperable.
+
+ | *Note:* The challenge grammar production uses the list syntax
+ | as well. Therefore, a sequence of comma, whitespace, and comma
+ | can be considered either as applying to the preceding
+ | challenge, or to be an empty entry in the list of challenges.
+ | In practice, this ambiguity does not affect the semantics of
+ | the header field value and thus is harmless.
+
+11.6.2. Authorization
+
+ The "Authorization" header field allows a user agent to authenticate
+ itself with an origin server -- usually, but not necessarily, after
+ receiving a 401 (Unauthorized) response. Its value consists of
+ credentials containing the authentication information of the user
+ agent for the realm of the resource being requested.
+
+ Authorization = credentials
+
+ If a request is authenticated and a realm specified, the same
+ credentials are presumed to be valid for all other requests within
+ this realm (assuming that the authentication scheme itself does not
+ require otherwise, such as credentials that vary according to a
+ challenge value or using synchronized clocks).
+
+ A proxy forwarding a request MUST NOT modify any Authorization header
+ fields in that request. See Section 3.5 of [CACHING] for details of
+ and requirements pertaining to handling of the Authorization header
+ field by HTTP caches.
+
+11.6.3. Authentication-Info
+
+ HTTP authentication schemes can use the "Authentication-Info"
+ response field to communicate information after the client's
+ authentication credentials have been accepted. This information can
+ include a finalization message from the server (e.g., it can contain
+ the server authentication).
+
+ The field value is a list of parameters (name/value pairs), using the
+ "auth-param" syntax defined in Section 11.3. This specification only
+ describes the generic format; authentication schemes using
+ Authentication-Info will define the individual parameters. The
+ "Digest" Authentication Scheme, for instance, defines multiple
+ parameters in Section 3.5 of [RFC7616].
+
+ Authentication-Info = #auth-param
+
+ The Authentication-Info field can be used in any HTTP response,
+ independently of request method and status code. Its semantics are
+ defined by the authentication scheme indicated by the Authorization
+ header field (Section 11.6.2) of the corresponding request.
+
+ A proxy forwarding a response is not allowed to modify the field
+ value in any way.
+
+ Authentication-Info can be sent as a trailer field (Section 6.5) when
+ the authentication scheme explicitly allows this.
+
+11.7. Authenticating Clients to Proxies
+
+11.7.1. Proxy-Authenticate
+
+ The "Proxy-Authenticate" header field consists of at least one
+ challenge that indicates the authentication scheme(s) and parameters
+ applicable to the proxy for this request. A proxy MUST send at least
+ one Proxy-Authenticate header field in each 407 (Proxy Authentication
+ Required) response that it generates.
+
+ Proxy-Authenticate = #challenge
+
+ Unlike WWW-Authenticate, the Proxy-Authenticate header field applies
+ only to the next outbound client on the response chain. This is
+ because only the client that chose a given proxy is likely to have
+ the credentials necessary for authentication. However, when multiple
+ proxies are used within the same administrative domain, such as
+ office and regional caching proxies within a large corporate network,
+ it is common for credentials to be generated by the user agent and
+ passed through the hierarchy until consumed. Hence, in such a
+ configuration, it will appear as if Proxy-Authenticate is being
+ forwarded because each proxy will send the same challenge set.
+
+ Note that the parsing considerations for WWW-Authenticate apply to
+ this header field as well; see Section 11.6.1 for details.
+
+11.7.2. Proxy-Authorization
+
+ The "Proxy-Authorization" header field allows the client to identify
+ itself (or its user) to a proxy that requires authentication. Its
+ value consists of credentials containing the authentication
+ information of the client for the proxy and/or realm of the resource
+ being requested.
+
+ Proxy-Authorization = credentials
+
+ Unlike Authorization, the Proxy-Authorization header field applies
+ only to the next inbound proxy that demanded authentication using the
+ Proxy-Authenticate header field. When multiple proxies are used in a
+ chain, the Proxy-Authorization header field is consumed by the first
+ inbound proxy that was expecting to receive credentials. A proxy MAY
+ relay the credentials from the client request to the next proxy if
+ that is the mechanism by which the proxies cooperatively authenticate
+ a given request.
+
+11.7.3. Proxy-Authentication-Info
+
+ The "Proxy-Authentication-Info" response header field is equivalent
+ to Authentication-Info, except that it applies to proxy
+ authentication (Section 11.3) and its semantics are defined by the
+ authentication scheme indicated by the Proxy-Authorization header
+ field (Section 11.7.2) of the corresponding request:
+
+ Proxy-Authentication-Info = #auth-param
+
+ However, unlike Authentication-Info, the Proxy-Authentication-Info
+ header field applies only to the next outbound client on the response
+ chain. This is because only the client that chose a given proxy is
+ likely to have the credentials necessary for authentication.
+ However, when multiple proxies are used within the same
+ administrative domain, such as office and regional caching proxies
+ within a large corporate network, it is common for credentials to be
+ generated by the user agent and passed through the hierarchy until
+ consumed. Hence, in such a configuration, it will appear as if
+ Proxy-Authentication-Info is being forwarded because each proxy will
+ send the same field value.
+
+ Proxy-Authentication-Info can be sent as a trailer field
+ (Section 6.5) when the authentication scheme explicitly allows this.
+
+12. Content Negotiation
+
+ When responses convey content, whether indicating a success or an
+ error, the origin server often has different ways of representing
+ that information; for example, in different formats, languages, or
+ encodings. Likewise, different users or user agents might have
+ differing capabilities, characteristics, or preferences that could
+ influence which representation, among those available, would be best
+ to deliver. For this reason, HTTP provides mechanisms for content
+ negotiation.
+
+ This specification defines three patterns of content negotiation that
+ can be made visible within the protocol: "proactive" negotiation,
+ where the server selects the representation based upon the user
+ agent's stated preferences; "reactive" negotiation, where the server
+ provides a list of representations for the user agent to choose from;
+ and "request content" negotiation, where the user agent selects the
+ representation for a future request based upon the server's stated
+ preferences in past responses.
+
+ Other patterns of content negotiation include "conditional content",
+ where the representation consists of multiple parts that are
+ selectively rendered based on user agent parameters, "active
+ content", where the representation contains a script that makes
+ additional (more specific) requests based on the user agent
+ characteristics, and "Transparent Content Negotiation" ([RFC2295]),
+ where content selection is performed by an intermediary. These
+ patterns are not mutually exclusive, and each has trade-offs in
+ applicability and practicality.
+
+ Note that, in all cases, HTTP is not aware of the resource semantics.
+ The consistency with which an origin server responds to requests,
+ over time and over the varying dimensions of content negotiation, and
+ thus the "sameness" of a resource's observed representations over
+ time, is determined entirely by whatever entity or algorithm selects
+ or generates those responses.
+
+12.1. Proactive Negotiation
+
+ When content negotiation preferences are sent by the user agent in a
+ request to encourage an algorithm located at the server to select the
+ preferred representation, it is called "proactive negotiation"
+ (a.k.a., "server-driven negotiation"). Selection is based on the
+ available representations for a response (the dimensions over which
+ it might vary, such as language, content coding, etc.) compared to
+ various information supplied in the request, including both the
+ explicit negotiation header fields below and implicit
+ characteristics, such as the client's network address or parts of the
+ User-Agent field.
+
+ Proactive negotiation is advantageous when the algorithm for
+ selecting from among the available representations is difficult to
+ describe to a user agent, or when the server desires to send its
+ "best guess" to the user agent along with the first response (when
+ that "best guess" is good enough for the user, this avoids the round-
+ trip delay of a subsequent request). In order to improve the
+ server's guess, a user agent MAY send request header fields that
+ describe its preferences.
+
+ Proactive negotiation has serious disadvantages:
+
+ * It is impossible for the server to accurately determine what might
+ be "best" for any given user, since that would require complete
+ knowledge of both the capabilities of the user agent and the
+ intended use for the response (e.g., does the user want to view it
+ on screen or print it on paper?);
+
+ * Having the user agent describe its capabilities in every request
+ can be both very inefficient (given that only a small percentage
+ of responses have multiple representations) and a potential risk
+ to the user's privacy;
+
+ * It complicates the implementation of an origin server and the
+ algorithms for generating responses to a request; and,
+
+ * It limits the reusability of responses for shared caching.
+
+ A user agent cannot rely on proactive negotiation preferences being
+ consistently honored, since the origin server might not implement
+ proactive negotiation for the requested resource or might decide that
+ sending a response that doesn't conform to the user agent's
+ preferences is better than sending a 406 (Not Acceptable) response.
+
+ A Vary header field (Section 12.5.5) is often sent in a response
+ subject to proactive negotiation to indicate what parts of the
+ request information were used in the selection algorithm.
+
+ The request header fields Accept, Accept-Charset, Accept-Encoding,
+ and Accept-Language are defined below for a user agent to engage in
+ proactive negotiation of the response content. The preferences sent
+ in these fields apply to any content in the response, including
+ representations of the target resource, representations of error or
+ processing status, and potentially even the miscellaneous text
+ strings that might appear within the protocol.
+
+12.2. Reactive Negotiation
+
+ With "reactive negotiation" (a.k.a., "agent-driven negotiation"),
+ selection of content (regardless of the status code) is performed by
+ the user agent after receiving an initial response. The mechanism
+ for reactive negotiation might be as simple as a list of references
+ to alternative representations.
+
+ If the user agent is not satisfied by the initial response content,
+ it can perform a GET request on one or more of the alternative
+ resources to obtain a different representation. Selection of such
+ alternatives might be performed automatically (by the user agent) or
+ manually (e.g., by the user selecting from a hypertext menu).
+
+ A server might choose not to send an initial representation, other
+ than the list of alternatives, and thereby indicate that reactive
+ negotiation by the user agent is preferred. For example, the
+ alternatives listed in responses with the 300 (Multiple Choices) and
+ 406 (Not Acceptable) status codes include information about available
+ representations so that the user or user agent can react by making a
+ selection.
+
+ Reactive negotiation is advantageous when the response would vary
+ over commonly used dimensions (such as type, language, or encoding),
+ when the origin server is unable to determine a user agent's
+ capabilities from examining the request, and generally when public
+ caches are used to distribute server load and reduce network usage.
+
+ Reactive negotiation suffers from the disadvantages of transmitting a
+ list of alternatives to the user agent, which degrades user-perceived
+ latency if transmitted in the header section, and needing a second
+ request to obtain an alternate representation. Furthermore, this
+ specification does not define a mechanism for supporting automatic
+ selection, though it does not prevent such a mechanism from being
+ developed.
+
+12.3. Request Content Negotiation
+
+ When content negotiation preferences are sent in a server's response,
+ the listed preferences are called "request content negotiation"
+ because they intend to influence selection of an appropriate content
+ for subsequent requests to that resource. For example, the Accept
+ (Section 12.5.1) and Accept-Encoding (Section 12.5.3) header fields
+ can be sent in a response to indicate preferred media types and
+ content codings for subsequent requests to that resource.
+
+ Similarly, Section 3.1 of [RFC5789] defines the "Accept-Patch"
+ response header field, which allows discovery of which content types
+ are accepted in PATCH requests.
+
+12.4. Content Negotiation Field Features
+
+12.4.1. Absence
+
+ For each of the content negotiation fields, a request that does not
+ contain the field implies that the sender has no preference on that
+ dimension of negotiation.
+
+ If a content negotiation header field is present in a request and
+ none of the available representations for the response can be
+ considered acceptable according to it, the origin server can either
+ honor the header field by sending a 406 (Not Acceptable) response or
+ disregard the header field by treating the response as if it is not
+ subject to content negotiation for that request header field. This
+ does not imply, however, that the client will be able to use the
+ representation.
+
+ | *Note:* A user agent sending these header fields makes it
+ | easier for a server to identify an individual by virtue of the
+ | user agent's request characteristics (Section 17.13).
+
+12.4.2. Quality Values
+
+ The content negotiation fields defined by this specification use a
+ common parameter, named "q" (case-insensitive), to assign a relative
+ "weight" to the preference for that associated kind of content. This
+ weight is referred to as a "quality value" (or "qvalue") because the
+ same parameter name is often used within server configurations to
+ assign a weight to the relative quality of the various
+ representations that can be selected for a resource.
+
+ The weight is normalized to a real number in the range 0 through 1,
+ where 0.001 is the least preferred and 1 is the most preferred; a
+ value of 0 means "not acceptable". If no "q" parameter is present,
+ the default weight is 1.
+
+ weight = OWS ";" OWS "q=" qvalue
+ qvalue = ( "0" [ "." 0*3DIGIT ] )
+ / ( "1" [ "." 0*3("0") ] )
+
+ A sender of qvalue MUST NOT generate more than three digits after the
+ decimal point. User configuration of these values ought to be
+ limited in the same fashion.
+
+12.4.3. Wildcard Values
+
+ Most of these header fields, where indicated, define a wildcard value
+ ("*") to select unspecified values. If no wildcard is present,
+ values that are not explicitly mentioned in the field are considered
+ unacceptable. Within Vary, the wildcard value means that the
+ variance is unlimited.
+
+ | *Note:* In practice, using wildcards in content negotiation has
+ | limited practical value because it is seldom useful to say, for
+ | example, "I prefer image/* more or less than (some other
+ | specific value)". By sending Accept: */*;q=0, clients can
+ | explicitly request a 406 (Not Acceptable) response if a more
+ | preferred format is not available, but they still need to be
+ | able to handle a different response since the server is allowed
+ | to ignore their preference.
+
+12.5. Content Negotiation Fields
+
+12.5.1. Accept
+
+ The "Accept" header field can be used by user agents to specify their
+ preferences regarding response media types. For example, Accept
+ header fields can be used to indicate that the request is
+ specifically limited to a small set of desired types, as in the case
+ of a request for an in-line image.
+
+ When sent by a server in a response, Accept provides information
+ about which content types are preferred in the content of a
+ subsequent request to the same resource.
+
+ Accept = #( media-range [ weight ] )
+
+ media-range = ( "*/*"
+ / ( type "/" "*" )
+ / ( type "/" subtype )
+ ) parameters
+
+ The asterisk "*" character is used to group media types into ranges,
+ with "*/*" indicating all media types and "type/*" indicating all
+ subtypes of that type. The media-range can include media type
+ parameters that are applicable to that range.
+
+ Each media-range might be followed by optional applicable media type
+ parameters (e.g., charset), followed by an optional "q" parameter for
+ indicating a relative weight (Section 12.4.2).
+
+ Previous specifications allowed additional extension parameters to
+ appear after the weight parameter. The accept extension grammar
+ (accept-params, accept-ext) has been removed because it had a
+ complicated definition, was not being used in practice, and is more
+ easily deployed through new header fields. Senders using weights
+ SHOULD send "q" last (after all media-range parameters). Recipients
+ SHOULD process any parameter named "q" as weight, regardless of
+ parameter ordering.
+
+ | *Note:* Use of the "q" parameter name to control content
+ | negotiation would interfere with any media type parameter
+ | having the same name. Hence, the media type registry disallows
+ | parameters named "q".
+
+ The example
+
+ Accept: audio/*; q=0.2, audio/basic
+
+ is interpreted as "I prefer audio/basic, but send me any audio type
+ if it is the best available after an 80% markdown in quality".
+
+ A more elaborate example is
+
+ Accept: text/plain; q=0.5, text/html,
+ text/x-dvi; q=0.8, text/x-c
+
+ Verbally, this would be interpreted as "text/html and text/x-c are
+ the equally preferred media types, but if they do not exist, then
+ send the text/x-dvi representation, and if that does not exist, send
+ the text/plain representation".
+
+ Media ranges can be overridden by more specific media ranges or
+ specific media types. If more than one media range applies to a
+ given type, the most specific reference has precedence. For example,
+
+ Accept: text/*, text/plain, text/plain;format=flowed, */*
+
+ have the following precedence:
+
+ 1. text/plain;format=flowed
+
+ 2. text/plain
+
+ 3. text/*
+
+ 4. */*
+
+ The media type quality factor associated with a given type is
+ determined by finding the media range with the highest precedence
+ that matches the type. For example,
+
+ Accept: text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed,
+ text/plain;format=fixed;q=0.4, */*;q=0.5
+
+ would cause the following values to be associated:
+
+ +==========================+===============+
+ | Media Type | Quality Value |
+ +==========================+===============+
+ | text/plain;format=flowed | 1 |
+ +--------------------------+---------------+
+ | text/plain | 0.7 |
+ +--------------------------+---------------+
+ | text/html | 0.3 |
+ +--------------------------+---------------+
+ | image/jpeg | 0.5 |
+ +--------------------------+---------------+
+ | text/plain;format=fixed | 0.4 |
+ +--------------------------+---------------+
+ | text/html;level=3 | 0.7 |
+ +--------------------------+---------------+
+
+ Table 5
+
+ | *Note:* A user agent might be provided with a default set of
+ | quality values for certain media ranges. However, unless the
+ | user agent is a closed system that cannot interact with other
+ | rendering agents, this default set ought to be configurable by
+ | the user.
+
+12.5.2. Accept-Charset
+
+ The "Accept-Charset" header field can be sent by a user agent to
+ indicate its preferences for charsets in textual response content.
+ For example, this field allows user agents capable of understanding
+ more comprehensive or special-purpose charsets to signal that
+ capability to an origin server that is capable of representing
+ information in those charsets.
+
+ Accept-Charset = #( ( token / "*" ) [ weight ] )
+
+ Charset names are defined in Section 8.3.2. A user agent MAY
+ associate a quality value with each charset to indicate the user's
+ relative preference for that charset, as defined in Section 12.4.2.
+ An example is
+
+ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
+
+ The special value "*", if present in the Accept-Charset header field,
+ matches every charset that is not mentioned elsewhere in the field.
+
+ | *Note:* Accept-Charset is deprecated because UTF-8 has become
+ | nearly ubiquitous and sending a detailed list of user-preferred
+ | charsets wastes bandwidth, increases latency, and makes passive
+ | fingerprinting far too easy (Section 17.13). Most general-
+ | purpose user agents do not send Accept-Charset unless
+ | specifically configured to do so.
+
+12.5.3. Accept-Encoding
+
+ The "Accept-Encoding" header field can be used to indicate
+ preferences regarding the use of content codings (Section 8.4.1).
+
+ When sent by a user agent in a request, Accept-Encoding indicates the
+ content codings acceptable in a response.
+
+ When sent by a server in a response, Accept-Encoding provides
+ information about which content codings are preferred in the content
+ of a subsequent request to the same resource.
+
+ An "identity" token is used as a synonym for "no encoding" in order
+ to communicate when no encoding is preferred.
+
+ Accept-Encoding = #( codings [ weight ] )
+ codings = content-coding / "identity" / "*"
+
+ Each codings value MAY be given an associated quality value (weight)
+ representing the preference for that encoding, as defined in
+ Section 12.4.2. The asterisk "*" symbol in an Accept-Encoding field
+ matches any available content coding not explicitly listed in the
+ field.
+
+ Examples:
+
+ Accept-Encoding: compress, gzip
+ Accept-Encoding:
+ Accept-Encoding: *
+ Accept-Encoding: compress;q=0.5, gzip;q=1.0
+ Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
+
+ A server tests whether a content coding for a given representation is
+ acceptable using these rules:
+
+ 1. If no Accept-Encoding header field is in the request, any content
+ coding is considered acceptable by the user agent.
+
+ 2. If the representation has no content coding, then it is
+ acceptable by default unless specifically excluded by the Accept-
+ Encoding header field stating either "identity;q=0" or "*;q=0"
+ without a more specific entry for "identity".
+
+ 3. If the representation's content coding is one of the content
+ codings listed in the Accept-Encoding field value, then it is
+ acceptable unless it is accompanied by a qvalue of 0. (As
+ defined in Section 12.4.2, a qvalue of 0 means "not acceptable".)
+
+ A representation could be encoded with multiple content codings.
+ However, most content codings are alternative ways to accomplish the
+ same purpose (e.g., data compression). When selecting between
+ multiple content codings that have the same purpose, the acceptable
+ content coding with the highest non-zero qvalue is preferred.
+
+ An Accept-Encoding header field with a field value that is empty
+ implies that the user agent does not want any content coding in
+ response. If a non-empty Accept-Encoding header field is present in
+ a request and none of the available representations for the response
+ have a content coding that is listed as acceptable, the origin server
+ SHOULD send a response without any content coding unless the identity
+ coding is indicated as unacceptable.
+
+ When the Accept-Encoding header field is present in a response, it
+ indicates what content codings the resource was willing to accept in
+ the associated request. The field value is evaluated the same way as
+ in a request.
+
+ Note that this information is specific to the associated request; the
+ set of supported encodings might be different for other resources on
+ the same server and could change over time or depend on other aspects
+ of the request (such as the request method).
+
+ Servers that fail a request due to an unsupported content coding
+ ought to respond with a 415 (Unsupported Media Type) status and
+ include an Accept-Encoding header field in that response, allowing
+ clients to distinguish between issues related to content codings and
+ media types. In order to avoid confusion with issues related to
+ media types, servers that fail a request with a 415 status for
+ reasons unrelated to content codings MUST NOT include the Accept-
+ Encoding header field.
+
+ The most common use of Accept-Encoding is in responses with a 415
+ (Unsupported Media Type) status code, in response to optimistic use
+ of a content coding by clients. However, the header field can also
+ be used to indicate to clients that content codings are supported in
+ order to optimize future interactions. For example, a resource might
+ include it in a 2xx (Successful) response when the request content
+ was big enough to justify use of a compression coding but the client
+ failed do so.
+
+12.5.4. Accept-Language
+
+ The "Accept-Language" header field can be used by user agents to
+ indicate the set of natural languages that are preferred in the
+ response. Language tags are defined in Section 8.5.1.
+
+ Accept-Language = #( language-range [ weight ] )
+ language-range =
+ <language-range, see [RFC4647], Section 2.1>
+
+ Each language-range can be given an associated quality value
+ representing an estimate of the user's preference for the languages
+ specified by that range, as defined in Section 12.4.2. For example,
+
+ Accept-Language: da, en-gb;q=0.8, en;q=0.7
+
+ would mean: "I prefer Danish, but will accept British English and
+ other types of English".
+
+ Note that some recipients treat the order in which language tags are
+ listed as an indication of descending priority, particularly for tags
+ that are assigned equal quality values (no value is the same as q=1).
+ However, this behavior cannot be relied upon. For consistency and to
+ maximize interoperability, many user agents assign each language tag
+ a unique quality value while also listing them in order of decreasing
+ quality. Additional discussion of language priority lists can be
+ found in Section 2.3 of [RFC4647].
+
+ For matching, Section 3 of [RFC4647] defines several matching
+ schemes. Implementations can offer the most appropriate matching
+ scheme for their requirements. The "Basic Filtering" scheme
+ ([RFC4647], Section 3.3.1) is identical to the matching scheme that
+ was previously defined for HTTP in Section 14.4 of [RFC2616].
+
+ It might be contrary to the privacy expectations of the user to send
+ an Accept-Language header field with the complete linguistic
+ preferences of the user in every request (Section 17.13).
+
+ Since intelligibility is highly dependent on the individual user,
+ user agents need to allow user control over the linguistic preference
+ (either through configuration of the user agent itself or by
+ defaulting to a user controllable system setting). A user agent that
+ does not provide such control to the user MUST NOT send an Accept-
+ Language header field.
+
+ | *Note:* User agents ought to provide guidance to users when
+ | setting a preference, since users are rarely familiar with the
+ | details of language matching as described above. For example,
+ | users might assume that on selecting "en-gb", they will be
+ | served any kind of English document if British English is not
+ | available. A user agent might suggest, in such a case, to add
+ | "en" to the list for better matching behavior.
+
+12.5.5. Vary
+
+ The "Vary" header field in a response describes what parts of a
+ request message, aside from the method and target URI, might have
+ influenced the origin server's process for selecting the content of
+ this response.
+
+ Vary = #( "*" / field-name )
+
+ A Vary field value is either the wildcard member "*" or a list of
+ request field names, known as the selecting header fields, that might
+ have had a role in selecting the representation for this response.
+ Potential selecting header fields are not limited to fields defined
+ by this specification.
+
+ A list containing the member "*" signals that other aspects of the
+ request might have played a role in selecting the response
+ representation, possibly including aspects outside the message syntax
+ (e.g., the client's network address). A recipient will not be able
+ to determine whether this response is appropriate for a later request
+ without forwarding the request to the origin server. A proxy MUST
+ NOT generate "*" in a Vary field value.
+
+ For example, a response that contains
+
+ Vary: accept-encoding, accept-language
+
+ indicates that the origin server might have used the request's
+ Accept-Encoding and Accept-Language header fields (or lack thereof)
+ as determining factors while choosing the content for this response.
+
+ A Vary field containing a list of field names has two purposes:
+
+ 1. To inform cache recipients that they MUST NOT use this response
+ to satisfy a later request unless the later request has the same
+ values for the listed header fields as the original request
+ (Section 4.1 of [CACHING]) or reuse of the response has been
+ validated by the origin server. In other words, Vary expands the
+ cache key required to match a new request to the stored cache
+ entry.
+
+ 2. To inform user agent recipients that this response was subject to
+ content negotiation (Section 12) and a different representation
+ might be sent in a subsequent request if other values are
+ provided in the listed header fields (proactive negotiation).
+
+ An origin server SHOULD generate a Vary header field on a cacheable
+ response when it wishes that response to be selectively reused for
+ subsequent requests. Generally, that is the case when the response
+ content has been tailored to better fit the preferences expressed by
+ those selecting header fields, such as when an origin server has
+ selected the response's language based on the request's
+ Accept-Language header field.
+
+ Vary might be elided when an origin server considers variance in
+ content selection to be less significant than Vary's performance
+ impact on caching, particularly when reuse is already limited by
+ cache response directives (Section 5.2 of [CACHING]).
+
+ There is no need to send the Authorization field name in Vary because
+ reuse of that response for a different user is prohibited by the
+ field definition (Section 11.6.2). Likewise, if the response content
+ has been selected or influenced by network region, but the origin
+ server wants the cached response to be reused even if recipients move
+ from one region to another, then there is no need for the origin
+ server to indicate such variance in Vary.
+
+13. Conditional Requests
+
+ A conditional request is an HTTP request with one or more request
+ header fields that indicate a precondition to be tested before
+ applying the request method to the target resource. Section 13.2
+ defines when to evaluate preconditions and their order of precedence
+ when more than one precondition is present.
+
+ Conditional GET requests are the most efficient mechanism for HTTP
+ cache updates [CACHING]. Conditionals can also be applied to state-
+ changing methods, such as PUT and DELETE, to prevent the "lost
+ update" problem: one client accidentally overwriting the work of
+ another client that has been acting in parallel.
+
+13.1. Preconditions
+
+ Preconditions are usually defined with respect to a state of the
+ target resource as a whole (its current value set) or the state as
+ observed in a previously obtained representation (one value in that
+ set). If a resource has multiple current representations, each with
+ its own observable state, a precondition will assume that the mapping
+ of each request to a selected representation (Section 3.2) is
+ consistent over time. Regardless, if the mapping is inconsistent or
+ the server is unable to select an appropriate representation, then no
+ harm will result when the precondition evaluates to false.
+
+ Each precondition defined below consists of a comparison between a
+ set of validators obtained from prior representations of the target
+ resource to the current state of validators for the selected
+ representation (Section 8.8). Hence, these preconditions evaluate
+ whether the state of the target resource has changed since a given
+ state known by the client. The effect of such an evaluation depends
+ on the method semantics and choice of conditional, as defined in
+ Section 13.2.
+
+ Other preconditions, defined by other specifications as extension
+ fields, might place conditions on all recipients, on the state of the
+ target resource in general, or on a group of resources. For
+ instance, the "If" header field in WebDAV can make a request
+ conditional on various aspects of multiple resources, such as locks,
+ if the recipient understands and implements that field ([WEBDAV],
+ Section 10.4).
+
+ Extensibility of preconditions is only possible when the precondition
+ can be safely ignored if unknown (like If-Modified-Since), when
+ deployment can be assumed for a given use case, or when
+ implementation is signaled by some other property of the target
+ resource. This encourages a focus on mutually agreed deployment of
+ common standards.
+
+13.1.1. If-Match
+
+ The "If-Match" header field makes the request method conditional on
+ the recipient origin server either having at least one current
+ representation of the target resource, when the field value is "*",
+ or having a current representation of the target resource that has an
+ entity tag matching a member of the list of entity tags provided in
+ the field value.
+
+ An origin server MUST use the strong comparison function when
+ comparing entity tags for If-Match (Section 8.8.3.2), since the
+ client intends this precondition to prevent the method from being
+ applied if there have been any changes to the representation data.
+
+ If-Match = "*" / #entity-tag
+
+ Examples:
+
+ If-Match: "xyzzy"
+ If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-Match: *
+
+ If-Match is most often used with state-changing methods (e.g., POST,
+ PUT, DELETE) to prevent accidental overwrites when multiple user
+ agents might be acting in parallel on the same resource (i.e., to
+ prevent the "lost update" problem). In general, it can be used with
+ any method that involves the selection or modification of a
+ representation to abort the request if the selected representation's
+ current entity tag is not a member within the If-Match field value.
+
+ When an origin server receives a request that selects a
+ representation and that request includes an If-Match header field,
+ the origin server MUST evaluate the If-Match condition per
+ Section 13.2 prior to performing the method.
+
+ To evaluate a received If-Match header field:
+
+ 1. If the field value is "*", the condition is true if the origin
+ server has a current representation for the target resource.
+
+ 2. If the field value is a list of entity tags, the condition is
+ true if any of the listed tags match the entity tag of the
+ selected representation.
+
+ 3. Otherwise, the condition is false.
+
+ An origin server that evaluates an If-Match condition MUST NOT
+ perform the requested method if the condition evaluates to false.
+ Instead, the origin server MAY indicate that the conditional request
+ failed by responding with a 412 (Precondition Failed) status code.
+ Alternatively, if the request is a state-changing operation that
+ appears to have already been applied to the selected representation,
+ the origin server MAY respond with a 2xx (Successful) status code
+ (i.e., the change requested by the user agent has already succeeded,
+ but the user agent might not be aware of it, perhaps because the
+ prior response was lost or an equivalent change was made by some
+ other user agent).
+
+ Allowing an origin server to send a success response when a change
+ request appears to have already been applied is more efficient for
+ many authoring use cases, but comes with some risk if multiple user
+ agents are making change requests that are very similar but not
+ cooperative. For example, multiple user agents writing to a common
+ resource as a semaphore (e.g., a nonatomic increment) are likely to
+ collide and potentially lose important state transitions. For those
+ kinds of resources, an origin server is better off being stringent in
+ sending 412 for every failed precondition on an unsafe method. In
+ other cases, excluding the ETag field from a success response might
+ encourage the user agent to perform a GET as its next request to
+ eliminate confusion about the resource's current state.
+
+ A client MAY send an If-Match header field in a GET request to
+ indicate that it would prefer a 412 (Precondition Failed) response if
+ the selected representation does not match. However, this is only
+ useful in range requests (Section 14) for completing a previously
+ received partial representation when there is no desire for a new
+ representation. If-Range (Section 13.1.5) is better suited for range
+ requests when the client prefers to receive a new representation.
+
+ A cache or intermediary MAY ignore If-Match because its
+ interoperability features are only necessary for an origin server.
+
+ Note that an If-Match header field with a list value containing "*"
+ and other values (including other instances of "*") is syntactically
+ invalid (therefore not allowed to be generated) and furthermore is
+ unlikely to be interoperable.
+
+13.1.2. If-None-Match
+
+ The "If-None-Match" header field makes the request method conditional
+ on a recipient cache or origin server either not having any current
+ representation of the target resource, when the field value is "*",
+ or having a selected representation with an entity tag that does not
+ match any of those listed in the field value.
+
+ A recipient MUST use the weak comparison function when comparing
+ entity tags for If-None-Match (Section 8.8.3.2), since weak entity
+ tags can be used for cache validation even if there have been changes
+ to the representation data.
+
+ If-None-Match = "*" / #entity-tag
+
+ Examples:
+
+ If-None-Match: "xyzzy"
+ If-None-Match: W/"xyzzy"
+ If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
+ If-None-Match: *
+
+ If-None-Match is primarily used in conditional GET requests to enable
+ efficient updates of cached information with a minimum amount of
+ transaction overhead. When a client desires to update one or more
+ stored responses that have entity tags, the client SHOULD generate an
+ If-None-Match header field containing a list of those entity tags
+ when making a GET request; this allows recipient servers to send a
+ 304 (Not Modified) response to indicate when one of those stored
+ responses matches the selected representation.
+
+ If-None-Match can also be used with a value of "*" to prevent an
+ unsafe request method (e.g., PUT) from inadvertently modifying an
+ existing representation of the target resource when the client
+ believes that the resource does not have a current representation
+ (Section 9.2.1). This is a variation on the "lost update" problem
+ that might arise if more than one client attempts to create an
+ initial representation for the target resource.
+
+ When an origin server receives a request that selects a
+ representation and that request includes an If-None-Match header
+ field, the origin server MUST evaluate the If-None-Match condition
+ per Section 13.2 prior to performing the method.
+
+ To evaluate a received If-None-Match header field:
+
+ 1. If the field value is "*", the condition is false if the origin
+ server has a current representation for the target resource.
+
+ 2. If the field value is a list of entity tags, the condition is
+ false if one of the listed tags matches the entity tag of the
+ selected representation.
+
+ 3. Otherwise, the condition is true.
+
+ An origin server that evaluates an If-None-Match condition MUST NOT
+ perform the requested method if the condition evaluates to false;
+ instead, the origin server MUST respond with either a) the 304 (Not
+ Modified) status code if the request method is GET or HEAD or b) the
+ 412 (Precondition Failed) status code for all other request methods.
+
+ Requirements on cache handling of a received If-None-Match header
+ field are defined in Section 4.3.2 of [CACHING].
+
+ Note that an If-None-Match header field with a list value containing
+ "*" and other values (including other instances of "*") is
+ syntactically invalid (therefore not allowed to be generated) and
+ furthermore is unlikely to be interoperable.
+
+13.1.3. If-Modified-Since
+
+ The "If-Modified-Since" header field makes a GET or HEAD request
+ method conditional on the selected representation's modification date
+ being more recent than the date provided in the field value.
+ Transfer of the selected representation's data is avoided if that
+ data has not changed.
+
+ If-Modified-Since = HTTP-date
+
+ An example of the field is:
+
+ If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ A recipient MUST ignore If-Modified-Since if the request contains an
+ If-None-Match header field; the condition in If-None-Match is
+ considered to be a more accurate replacement for the condition in If-
+ Modified-Since, and the two are only combined for the sake of
+ interoperating with older intermediaries that might not implement
+ If-None-Match.
+
+ A recipient MUST ignore the If-Modified-Since header field if the
+ received field value is not a valid HTTP-date, the field value has
+ more than one member, or if the request method is neither GET nor
+ HEAD.
+
+ A recipient MUST ignore the If-Modified-Since header field if the
+ resource does not have a modification date available.
+
+ A recipient MUST interpret an If-Modified-Since field value's
+ timestamp in terms of the origin server's clock.
+
+ If-Modified-Since is typically used for two distinct purposes: 1) to
+ allow efficient updates of a cached representation that does not have
+ an entity tag and 2) to limit the scope of a web traversal to
+ resources that have recently changed.
+
+ When used for cache updates, a cache will typically use the value of
+ the cached message's Last-Modified header field to generate the field
+ value of If-Modified-Since. This behavior is most interoperable for
+ cases where clocks are poorly synchronized or when the server has
+ chosen to only honor exact timestamp matches (due to a problem with
+ Last-Modified dates that appear to go "back in time" when the origin
+ server's clock is corrected or a representation is restored from an
+ archived backup). However, caches occasionally generate the field
+ value based on other data, such as the Date header field of the
+ cached message or the clock time at which the message was received,
+ particularly when the cached message does not contain a Last-Modified
+ header field.
+
+ When used for limiting the scope of retrieval to a recent time
+ window, a user agent will generate an If-Modified-Since field value
+ based on either its own clock or a Date header field received from
+ the server in a prior response. Origin servers that choose an exact
+ timestamp match based on the selected representation's Last-Modified
+ header field will not be able to help the user agent limit its data
+ transfers to only those changed during the specified window.
+
+ When an origin server receives a request that selects a
+ representation and that request includes an If-Modified-Since header
+ field without an If-None-Match header field, the origin server SHOULD
+ evaluate the If-Modified-Since condition per Section 13.2 prior to
+ performing the method.
+
+ To evaluate a received If-Modified-Since header field:
+
+ 1. If the selected representation's last modification date is
+ earlier or equal to the date provided in the field value, the
+ condition is false.
+
+ 2. Otherwise, the condition is true.
+
+ An origin server that evaluates an If-Modified-Since condition SHOULD
+ NOT perform the requested method if the condition evaluates to false;
+ instead, the origin server SHOULD generate a 304 (Not Modified)
+ response, including only those metadata that are useful for
+ identifying or updating a previously cached response.
+
+ Requirements on cache handling of a received If-Modified-Since header
+ field are defined in Section 4.3.2 of [CACHING].
+
+13.1.4. If-Unmodified-Since
+
+ The "If-Unmodified-Since" header field makes the request method
+ conditional on the selected representation's last modification date
+ being earlier than or equal to the date provided in the field value.
+ This field accomplishes the same purpose as If-Match for cases where
+ the user agent does not have an entity tag for the representation.
+
+ If-Unmodified-Since = HTTP-date
+
+ An example of the field is:
+
+ If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ A recipient MUST ignore If-Unmodified-Since if the request contains
+ an If-Match header field; the condition in If-Match is considered to
+ be a more accurate replacement for the condition in If-Unmodified-
+ Since, and the two are only combined for the sake of interoperating
+ with older intermediaries that might not implement If-Match.
+
+ A recipient MUST ignore the If-Unmodified-Since header field if the
+ received field value is not a valid HTTP-date (including when the
+ field value appears to be a list of dates).
+
+ A recipient MUST ignore the If-Unmodified-Since header field if the
+ resource does not have a modification date available.
+
+ A recipient MUST interpret an If-Unmodified-Since field value's
+ timestamp in terms of the origin server's clock.
+
+ If-Unmodified-Since is most often used with state-changing methods
+ (e.g., POST, PUT, DELETE) to prevent accidental overwrites when
+ multiple user agents might be acting in parallel on a resource that
+ does not supply entity tags with its representations (i.e., to
+ prevent the "lost update" problem). In general, it can be used with
+ any method that involves the selection or modification of a
+ representation to abort the request if the selected representation's
+ last modification date has changed since the date provided in the If-
+ Unmodified-Since field value.
+
+ When an origin server receives a request that selects a
+ representation and that request includes an If-Unmodified-Since
+ header field without an If-Match header field, the origin server MUST
+ evaluate the If-Unmodified-Since condition per Section 13.2 prior to
+ performing the method.
+
+ To evaluate a received If-Unmodified-Since header field:
+
+ 1. If the selected representation's last modification date is
+ earlier than or equal to the date provided in the field value,
+ the condition is true.
+
+ 2. Otherwise, the condition is false.
+
+ An origin server that evaluates an If-Unmodified-Since condition MUST
+ NOT perform the requested method if the condition evaluates to false.
+ Instead, the origin server MAY indicate that the conditional request
+ failed by responding with a 412 (Precondition Failed) status code.
+ Alternatively, if the request is a state-changing operation that
+ appears to have already been applied to the selected representation,
+ the origin server MAY respond with a 2xx (Successful) status code
+ (i.e., the change requested by the user agent has already succeeded,
+ but the user agent might not be aware of it, perhaps because the
+ prior response was lost or an equivalent change was made by some
+ other user agent).
+
+ Allowing an origin server to send a success response when a change
+ request appears to have already been applied is more efficient for
+ many authoring use cases, but comes with some risk if multiple user
+ agents are making change requests that are very similar but not
+ cooperative. In those cases, an origin server is better off being
+ stringent in sending 412 for every failed precondition on an unsafe
+ method.
+
+ A client MAY send an If-Unmodified-Since header field in a GET
+ request to indicate that it would prefer a 412 (Precondition Failed)
+ response if the selected representation has been modified. However,
+ this is only useful in range requests (Section 14) for completing a
+ previously received partial representation when there is no desire
+ for a new representation. If-Range (Section 13.1.5) is better suited
+ for range requests when the client prefers to receive a new
+ representation.
+
+ A cache or intermediary MAY ignore If-Unmodified-Since because its
+ interoperability features are only necessary for an origin server.
+
+13.1.5. If-Range
+
+ The "If-Range" header field provides a special conditional request
+ mechanism that is similar to the If-Match and If-Unmodified-Since
+ header fields but that instructs the recipient to ignore the Range
+ header field if the validator doesn't match, resulting in transfer of
+ the new selected representation instead of a 412 (Precondition
+ Failed) response.
+
+ If a client has a partial copy of a representation and wishes to have
+ an up-to-date copy of the entire representation, it could use the
+ Range header field with a conditional GET (using either or both of
+ If-Unmodified-Since and If-Match.) However, if the precondition
+ fails because the representation has been modified, the client would
+ then have to make a second request to obtain the entire current
+ representation.
+
+ The "If-Range" header field allows a client to "short-circuit" the
+ second request. Informally, its meaning is as follows: if the
+ representation is unchanged, send me the part(s) that I am requesting
+ in Range; otherwise, send me the entire representation.
+
+ If-Range = entity-tag / HTTP-date
+
+ A valid entity-tag can be distinguished from a valid HTTP-date by
+ examining the first three characters for a DQUOTE.
+
+ A client MUST NOT generate an If-Range header field in a request that
+ does not contain a Range header field. A server MUST ignore an If-
+ Range header field received in a request that does not contain a
+ Range header field. An origin server MUST ignore an If-Range header
+ field received in a request for a target resource that does not
+ support Range requests.
+
+ A client MUST NOT generate an If-Range header field containing an
+ entity tag that is marked as weak. A client MUST NOT generate an If-
+ Range header field containing an HTTP-date unless the client has no
+ entity tag for the corresponding representation and the date is a
+ strong validator in the sense defined by Section 8.8.2.2.
+
+ A server that receives an If-Range header field on a Range request
+ MUST evaluate the condition per Section 13.2 prior to performing the
+ method.
+
+ To evaluate a received If-Range header field containing an HTTP-date:
+
+ 1. If the HTTP-date validator provided is not a strong validator in
+ the sense defined by Section 8.8.2.2, the condition is false.
+
+ 2. If the HTTP-date validator provided exactly matches the
+ Last-Modified field value for the selected representation, the
+ condition is true.
+
+ 3. Otherwise, the condition is false.
+
+ To evaluate a received If-Range header field containing an
+ entity-tag:
+
+ 1. If the entity-tag validator provided exactly matches the ETag
+ field value for the selected representation using the strong
+ comparison function (Section 8.8.3.2), the condition is true.
+
+ 2. Otherwise, the condition is false.
+
+ A recipient of an If-Range header field MUST ignore the Range header
+ field if the If-Range condition evaluates to false. Otherwise, the
+ recipient SHOULD process the Range header field as requested.
+
+ Note that the If-Range comparison is by exact match, including when
+ the validator is an HTTP-date, and so it differs from the "earlier
+ than or equal to" comparison used when evaluating an
+ If-Unmodified-Since conditional.
+
+13.2. Evaluation of Preconditions
+
+13.2.1. When to Evaluate
+
+ Except when excluded below, a recipient cache or origin server MUST
+ evaluate received request preconditions after it has successfully
+ performed its normal request checks and just before it would process
+ the request content (if any) or perform the action associated with
+ the request method. A server MUST ignore all received preconditions
+ if its response to the same request without those conditions, prior
+ to processing the request content, would have been a status code
+ other than a 2xx (Successful) or 412 (Precondition Failed). In other
+ words, redirects and failures that can be detected before significant
+ processing occurs take precedence over the evaluation of
+ preconditions.
+
+ A server that is not the origin server for the target resource and
+ cannot act as a cache for requests on the target resource MUST NOT
+ evaluate the conditional request header fields defined by this
+ specification, and it MUST forward them if the request is forwarded,
+ since the generating client intends that they be evaluated by a
+ server that can provide a current representation. Likewise, a server
+ MUST ignore the conditional request header fields defined by this
+ specification when received with a request method that does not
+ involve the selection or modification of a selected representation,
+ such as CONNECT, OPTIONS, or TRACE.
+
+ Note that protocol extensions can modify the conditions under which
+ preconditions are evaluated or the consequences of their evaluation.
+ For example, the immutable cache directive (defined by [RFC8246])
+ instructs caches to forgo forwarding conditional requests when they
+ hold a fresh response.
+
+ Although conditional request header fields are defined as being
+ usable with the HEAD method (to keep HEAD's semantics consistent with
+ those of GET), there is no point in sending a conditional HEAD
+ because a successful response is around the same size as a 304 (Not
+ Modified) response and more useful than a 412 (Precondition Failed)
+ response.
+
+13.2.2. Precedence of Preconditions
+
+ When more than one conditional request header field is present in a
+ request, the order in which the fields are evaluated becomes
+ important. In practice, the fields defined in this document are
+ consistently implemented in a single, logical order, since "lost
+ update" preconditions have more strict requirements than cache
+ validation, a validated cache is more efficient than a partial
+ response, and entity tags are presumed to be more accurate than date
+ validators.
+
+ A recipient cache or origin server MUST evaluate the request
+ preconditions defined by this specification in the following order:
+
+ 1. When recipient is the origin server and If-Match is present,
+ evaluate the If-Match precondition:
+
+ * if true, continue to step 3
+
+ * if false, respond 412 (Precondition Failed) unless it can be
+ determined that the state-changing request has already
+ succeeded (see Section 13.1.1)
+
+ 2. When recipient is the origin server, If-Match is not present, and
+ If-Unmodified-Since is present, evaluate the If-Unmodified-Since
+ precondition:
+
+ * if true, continue to step 3
+
+ * if false, respond 412 (Precondition Failed) unless it can be
+ determined that the state-changing request has already
+ succeeded (see Section 13.1.4)
+
+ 3. When If-None-Match is present, evaluate the If-None-Match
+ precondition:
+
+ * if true, continue to step 5
+
+ * if false for GET/HEAD, respond 304 (Not Modified)
+
+ * if false for other methods, respond 412 (Precondition Failed)
+
+ 4. When the method is GET or HEAD, If-None-Match is not present, and
+ If-Modified-Since is present, evaluate the If-Modified-Since
+ precondition:
+
+ * if true, continue to step 5
+
+ * if false, respond 304 (Not Modified)
+
+ 5. When the method is GET and both Range and If-Range are present,
+ evaluate the If-Range precondition:
+
+ * if true and the Range is applicable to the selected
+ representation, respond 206 (Partial Content)
+
+ * otherwise, ignore the Range header field and respond 200 (OK)
+
+ 6. Otherwise,
+
+ * perform the requested method and respond according to its
+ success or failure.
+
+ Any extension to HTTP that defines additional conditional request
+ header fields ought to define the order for evaluating such fields in
+ relation to those defined in this document and other conditionals
+ that might be found in practice.
+
+14. Range Requests
+
+ Clients often encounter interrupted data transfers as a result of
+ canceled requests or dropped connections. When a client has stored a
+ partial representation, it is desirable to request the remainder of
+ that representation in a subsequent request rather than transfer the
+ entire representation. Likewise, devices with limited local storage
+ might benefit from being able to request only a subset of a larger
+ representation, such as a single page of a very large document, or
+ the dimensions of an embedded image.
+
+ Range requests are an OPTIONAL feature of HTTP, designed so that
+ recipients not implementing this feature (or not supporting it for
+ the target resource) can respond as if it is a normal GET request
+ without impacting interoperability. Partial responses are indicated
+ by a distinct status code to not be mistaken for full responses by
+ caches that might not implement the feature.
+
+14.1. Range Units
+
+ Representation data can be partitioned into subranges when there are
+ addressable structural units inherent to that data's content coding
+ or media type. For example, octet (a.k.a. byte) boundaries are a
+ structural unit common to all representation data, allowing
+ partitions of the data to be identified as a range of bytes at some
+ offset from the start or end of that data.
+
+ This general notion of a "range unit" is used in the Accept-Ranges
+ (Section 14.3) response header field to advertise support for range
+ requests, the Range (Section 14.2) request header field to delineate
+ the parts of a representation that are requested, and the
+ Content-Range (Section 14.4) header field to describe which part of a
+ representation is being transferred.
+
+ range-unit = token
+
+ All range unit names are case-insensitive and ought to be registered
+ within the "HTTP Range Unit Registry", as defined in Section 16.5.1.
+
+ Range units are intended to be extensible, as described in
+ Section 16.5.
+
+14.1.1. Range Specifiers
+
+ Ranges are expressed in terms of a range unit paired with a set of
+ range specifiers. The range unit name determines what kinds of
+ range-spec are applicable to its own specifiers. Hence, the
+ following grammar is generic: each range unit is expected to specify
+ requirements on when int-range, suffix-range, and other-range are
+ allowed.
+
+ A range request can specify a single range or a set of ranges within
+ a single representation.
+
+ ranges-specifier = range-unit "=" range-set
+ range-set = 1#range-spec
+ range-spec = int-range
+ / suffix-range
+ / other-range
+
+ An int-range is a range expressed as two non-negative integers or as
+ one non-negative integer through to the end of the representation
+ data. The range unit specifies what the integers mean (e.g., they
+ might indicate unit offsets from the beginning, inclusive numbered
+ parts, etc.).
+
+ int-range = first-pos "-" [ last-pos ]
+ first-pos = 1*DIGIT
+ last-pos = 1*DIGIT
+
+ An int-range is invalid if the last-pos value is present and less
+ than the first-pos.
+
+ A suffix-range is a range expressed as a suffix of the representation
+ data with the provided non-negative integer maximum length (in range
+ units). In other words, the last N units of the representation data.
+
+ suffix-range = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ To provide for extensibility, the other-range rule is a mostly
+ unconstrained grammar that allows application-specific or future
+ range units to define additional range specifiers.
+
+ other-range = 1*( %x21-2B / %x2D-7E )
+ ; 1*(VCHAR excluding comma)
+
+ A ranges-specifier is invalid if it contains any range-spec that is
+ invalid or undefined for the indicated range-unit.
+
+ A valid ranges-specifier is "satisfiable" if it contains at least one
+ range-spec that is satisfiable, as defined by the indicated
+ range-unit. Otherwise, the ranges-specifier is "unsatisfiable".
+
+14.1.2. Byte Ranges
+
+ The "bytes" range unit is used to express subranges of a
+ representation data's octet sequence. Each byte range is expressed
+ as an integer range at some offset, relative to either the beginning
+ (int-range) or end (suffix-range) of the representation data. Byte
+ ranges do not use the other-range specifier.
+
+ The first-pos value in a bytes int-range gives the offset of the
+ first byte in a range. The last-pos value gives the offset of the
+ last byte in the range; that is, the byte positions specified are
+ inclusive. Byte offsets start at zero.
+
+ If the representation data has a content coding applied, each byte
+ range is calculated with respect to the encoded sequence of bytes,
+ not the sequence of underlying bytes that would be obtained after
+ decoding.
+
+ Examples of bytes range specifiers:
+
+ * The first 500 bytes (byte offsets 0-499, inclusive):
+
+ bytes=0-499
+
+ * The second 500 bytes (byte offsets 500-999, inclusive):
+
+ bytes=500-999
+
+ A client can limit the number of bytes requested without knowing the
+ size of the selected representation. If the last-pos value is
+ absent, or if the value is greater than or equal to the current
+ length of the representation data, the byte range is interpreted as
+ the remainder of the representation (i.e., the server replaces the
+ value of last-pos with a value that is one less than the current
+ length of the selected representation).
+
+ A client can refer to the last N bytes (N > 0) of the selected
+ representation using a suffix-range. If the selected representation
+ is shorter than the specified suffix-length, the entire
+ representation is used.
+
+ Additional examples, assuming a representation of length 10000:
+
+ * The final 500 bytes (byte offsets 9500-9999, inclusive):
+
+ bytes=-500
+
+ Or:
+
+ bytes=9500-
+
+ * The first and last bytes only (bytes 0 and 9999):
+
+ bytes=0-0,-1
+
+ * The first, middle, and last 1000 bytes:
+
+ bytes= 0-999, 4500-5499, -1000
+
+ * Other valid (but not canonical) specifications of the second 500
+ bytes (byte offsets 500-999, inclusive):
+
+ bytes=500-600,601-999
+ bytes=500-700,601-999
+
+ For a GET request, a valid bytes range-spec is satisfiable if it is
+ either:
+
+ * an int-range with a first-pos that is less than the current length
+ of the selected representation or
+
+ * a suffix-range with a non-zero suffix-length.
+
+ When a selected representation has zero length, the only satisfiable
+ form of range-spec in a GET request is a suffix-range with a non-zero
+ suffix-length.
+
+ In the byte-range syntax, first-pos, last-pos, and suffix-length are
+ expressed as decimal number of octets. Since there is no predefined
+ limit to the length of content, recipients MUST anticipate
+ potentially large decimal numerals and prevent parsing errors due to
+ integer conversion overflows.
+
+14.2. Range
+
+ The "Range" header field on a GET request modifies the method
+ semantics to request transfer of only one or more subranges of the
+ selected representation data (Section 8.1), rather than the entire
+ selected representation.
+
+ Range = ranges-specifier
+
+ A server MAY ignore the Range header field. However, origin servers
+ and intermediate caches ought to support byte ranges when possible,
+ since they support efficient recovery from partially failed transfers
+ and partial retrieval of large representations.
+
+ A server MUST ignore a Range header field received with a request
+ method that is unrecognized or for which range handling is not
+ defined. For this specification, GET is the only method for which
+ range handling is defined.
+
+ An origin server MUST ignore a Range header field that contains a
+ range unit it does not understand. A proxy MAY discard a Range
+ header field that contains a range unit it does not understand.
+
+ A server that supports range requests MAY ignore or reject a Range
+ header field that contains an invalid ranges-specifier
+ (Section 14.1.1), a ranges-specifier with more than two overlapping
+ ranges, or a set of many small ranges that are not listed in
+ ascending order, since these are indications of either a broken
+ client or a deliberate denial-of-service attack (Section 17.15). A
+ client SHOULD NOT request multiple ranges that are inherently less
+ efficient to process and transfer than a single range that
+ encompasses the same data.
+
+ A server that supports range requests MAY ignore a Range header field
+ when the selected representation has no content (i.e., the selected
+ representation's data is of zero length).
+
+ A client that is requesting multiple ranges SHOULD list those ranges
+ in ascending order (the order in which they would typically be
+ received in a complete representation) unless there is a specific
+ need to request a later part earlier. For example, a user agent
+ processing a large representation with an internal catalog of parts
+ might need to request later parts first, particularly if the
+ representation consists of pages stored in reverse order and the user
+ agent wishes to transfer one page at a time.
+
+ The Range header field is evaluated after evaluating the precondition
+ header fields defined in Section 13.1, and only if the result in
+ absence of the Range header field would be a 200 (OK) response. In
+ other words, Range is ignored when a conditional GET would result in
+ a 304 (Not Modified) response.
+
+ The If-Range header field (Section 13.1.5) can be used as a
+ precondition to applying the Range header field.
+
+ If all of the preconditions are true, the server supports the Range
+ header field for the target resource, the received Range field-value
+ contains a valid ranges-specifier with a range-unit supported for
+ that target resource, and that ranges-specifier is satisfiable with
+ respect to the selected representation, the server SHOULD send a 206
+ (Partial Content) response with content containing one or more
+ partial representations that correspond to the satisfiable
+ range-spec(s) requested.
+
+ The above does not imply that a server will send all requested
+ ranges. In some cases, it may only be possible (or efficient) to
+ send a portion of the requested ranges first, while expecting the
+ client to re-request the remaining portions later if they are still
+ desired (see Section 15.3.7).
+
+ If all of the preconditions are true, the server supports the Range
+ header field for the target resource, the received Range field-value
+ contains a valid ranges-specifier, and either the range-unit is not
+ supported for that target resource or the ranges-specifier is
+ unsatisfiable with respect to the selected representation, the server
+ SHOULD send a 416 (Range Not Satisfiable) response.
+
+14.3. Accept-Ranges
+
+ The "Accept-Ranges" field in a response indicates whether an upstream
+ server supports range requests for the target resource.
+
+ Accept-Ranges = acceptable-ranges
+ acceptable-ranges = 1#range-unit
+
+ For example, a server that supports byte-range requests
+ (Section 14.1.2) can send the field
+
+ Accept-Ranges: bytes
+
+ to indicate that it supports byte range requests for that target
+ resource, thereby encouraging its use by the client for future
+ partial requests on the same request path. Range units are defined
+ in Section 14.1.
+
+ A client MAY generate range requests regardless of having received an
+ Accept-Ranges field. The information only provides advice for the
+ sake of improving performance and reducing unnecessary network
+ transfers.
+
+ Conversely, a client MUST NOT assume that receiving an Accept-Ranges
+ field means that future range requests will return partial responses.
+ The content might change, the server might only support range
+ requests at certain times or under certain conditions, or a different
+ intermediary might process the next request.
+
+ A server that does not support any kind of range request for the
+ target resource MAY send
+
+ Accept-Ranges: none
+
+ to advise the client not to attempt a range request on the same
+ request path. The range unit "none" is reserved for this purpose.
+
+ The Accept-Ranges field MAY be sent in a trailer section, but is
+ preferred to be sent as a header field because the information is
+ particularly useful for restarting large information transfers that
+ have failed in mid-content (before the trailer section is received).
+
+14.4. Content-Range
+
+ The "Content-Range" header field is sent in a single part 206
+ (Partial Content) response to indicate the partial range of the
+ selected representation enclosed as the message content, sent in each
+ part of a multipart 206 response to indicate the range enclosed
+ within each body part (Section 14.6), and sent in 416 (Range Not
+ Satisfiable) responses to provide information about the selected
+ representation.
+
+ Content-Range = range-unit SP
+ ( range-resp / unsatisfied-range )
+
+ range-resp = incl-range "/" ( complete-length / "*" )
+ incl-range = first-pos "-" last-pos
+ unsatisfied-range = "*/" complete-length
+
+ complete-length = 1*DIGIT
+
+ If a 206 (Partial Content) response contains a Content-Range header
+ field with a range unit (Section 14.1) that the recipient does not
+ understand, the recipient MUST NOT attempt to recombine it with a
+ stored representation. A proxy that receives such a message SHOULD
+ forward it downstream.
+
+ Content-Range might also be sent as a request modifier to request a
+ partial PUT, as described in Section 14.5, based on private
+ agreements between client and origin server. A server MUST ignore a
+ Content-Range header field received in a request with a method for
+ which Content-Range support is not defined.
+
+ For byte ranges, a sender SHOULD indicate the complete length of the
+ representation from which the range has been extracted, unless the
+ complete length is unknown or difficult to determine. An asterisk
+ character ("*") in place of the complete-length indicates that the
+ representation length was unknown when the header field was
+ generated.
+
+ The following example illustrates when the complete length of the
+ selected representation is known by the sender to be 1234 bytes:
+
+ Content-Range: bytes 42-1233/1234
+
+ and this second example illustrates when the complete length is
+ unknown:
+
+ Content-Range: bytes 42-1233/*
+
+ A Content-Range field value is invalid if it contains a range-resp
+ that has a last-pos value less than its first-pos value, or a
+ complete-length value less than or equal to its last-pos value. The
+ recipient of an invalid Content-Range MUST NOT attempt to recombine
+ the received content with a stored representation.
+
+ A server generating a 416 (Range Not Satisfiable) response to a byte-
+ range request SHOULD send a Content-Range header field with an
+ unsatisfied-range value, as in the following example:
+
+ Content-Range: bytes */1234
+
+ The complete-length in a 416 response indicates the current length of
+ the selected representation.
+
+ The Content-Range header field has no meaning for status codes that
+ do not explicitly describe its semantic. For this specification,
+ only the 206 (Partial Content) and 416 (Range Not Satisfiable) status
+ codes describe a meaning for Content-Range.
+
+ The following are examples of Content-Range values in which the
+ selected representation contains a total of 1234 bytes:
+
+ * The first 500 bytes:
+
+ Content-Range: bytes 0-499/1234
+
+ * The second 500 bytes:
+
+ Content-Range: bytes 500-999/1234
+
+ * All except for the first 500 bytes:
+
+ Content-Range: bytes 500-1233/1234
+
+ * The last 500 bytes:
+
+ Content-Range: bytes 734-1233/1234
+
+14.5. Partial PUT
+
+ Some origin servers support PUT of a partial representation when the
+ user agent sends a Content-Range header field (Section 14.4) in the
+ request, though such support is inconsistent and depends on private
+ agreements with user agents. In general, it requests that the state
+ of the target resource be partly replaced with the enclosed content
+ at an offset and length indicated by the Content-Range value, where
+ the offset is relative to the current selected representation.
+
+ An origin server SHOULD respond with a 400 (Bad Request) status code
+ if it receives Content-Range on a PUT for a target resource that does
+ not support partial PUT requests.
+
+ Partial PUT is not backwards compatible with the original definition
+ of PUT. It may result in the content being written as a complete
+ replacement for the current representation.
+
+ Partial resource updates are also possible by targeting a separately
+ identified resource with state that overlaps or extends a portion of
+ the larger resource, or by using a different method that has been
+ specifically defined for partial updates (for example, the PATCH
+ method defined in [RFC5789]).
+
+14.6. Media Type multipart/byteranges
+
+ When a 206 (Partial Content) response message includes the content of
+ multiple ranges, they are transmitted as body parts in a multipart
+ message body ([RFC2046], Section 5.1) with the media type of
+ "multipart/byteranges".
+
+ The "multipart/byteranges" media type includes one or more body
+ parts, each with its own Content-Type and Content-Range fields. The
+ required boundary parameter specifies the boundary string used to
+ separate each body part.
+
+ Implementation Notes:
+
+ 1. Additional CRLFs might precede the first boundary string in the
+ body.
+
+ 2. Although [RFC2046] permits the boundary string to be quoted, some
+ existing implementations handle a quoted boundary string
+ incorrectly.
+
+ 3. A number of clients and servers were coded to an early draft of
+ the byteranges specification that used a media type of
+ "multipart/x-byteranges", which is almost (but not quite)
+ compatible with this type.
+
+ Despite the name, the "multipart/byteranges" media type is not
+ limited to byte ranges. The following example uses an "exampleunit"
+ range unit:
+
+ HTTP/1.1 206 Partial Content
+ Date: Tue, 14 Nov 1995 06:25:24 GMT
+ Last-Modified: Tue, 14 July 04:58:08 GMT
+ Content-Length: 2331785
+ Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-Type: video/example
+ Content-Range: exampleunit 1.2-4.3/25
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-Type: video/example
+ Content-Range: exampleunit 11.2-14.3/25
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ The following information serves as the registration form for the
+ "multipart/byteranges" media type.
+
+ Type name: multipart
+
+ Subtype name: byteranges
+
+ Required parameters: boundary
+
+ Optional parameters: N/A
+
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+
+ Security considerations: see Section 17
+
+ Interoperability considerations: N/A
+
+ Published specification: RFC 9110 (see Section 14.6)
+
+ Applications that use this media type: HTTP components supporting
+ multiple ranges in a single request
+
+ Fragment identifier considerations: N/A
+
+ Additional information: Deprecated alias names for this type: N/A
+
+ Magic number(s): N/A
+
+ File extension(s): N/A
+
+ Macintosh file type code(s): N/A
+
+ Person and email address to contact for further information: See Aut
+ hors' Addresses section.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: N/A
+
+ Author: See Authors' Addresses section.
+
+ Change controller: IESG
+
+15. Status Codes
+
+ The status code of a response is a three-digit integer code that
+ describes the result of the request and the semantics of the
+ response, including whether the request was successful and what
+ content is enclosed (if any). All valid status codes are within the
+ range of 100 to 599, inclusive.
+
+ The first digit of the status code defines the class of response.
+ The last two digits do not have any categorization role. There are
+ five values for the first digit:
+
+ * 1xx (Informational): The request was received, continuing process
+
+ * 2xx (Successful): The request was successfully received,
+ understood, and accepted
+
+ * 3xx (Redirection): Further action needs to be taken in order to
+ complete the request
+
+ * 4xx (Client Error): The request contains bad syntax or cannot be
+ fulfilled
+
+ * 5xx (Server Error): The server failed to fulfill an apparently
+ valid request
+
+ HTTP status codes are extensible. A client is not required to
+ understand the meaning of all registered status codes, though such
+ understanding is obviously desirable. However, a client MUST
+ understand the class of any status code, as indicated by the first
+ digit, and treat an unrecognized status code as being equivalent to
+ the x00 status code of that class.
+
+ For example, if a client receives an unrecognized status code of 471,
+ it can see from the first digit that there was something wrong with
+ its request and treat the response as if it had received a 400 (Bad
+ Request) status code. The response message will usually contain a
+ representation that explains the status.
+
+ Values outside the range 100..599 are invalid. Implementations often
+ use three-digit integer values outside of that range (i.e., 600..999)
+ for internal communication of non-HTTP status (e.g., library errors).
+ A client that receives a response with an invalid status code SHOULD
+ process the response as if it had a 5xx (Server Error) status code.
+
+ A single request can have multiple associated responses: zero or more
+ "interim" (non-final) responses with status codes in the
+ "informational" (1xx) range, followed by exactly one "final" response
+ with a status code in one of the other ranges.
+
+15.1. Overview of Status Codes
+
+ The status codes listed below are defined in this specification. The
+ reason phrases listed here are only recommendations -- they can be
+ replaced by local equivalents or left out altogether without
+ affecting the protocol.
+
+ Responses with status codes that are defined as heuristically
+ cacheable (e.g., 200, 203, 204, 206, 300, 301, 308, 404, 405, 410,
+ 414, and 501 in this specification) can be reused by a cache with
+ heuristic expiration unless otherwise indicated by the method
+ definition or explicit cache controls [CACHING]; all other status
+ codes are not heuristically cacheable.
+
+ Additional status codes, outside the scope of this specification,
+ have been specified for use in HTTP. All such status codes ought to
+ be registered within the "Hypertext Transfer Protocol (HTTP) Status
+ Code Registry", as described in Section 16.2.
+
+15.2. Informational 1xx
+
+ The 1xx (Informational) class of status code indicates an interim
+ response for communicating connection status or request progress
+ prior to completing the requested action and sending a final
+ response. Since HTTP/1.0 did not define any 1xx status codes, a
+ server MUST NOT send a 1xx response to an HTTP/1.0 client.
+
+ A 1xx response is terminated by the end of the header section; it
+ cannot contain content or trailers.
+
+ A client MUST be able to parse one or more 1xx responses received
+ prior to a final response, even if the client does not expect one. A
+ user agent MAY ignore unexpected 1xx responses.
+
+ A proxy MUST forward 1xx responses unless the proxy itself requested
+ the generation of the 1xx response. For example, if a proxy adds an
+ "Expect: 100-continue" header field when it forwards a request, then
+ it need not forward the corresponding 100 (Continue) response(s).
+
+15.2.1. 100 Continue
+
+ The 100 (Continue) status code indicates that the initial part of a
+ request has been received and has not yet been rejected by the
+ server. The server intends to send a final response after the
+ request has been fully received and acted upon.
+
+ When the request contains an Expect header field that includes a
+ 100-continue expectation, the 100 response indicates that the server
+ wishes to receive the request content, as described in
+ Section 10.1.1. The client ought to continue sending the request and
+ discard the 100 response.
+
+ If the request did not contain an Expect header field containing the
+ 100-continue expectation, the client can simply discard this interim
+ response.
+
+15.2.2. 101 Switching Protocols
+
+ The 101 (Switching Protocols) status code indicates that the server
+ understands and is willing to comply with the client's request, via
+ the Upgrade header field (Section 7.8), for a change in the
+ application protocol being used on this connection. The server MUST
+ generate an Upgrade header field in the response that indicates which
+ protocol(s) will be in effect after this response.
+
+ It is assumed that the server will only agree to switch protocols
+ when it is advantageous to do so. For example, switching to a newer
+ version of HTTP might be advantageous over older versions, and
+ switching to a real-time, synchronous protocol might be advantageous
+ when delivering resources that use such features.
+
+15.3. Successful 2xx
+
+ The 2xx (Successful) class of status code indicates that the client's
+ request was successfully received, understood, and accepted.
+
+15.3.1. 200 OK
+
+ The 200 (OK) status code indicates that the request has succeeded.
+ The content sent in a 200 response depends on the request method.
+ For the methods defined by this specification, the intended meaning
+ of the content can be summarized as:
+
+ +================+============================================+
+ | Request Method | Response content is a representation of: |
+ +================+============================================+
+ | GET | the target resource |
+ +----------------+--------------------------------------------+
+ | HEAD | the target resource, like GET, but without |
+ | | transferring the representation data |
+ +----------------+--------------------------------------------+
+ | POST | the status of, or results obtained from, |
+ | | the action |
+ +----------------+--------------------------------------------+
+ | PUT, DELETE | the status of the action |
+ +----------------+--------------------------------------------+
+ | OPTIONS | communication options for the target |
+ | | resource |
+ +----------------+--------------------------------------------+
+ | TRACE | the request message as received by the |
+ | | server returning the trace |
+ +----------------+--------------------------------------------+
+
+ Table 6
+
+ Aside from responses to CONNECT, a 200 response is expected to
+ contain message content unless the message framing explicitly
+ indicates that the content has zero length. If some aspect of the
+ request indicates a preference for no content upon success, the
+ origin server ought to send a 204 (No Content) response instead. For
+ CONNECT, there is no content because the successful result is a
+ tunnel, which begins immediately after the 200 response header
+ section.
+
+ A 200 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+ In 200 responses to GET or HEAD, an origin server SHOULD send any
+ available validator fields (Section 8.8) for the selected
+ representation, with both a strong entity tag and a Last-Modified
+ date being preferred.
+
+ In 200 responses to state-changing methods, any validator fields
+ (Section 8.8) sent in the response convey the current validators for
+ the new representation formed as a result of successfully applying
+ the request semantics. Note that the PUT method (Section 9.3.4) has
+ additional requirements that might preclude sending such validators.
+
+15.3.2. 201 Created
+
+ The 201 (Created) status code indicates that the request has been
+ fulfilled and has resulted in one or more new resources being
+ created. The primary resource created by the request is identified
+ by either a Location header field in the response or, if no Location
+ header field is received, by the target URI.
+
+ The 201 response content typically describes and links to the
+ resource(s) created. Any validator fields (Section 8.8) sent in the
+ response convey the current validators for a new representation
+ created by the request. Note that the PUT method (Section 9.3.4) has
+ additional requirements that might preclude sending such validators.
+
+15.3.3. 202 Accepted
+
+ The 202 (Accepted) status code indicates that the request has been
+ accepted for processing, but the processing has not been completed.
+ The request might or might not eventually be acted upon, as it might
+ be disallowed when processing actually takes place. There is no
+ facility in HTTP for re-sending a status code from an asynchronous
+ operation.
+
+ The 202 response is intentionally noncommittal. Its purpose is to
+ allow a server to accept a request for some other process (perhaps a
+ batch-oriented process that is only run once per day) without
+ requiring that the user agent's connection to the server persist
+ until the process is completed. The representation sent with this
+ response ought to describe the request's current status and point to
+ (or embed) a status monitor that can provide the user with an
+ estimate of when the request will be fulfilled.
+
+15.3.4. 203 Non-Authoritative Information
+
+ The 203 (Non-Authoritative Information) status code indicates that
+ the request was successful but the enclosed content has been modified
+ from that of the origin server's 200 (OK) response by a transforming
+ proxy (Section 7.7). This status code allows the proxy to notify
+ recipients when a transformation has been applied, since that
+ knowledge might impact later decisions regarding the content. For
+ example, future cache validation requests for the content might only
+ be applicable along the same request path (through the same proxies).
+
+ A 203 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.3.5. 204 No Content
+
+ The 204 (No Content) status code indicates that the server has
+ successfully fulfilled the request and that there is no additional
+ content to send in the response content. Metadata in the response
+ header fields refer to the target resource and its selected
+ representation after the requested action was applied.
+
+ For example, if a 204 status code is received in response to a PUT
+ request and the response contains an ETag field, then the PUT was
+ successful and the ETag field value contains the entity tag for the
+ new representation of that target resource.
+
+ The 204 response allows a server to indicate that the action has been
+ successfully applied to the target resource, while implying that the
+ user agent does not need to traverse away from its current "document
+ view" (if any). The server assumes that the user agent will provide
+ some indication of the success to its user, in accord with its own
+ interface, and apply any new or updated metadata in the response to
+ its active representation.
+
+ For example, a 204 status code is commonly used with document editing
+ interfaces corresponding to a "save" action, such that the document
+ being saved remains available to the user for editing. It is also
+ frequently used with interfaces that expect automated data transfers
+ to be prevalent, such as within distributed version control systems.
+
+ A 204 response is terminated by the end of the header section; it
+ cannot contain content or trailers.
+
+ A 204 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.3.6. 205 Reset Content
+
+ The 205 (Reset Content) status code indicates that the server has
+ fulfilled the request and desires that the user agent reset the
+ "document view", which caused the request to be sent, to its original
+ state as received from the origin server.
+
+ This response is intended to support a common data entry use case
+ where the user receives content that supports data entry (a form,
+ notepad, canvas, etc.), enters or manipulates data in that space,
+ causes the entered data to be submitted in a request, and then the
+ data entry mechanism is reset for the next entry so that the user can
+ easily initiate another input action.
+
+ Since the 205 status code implies that no additional content will be
+ provided, a server MUST NOT generate content in a 205 response.
+
+15.3.7. 206 Partial Content
+
+ The 206 (Partial Content) status code indicates that the server is
+ successfully fulfilling a range request for the target resource by
+ transferring one or more parts of the selected representation.
+
+ A server that supports range requests (Section 14) will usually
+ attempt to satisfy all of the requested ranges, since sending less
+ data will likely result in another client request for the remainder.
+ However, a server might want to send only a subset of the data
+ requested for reasons of its own, such as temporary unavailability,
+ cache efficiency, load balancing, etc. Since a 206 response is self-
+ descriptive, the client can still understand a response that only
+ partially satisfies its range request.
+
+ A client MUST inspect a 206 response's Content-Type and Content-Range
+ field(s) to determine what parts are enclosed and whether additional
+ requests are needed.
+
+ A server that generates a 206 response MUST generate the following
+ header fields, in addition to those required in the subsections
+ below, if the field would have been sent in a 200 (OK) response to
+ the same request: Date, Cache-Control, ETag, Expires,
+ Content-Location, and Vary.
+
+ A Content-Length header field present in a 206 response indicates the
+ number of octets in the content of this message, which is usually not
+ the complete length of the selected representation. Each
+ Content-Range header field includes information about the selected
+ representation's complete length.
+
+ A sender that generates a 206 response to a request with an If-Range
+ header field SHOULD NOT generate other representation header fields
+ beyond those required because the client already has a prior response
+ containing those header fields. Otherwise, a sender MUST generate
+ all of the representation header fields that would have been sent in
+ a 200 (OK) response to the same request.
+
+ A 206 response is heuristically cacheable; i.e., unless otherwise
+ indicated by explicit cache controls (see Section 4.2.2 of
+ [CACHING]).
+
+15.3.7.1. Single Part
+
+ If a single part is being transferred, the server generating the 206
+ response MUST generate a Content-Range header field, describing what
+ range of the selected representation is enclosed, and a content
+ consisting of the range. For example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-Range: bytes 21010-47021/47022
+ Content-Length: 26012
+ Content-Type: image/gif
+
+ ... 26012 bytes of partial image data ...
+
+15.3.7.2. Multiple Parts
+
+ If multiple parts are being transferred, the server generating the
+ 206 response MUST generate "multipart/byteranges" content, as defined
+ in Section 14.6, and a Content-Type header field containing the
+ "multipart/byteranges" media type and its required boundary
+ parameter. To avoid confusion with single-part responses, a server
+ MUST NOT generate a Content-Range header field in the HTTP header
+ section of a multiple part response (this field will be sent in each
+ part instead).
+
+ Within the header area of each body part in the multipart content,
+ the server MUST generate a Content-Range header field corresponding
+ to the range being enclosed in that body part. If the selected
+ representation would have had a Content-Type header field in a 200
+ (OK) response, the server SHOULD generate that same Content-Type
+ header field in the header area of each body part. For example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-Length: 1741
+ Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-Type: application/pdf
+ Content-Range: bytes 500-999/8000
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-Type: application/pdf
+ Content-Range: bytes 7000-7999/8000
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ When multiple ranges are requested, a server MAY coalesce any of the
+ ranges that overlap, or that are separated by a gap that is smaller
+ than the overhead of sending multiple parts, regardless of the order
+ in which the corresponding range-spec appeared in the received Range
+ header field. Since the typical overhead between each part of a
+ "multipart/byteranges" is around 80 bytes, depending on the selected
+ representation's media type and the chosen boundary parameter length,
+ it can be less efficient to transfer many small disjoint parts than
+ it is to transfer the entire selected representation.
+
+ A server MUST NOT generate a multipart response to a request for a
+ single range, since a client that does not request multiple parts
+ might not support multipart responses. However, a server MAY
+ generate a "multipart/byteranges" response with only a single body
+ part if multiple ranges were requested and only one range was found
+ to be satisfiable or only one range remained after coalescing. A
+ client that cannot process a "multipart/byteranges" response MUST NOT
+ generate a request that asks for multiple ranges.
+
+ A server that generates a multipart response SHOULD send the parts in
+ the same order that the corresponding range-spec appeared in the
+ received Range header field, excluding those ranges that were deemed
+ unsatisfiable or that were coalesced into other ranges. A client
+ that receives a multipart response MUST inspect the Content-Range
+ header field present in each body part in order to determine which
+ range is contained in that body part; a client cannot rely on
+ receiving the same ranges that it requested, nor the same order that
+ it requested.
+
+15.3.7.3. Combining Parts
+
+ A response might transfer only a subrange of a representation if the
+ connection closed prematurely or if the request used one or more
+ Range specifications. After several such transfers, a client might
+ have received several ranges of the same representation. These
+ ranges can only be safely combined if they all have in common the
+ same strong validator (Section 8.8.1).
+
+ A client that has received multiple partial responses to GET requests
+ on a target resource MAY combine those responses into a larger
+ continuous range if they share the same strong validator.
+
+ If the most recent response is an incomplete 200 (OK) response, then
+ the header fields of that response are used for any combined response
+ and replace those of the matching stored responses.
+
+ If the most recent response is a 206 (Partial Content) response and
+ at least one of the matching stored responses is a 200 (OK), then the
+ combined response header fields consist of the most recent 200
+ response's header fields. If all of the matching stored responses
+ are 206 responses, then the stored response with the most recent
+ header fields is used as the source of header fields for the combined
+ response, except that the client MUST use other header fields
+ provided in the new response, aside from Content-Range, to replace
+ all instances of the corresponding header fields in the stored
+ response.
+
+ The combined response content consists of the union of partial
+ content ranges within the new response and all of the matching stored
+ responses. If the union consists of the entire range of the
+ representation, then the client MUST process the combined response as
+ if it were a complete 200 (OK) response, including a Content-Length
+ header field that reflects the complete length. Otherwise, the
+ client MUST process the set of continuous ranges as one of the
+ following: an incomplete 200 (OK) response if the combined response
+ is a prefix of the representation, a single 206 (Partial Content)
+ response containing "multipart/byteranges" content, or multiple 206
+ (Partial Content) responses, each with one continuous range that is
+ indicated by a Content-Range header field.
+
+15.4. Redirection 3xx
+
+ The 3xx (Redirection) class of status code indicates that further
+ action needs to be taken by the user agent in order to fulfill the
+ request. There are several types of redirects:
+
+ 1. Redirects that indicate this resource might be available at a
+ different URI, as provided by the Location header field, as in
+ the status codes 301 (Moved Permanently), 302 (Found), 307
+ (Temporary Redirect), and 308 (Permanent Redirect).
+
+ 2. Redirection that offers a choice among matching resources capable
+ of representing this resource, as in the 300 (Multiple Choices)
+ status code.
+
+ 3. Redirection to a different resource, identified by the Location
+ header field, that can represent an indirect response to the
+ request, as in the 303 (See Other) status code.
+
+ 4. Redirection to a previously stored result, as in the 304 (Not
+ Modified) status code.
+
+ | *Note:* In HTTP/1.0, the status codes 301 (Moved Permanently)
+ | and 302 (Found) were originally defined as method-preserving
+ | ([HTTP/1.0], Section 9.3) to match their implementation at
+ | CERN; 303 (See Other) was defined for a redirection that
+ | changed its method to GET. However, early user agents split on
+ | whether to redirect POST requests as POST (according to then-
+ | current specification) or as GET (the safer alternative when
+ | redirected to a different site). Prevailing practice
+ | eventually converged on changing the method to GET. 307
+ | (Temporary Redirect) and 308 (Permanent Redirect) [RFC7538]
+ | were later added to unambiguously indicate method-preserving
+ | redirects, and status codes 301 and 302 have been adjusted to
+ | allow a POST request to be redirected as GET.
+
+ If a Location header field (Section 10.2.2) is provided, the user
+ agent MAY automatically redirect its request to the URI referenced by
+ the Location field value, even if the specific status code is not
+ understood. Automatic redirection needs to be done with care for
+ methods not known to be safe, as defined in Section 9.2.1, since the
+ user might not wish to redirect an unsafe request.
+
+ When automatically following a redirected request, the user agent
+ SHOULD resend the original request message with the following
+ modifications:
+
+ 1. Replace the target URI with the URI referenced by the redirection
+ response's Location header field value after resolving it
+ relative to the original request's target URI.
+
+ 2. Remove header fields that were automatically generated by the
+ implementation, replacing them with updated values as appropriate
+ to the new request. This includes:
+
+ 1. Connection-specific header fields (see Section 7.6.1),
+
+ 2. Header fields specific to the client's proxy configuration,
+ including (but not limited to) Proxy-Authorization,
+
+ 3. Origin-specific header fields (if any), including (but not
+ limited to) Host,
+
+ 4. Validating header fields that were added by the
+ implementation's cache (e.g., If-None-Match,
+ If-Modified-Since), and
+
+ 5. Resource-specific header fields, including (but not limited
+ to) Referer, Origin, Authorization, and Cookie.
+
+ 3. Consider removing header fields that were not automatically
+ generated by the implementation (i.e., those present in the
+ request because they were added by the calling context) where
+ there are security implications; this includes but is not limited
+ to Authorization and Cookie.
+
+ 4. Change the request method according to the redirecting status
+ code's semantics, if applicable.
+
+ 5. If the request method has been changed to GET or HEAD, remove
+ content-specific header fields, including (but not limited to)
+ Content-Encoding, Content-Language, Content-Location,
+ Content-Type, Content-Length, Digest, Last-Modified.
+
+ A client SHOULD detect and intervene in cyclical redirections (i.e.,
+ "infinite" redirection loops).
+
+ | *Note:* An earlier version of this specification recommended a
+ | maximum of five redirections ([RFC2068], Section 10.3).
+ | Content developers need to be aware that some clients might
+ | implement such a fixed limitation.
+
+15.4.1. 300 Multiple Choices
+
+ The 300 (Multiple Choices) status code indicates that the target
+ resource has more than one representation, each with its own more
+ specific identifier, and information about the alternatives is being
+ provided so that the user (or user agent) can select a preferred
+ representation by redirecting its request to one or more of those
+ identifiers. In other words, the server desires that the user agent
+ engage in reactive negotiation to select the most appropriate
+ representation(s) for its needs (Section 12).
+
+ If the server has a preferred choice, the server SHOULD generate a
+ Location header field containing a preferred choice's URI reference.
+ The user agent MAY use the Location field value for automatic
+ redirection.
+
+ For request methods other than HEAD, the server SHOULD generate
+ content in the 300 response containing a list of representation
+ metadata and URI reference(s) from which the user or user agent can
+ choose the one most preferred. The user agent MAY make a selection
+ from that list automatically if it understands the provided media
+ type. A specific format for automatic selection is not defined by
+ this specification because HTTP tries to remain orthogonal to the
+ definition of its content. In practice, the representation is
+ provided in some easily parsed format believed to be acceptable to
+ the user agent, as determined by shared design or content
+ negotiation, or in some commonly accepted hypertext format.
+
+ A 300 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+ | *Note:* The original proposal for the 300 status code defined
+ | the URI header field as providing a list of alternative
+ | representations, such that it would be usable for 200, 300, and
+ | 406 responses and be transferred in responses to the HEAD
+ | method. However, lack of deployment and disagreement over
+ | syntax led to both URI and Alternates (a subsequent proposal)
+ | being dropped from this specification. It is possible to
+ | communicate the list as a Link header field value [RFC8288]
+ | whose members have a relationship of "alternate", though
+ | deployment is a chicken-and-egg problem.
+
+15.4.2. 301 Moved Permanently
+
+ The 301 (Moved Permanently) status code indicates that the target
+ resource has been assigned a new permanent URI and any future
+ references to this resource ought to use one of the enclosed URIs.
+ The server is suggesting that a user agent with link-editing
+ capability can permanently replace references to the target URI with
+ one of the new references sent by the server. However, this
+ suggestion is usually ignored unless the user agent is actively
+ editing references (e.g., engaged in authoring content), the
+ connection is secured, and the origin server is a trusted authority
+ for the content being edited.
+
+ The server SHOULD generate a Location header field in the response
+ containing a preferred URI reference for the new permanent URI. The
+ user agent MAY use the Location field value for automatic
+ redirection. The server's response content usually contains a short
+ hypertext note with a hyperlink to the new URI(s).
+
+ | *Note:* For historical reasons, a user agent MAY change the
+ | request method from POST to GET for the subsequent request. If
+ | this behavior is undesired, the 308 (Permanent Redirect) status
+ | code can be used instead.
+
+ A 301 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.4.3. 302 Found
+
+ The 302 (Found) status code indicates that the target resource
+ resides temporarily under a different URI. Since the redirection
+ might be altered on occasion, the client ought to continue to use the
+ target URI for future requests.
+
+ The server SHOULD generate a Location header field in the response
+ containing a URI reference for the different URI. The user agent MAY
+ use the Location field value for automatic redirection. The server's
+ response content usually contains a short hypertext note with a
+ hyperlink to the different URI(s).
+
+ | *Note:* For historical reasons, a user agent MAY change the
+ | request method from POST to GET for the subsequent request. If
+ | this behavior is undesired, the 307 (Temporary Redirect) status
+ | code can be used instead.
+
+15.4.4. 303 See Other
+
+ The 303 (See Other) status code indicates that the server is
+ redirecting the user agent to a different resource, as indicated by a
+ URI in the Location header field, which is intended to provide an
+ indirect response to the original request. A user agent can perform
+ a retrieval request targeting that URI (a GET or HEAD request if
+ using HTTP), which might also be redirected, and present the eventual
+ result as an answer to the original request. Note that the new URI
+ in the Location header field is not considered equivalent to the
+ target URI.
+
+ This status code is applicable to any HTTP method. It is primarily
+ used to allow the output of a POST action to redirect the user agent
+ to a different resource, since doing so provides the information
+ corresponding to the POST response as a resource that can be
+ separately identified, bookmarked, and cached.
+
+ A 303 response to a GET request indicates that the origin server does
+ not have a representation of the target resource that can be
+ transferred by the server over HTTP. However, the Location field
+ value refers to a resource that is descriptive of the target
+ resource, such that making a retrieval request on that other resource
+ might result in a representation that is useful to recipients without
+ implying that it represents the original target resource. Note that
+ answers to the questions of what can be represented, what
+ representations are adequate, and what might be a useful description
+ are outside the scope of HTTP.
+
+ Except for responses to a HEAD request, the representation of a 303
+ response ought to contain a short hypertext note with a hyperlink to
+ the same URI reference provided in the Location header field.
+
+15.4.5. 304 Not Modified
+
+ The 304 (Not Modified) status code indicates that a conditional GET
+ or HEAD request has been received and would have resulted in a 200
+ (OK) response if it were not for the fact that the condition
+ evaluated to false. In other words, there is no need for the server
+ to transfer a representation of the target resource because the
+ request indicates that the client, which made the request
+ conditional, already has a valid representation; the server is
+ therefore redirecting the client to make use of that stored
+ representation as if it were the content of a 200 (OK) response.
+
+ The server generating a 304 response MUST generate any of the
+ following header fields that would have been sent in a 200 (OK)
+ response to the same request:
+
+ * Content-Location, Date, ETag, and Vary
+
+ * Cache-Control and Expires (see [CACHING])
+
+ Since the goal of a 304 response is to minimize information transfer
+ when the recipient already has one or more cached representations, a
+ sender SHOULD NOT generate representation metadata other than the
+ above listed fields unless said metadata exists for the purpose of
+ guiding cache updates (e.g., Last-Modified might be useful if the
+ response does not have an ETag field).
+
+ Requirements on a cache that receives a 304 response are defined in
+ Section 4.3.4 of [CACHING]. If the conditional request originated
+ with an outbound client, such as a user agent with its own cache
+ sending a conditional GET to a shared proxy, then the proxy SHOULD
+ forward the 304 response to that client.
+
+ A 304 response is terminated by the end of the header section; it
+ cannot contain content or trailers.
+
+15.4.6. 305 Use Proxy
+
+ The 305 (Use Proxy) status code was defined in a previous version of
+ this specification and is now deprecated (Appendix B of [RFC7231]).
+
+15.4.7. 306 (Unused)
+
+ The 306 status code was defined in a previous version of this
+ specification, is no longer used, and the code is reserved.
+
+15.4.8. 307 Temporary Redirect
+
+ The 307 (Temporary Redirect) status code indicates that the target
+ resource resides temporarily under a different URI and the user agent
+ MUST NOT change the request method if it performs an automatic
+ redirection to that URI. Since the redirection can change over time,
+ the client ought to continue using the original target URI for future
+ requests.
+
+ The server SHOULD generate a Location header field in the response
+ containing a URI reference for the different URI. The user agent MAY
+ use the Location field value for automatic redirection. The server's
+ response content usually contains a short hypertext note with a
+ hyperlink to the different URI(s).
+
+15.4.9. 308 Permanent Redirect
+
+ The 308 (Permanent Redirect) status code indicates that the target
+ resource has been assigned a new permanent URI and any future
+ references to this resource ought to use one of the enclosed URIs.
+ The server is suggesting that a user agent with link-editing
+ capability can permanently replace references to the target URI with
+ one of the new references sent by the server. However, this
+ suggestion is usually ignored unless the user agent is actively
+ editing references (e.g., engaged in authoring content), the
+ connection is secured, and the origin server is a trusted authority
+ for the content being edited.
+
+ The server SHOULD generate a Location header field in the response
+ containing a preferred URI reference for the new permanent URI. The
+ user agent MAY use the Location field value for automatic
+ redirection. The server's response content usually contains a short
+ hypertext note with a hyperlink to the new URI(s).
+
+ A 308 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+ | *Note:* This status code is much younger (June 2014) than its
+ | sibling codes and thus might not be recognized everywhere. See
+ | Section 4 of [RFC7538] for deployment considerations.
+
+15.5. Client Error 4xx
+
+ The 4xx (Client Error) class of status code indicates that the client
+ seems to have erred. Except when responding to a HEAD request, the
+ server SHOULD send a representation containing an explanation of the
+ error situation, and whether it is a temporary or permanent
+ condition. These status codes are applicable to any request method.
+ User agents SHOULD display any included representation to the user.
+
+15.5.1. 400 Bad Request
+
+ The 400 (Bad Request) status code indicates that the server cannot or
+ will not process the request due to something that is perceived to be
+ a client error (e.g., malformed request syntax, invalid request
+ message framing, or deceptive request routing).
+
+15.5.2. 401 Unauthorized
+
+ The 401 (Unauthorized) status code indicates that the request has not
+ been applied because it lacks valid authentication credentials for
+ the target resource. The server generating a 401 response MUST send
+ a WWW-Authenticate header field (Section 11.6.1) containing at least
+ one challenge applicable to the target resource.
+
+ If the request included authentication credentials, then the 401
+ response indicates that authorization has been refused for those
+ credentials. The user agent MAY repeat the request with a new or
+ replaced Authorization header field (Section 11.6.2). If the 401
+ response contains the same challenge as the prior response, and the
+ user agent has already attempted authentication at least once, then
+ the user agent SHOULD present the enclosed representation to the
+ user, since it usually contains relevant diagnostic information.
+
+15.5.3. 402 Payment Required
+
+ The 402 (Payment Required) status code is reserved for future use.
+
+15.5.4. 403 Forbidden
+
+ The 403 (Forbidden) status code indicates that the server understood
+ the request but refuses to fulfill it. A server that wishes to make
+ public why the request has been forbidden can describe that reason in
+ the response content (if any).
+
+ If authentication credentials were provided in the request, the
+ server considers them insufficient to grant access. The client
+ SHOULD NOT automatically repeat the request with the same
+ credentials. The client MAY repeat the request with new or different
+ credentials. However, a request might be forbidden for reasons
+ unrelated to the credentials.
+
+ An origin server that wishes to "hide" the current existence of a
+ forbidden target resource MAY instead respond with a status code of
+ 404 (Not Found).
+
+15.5.5. 404 Not Found
+
+ The 404 (Not Found) status code indicates that the origin server did
+ not find a current representation for the target resource or is not
+ willing to disclose that one exists. A 404 status code does not
+ indicate whether this lack of representation is temporary or
+ permanent; the 410 (Gone) status code is preferred over 404 if the
+ origin server knows, presumably through some configurable means, that
+ the condition is likely to be permanent.
+
+ A 404 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.5.6. 405 Method Not Allowed
+
+ The 405 (Method Not Allowed) status code indicates that the method
+ received in the request-line is known by the origin server but not
+ supported by the target resource. The origin server MUST generate an
+ Allow header field in a 405 response containing a list of the target
+ resource's currently supported methods.
+
+ A 405 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.5.7. 406 Not Acceptable
+
+ The 406 (Not Acceptable) status code indicates that the target
+ resource does not have a current representation that would be
+ acceptable to the user agent, according to the proactive negotiation
+ header fields received in the request (Section 12.1), and the server
+ is unwilling to supply a default representation.
+
+ The server SHOULD generate content containing a list of available
+ representation characteristics and corresponding resource identifiers
+ from which the user or user agent can choose the one most
+ appropriate. A user agent MAY automatically select the most
+ appropriate choice from that list. However, this specification does
+ not define any standard for such automatic selection, as described in
+ Section 15.4.1.
+
+15.5.8. 407 Proxy Authentication Required
+
+ The 407 (Proxy Authentication Required) status code is similar to 401
+ (Unauthorized), but it indicates that the client needs to
+ authenticate itself in order to use a proxy for this request. The
+ proxy MUST send a Proxy-Authenticate header field (Section 11.7.1)
+ containing a challenge applicable to that proxy for the request. The
+ client MAY repeat the request with a new or replaced
+ Proxy-Authorization header field (Section 11.7.2).
+
+15.5.9. 408 Request Timeout
+
+ The 408 (Request Timeout) status code indicates that the server did
+ not receive a complete request message within the time that it was
+ prepared to wait.
+
+ If the client has an outstanding request in transit, it MAY repeat
+ that request. If the current connection is not usable (e.g., as it
+ would be in HTTP/1.1 because request delimitation is lost), a new
+ connection will be used.
+
+15.5.10. 409 Conflict
+
+ The 409 (Conflict) status code indicates that the request could not
+ be completed due to a conflict with the current state of the target
+ resource. This code is used in situations where the user might be
+ able to resolve the conflict and resubmit the request. The server
+ SHOULD generate content that includes enough information for a user
+ to recognize the source of the conflict.
+
+ Conflicts are most likely to occur in response to a PUT request. For
+ example, if versioning were being used and the representation being
+ PUT included changes to a resource that conflict with those made by
+ an earlier (third-party) request, the origin server might use a 409
+ response to indicate that it can't complete the request. In this
+ case, the response representation would likely contain information
+ useful for merging the differences based on the revision history.
+
+15.5.11. 410 Gone
+
+ The 410 (Gone) status code indicates that access to the target
+ resource is no longer available at the origin server and that this
+ condition is likely to be permanent. If the origin server does not
+ know, or has no facility to determine, whether or not the condition
+ is permanent, the status code 404 (Not Found) ought to be used
+ instead.
+
+ The 410 response is primarily intended to assist the task of web
+ maintenance by notifying the recipient that the resource is
+ intentionally unavailable and that the server owners desire that
+ remote links to that resource be removed. Such an event is common
+ for limited-time, promotional services and for resources belonging to
+ individuals no longer associated with the origin server's site. It
+ is not necessary to mark all permanently unavailable resources as
+ "gone" or to keep the mark for any length of time -- that is left to
+ the discretion of the server owner.
+
+ A 410 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.5.12. 411 Length Required
+
+ The 411 (Length Required) status code indicates that the server
+ refuses to accept the request without a defined Content-Length
+ (Section 8.6). The client MAY repeat the request if it adds a valid
+ Content-Length header field containing the length of the request
+ content.
+
+15.5.13. 412 Precondition Failed
+
+ The 412 (Precondition Failed) status code indicates that one or more
+ conditions given in the request header fields evaluated to false when
+ tested on the server (Section 13). This response status code allows
+ the client to place preconditions on the current resource state (its
+ current representations and metadata) and, thus, prevent the request
+ method from being applied if the target resource is in an unexpected
+ state.
+
+15.5.14. 413 Content Too Large
+
+ The 413 (Content Too Large) status code indicates that the server is
+ refusing to process a request because the request content is larger
+ than the server is willing or able to process. The server MAY
+ terminate the request, if the protocol version in use allows it;
+ otherwise, the server MAY close the connection.
+
+ If the condition is temporary, the server SHOULD generate a
+ Retry-After header field to indicate that it is temporary and after
+ what time the client MAY try again.
+
+15.5.15. 414 URI Too Long
+
+ The 414 (URI Too Long) status code indicates that the server is
+ refusing to service the request because the target URI is longer than
+ the server is willing to interpret. This rare condition is only
+ likely to occur when a client has improperly converted a POST request
+ to a GET request with long query information, when the client has
+ descended into an infinite loop of redirection (e.g., a redirected
+ URI prefix that points to a suffix of itself) or when the server is
+ under attack by a client attempting to exploit potential security
+ holes.
+
+ A 414 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.5.16. 415 Unsupported Media Type
+
+ The 415 (Unsupported Media Type) status code indicates that the
+ origin server is refusing to service the request because the content
+ is in a format not supported by this method on the target resource.
+
+ The format problem might be due to the request's indicated
+ Content-Type or Content-Encoding, or as a result of inspecting the
+ data directly.
+
+ If the problem was caused by an unsupported content coding, the
+ Accept-Encoding response header field (Section 12.5.3) ought to be
+ used to indicate which (if any) content codings would have been
+ accepted in the request.
+
+ On the other hand, if the cause was an unsupported media type, the
+ Accept response header field (Section 12.5.1) can be used to indicate
+ which media types would have been accepted in the request.
+
+15.5.17. 416 Range Not Satisfiable
+
+ The 416 (Range Not Satisfiable) status code indicates that the set of
+ ranges in the request's Range header field (Section 14.2) has been
+ rejected either because none of the requested ranges are satisfiable
+ or because the client has requested an excessive number of small or
+ overlapping ranges (a potential denial of service attack).
+
+ Each range unit defines what is required for its own range sets to be
+ satisfiable. For example, Section 14.1.2 defines what makes a bytes
+ range set satisfiable.
+
+ A server that generates a 416 response to a byte-range request SHOULD
+ generate a Content-Range header field specifying the current length
+ of the selected representation (Section 14.4).
+
+ For example:
+
+ HTTP/1.1 416 Range Not Satisfiable
+ Date: Fri, 20 Jan 2012 15:41:54 GMT
+ Content-Range: bytes */47022
+
+ | *Note:* Because servers are free to ignore Range, many
+ | implementations will respond with the entire selected
+ | representation in a 200 (OK) response. That is partly because
+ | most clients are prepared to receive a 200 (OK) to complete the
+ | task (albeit less efficiently) and partly because clients might
+ | not stop making an invalid range request until they have
+ | received a complete representation. Thus, clients cannot
+ | depend on receiving a 416 (Range Not Satisfiable) response even
+ | when it is most appropriate.
+
+15.5.18. 417 Expectation Failed
+
+ The 417 (Expectation Failed) status code indicates that the
+ expectation given in the request's Expect header field
+ (Section 10.1.1) could not be met by at least one of the inbound
+ servers.
+
+15.5.19. 418 (Unused)
+
+ [RFC2324] was an April 1 RFC that lampooned the various ways HTTP was
+ abused; one such abuse was the definition of an application-specific
+ 418 status code, which has been deployed as a joke often enough for
+ the code to be unusable for any future use.
+
+ Therefore, the 418 status code is reserved in the IANA HTTP Status
+ Code Registry. This indicates that the status code cannot be
+ assigned to other applications currently. If future circumstances
+ require its use (e.g., exhaustion of 4NN status codes), it can be re-
+ assigned to another use.
+
+15.5.20. 421 Misdirected Request
+
+ The 421 (Misdirected Request) status code indicates that the request
+ was directed at a server that is unable or unwilling to produce an
+ authoritative response for the target URI. An origin server (or
+ gateway acting on behalf of the origin server) sends 421 to reject a
+ target URI that does not match an origin for which the server has
+ been configured (Section 4.3.1) or does not match the connection
+ context over which the request was received (Section 7.4).
+
+ A client that receives a 421 (Misdirected Request) response MAY retry
+ the request, whether or not the request method is idempotent, over a
+ different connection, such as a fresh connection specific to the
+ target resource's origin, or via an alternative service [ALTSVC].
+
+ A proxy MUST NOT generate a 421 response.
+
+15.5.21. 422 Unprocessable Content
+
+ The 422 (Unprocessable Content) status code indicates that the server
+ understands the content type of the request content (hence a 415
+ (Unsupported Media Type) status code is inappropriate), and the
+ syntax of the request content is correct, but it was unable to
+ process the contained instructions. For example, this status code
+ can be sent if an XML request content contains well-formed (i.e.,
+ syntactically correct), but semantically erroneous XML instructions.
+
+15.5.22. 426 Upgrade Required
+
+ The 426 (Upgrade Required) status code indicates that the server
+ refuses to perform the request using the current protocol but might
+ be willing to do so after the client upgrades to a different
+ protocol. The server MUST send an Upgrade header field in a 426
+ response to indicate the required protocol(s) (Section 7.8).
+
+ Example:
+
+ HTTP/1.1 426 Upgrade Required
+ Upgrade: HTTP/3.0
+ Connection: Upgrade
+ Content-Length: 53
+ Content-Type: text/plain
+
+ This service requires use of the HTTP/3.0 protocol.
+
+15.6. Server Error 5xx
+
+ The 5xx (Server Error) class of status code indicates that the server
+ is aware that it has erred or is incapable of performing the
+ requested method. Except when responding to a HEAD request, the
+ server SHOULD send a representation containing an explanation of the
+ error situation, and whether it is a temporary or permanent
+ condition. A user agent SHOULD display any included representation
+ to the user. These status codes are applicable to any request
+ method.
+
+15.6.1. 500 Internal Server Error
+
+ The 500 (Internal Server Error) status code indicates that the server
+ encountered an unexpected condition that prevented it from fulfilling
+ the request.
+
+15.6.2. 501 Not Implemented
+
+ The 501 (Not Implemented) status code indicates that the server does
+ not support the functionality required to fulfill the request. This
+ is the appropriate response when the server does not recognize the
+ request method and is not capable of supporting it for any resource.
+
+ A 501 response is heuristically cacheable; i.e., unless otherwise
+ indicated by the method definition or explicit cache controls (see
+ Section 4.2.2 of [CACHING]).
+
+15.6.3. 502 Bad Gateway
+
+ The 502 (Bad Gateway) status code indicates that the server, while
+ acting as a gateway or proxy, received an invalid response from an
+ inbound server it accessed while attempting to fulfill the request.
+
+15.6.4. 503 Service Unavailable
+
+ The 503 (Service Unavailable) status code indicates that the server
+ is currently unable to handle the request due to a temporary overload
+ or scheduled maintenance, which will likely be alleviated after some
+ delay. The server MAY send a Retry-After header field
+ (Section 10.2.3) to suggest an appropriate amount of time for the
+ client to wait before retrying the request.
+
+ | *Note:* The existence of the 503 status code does not imply
+ | that a server has to use it when becoming overloaded. Some
+ | servers might simply refuse the connection.
+
+15.6.5. 504 Gateway Timeout
+
+ The 504 (Gateway Timeout) status code indicates that the server,
+ while acting as a gateway or proxy, did not receive a timely response
+ from an upstream server it needed to access in order to complete the
+ request.
+
+15.6.6. 505 HTTP Version Not Supported
+
+ The 505 (HTTP Version Not Supported) status code indicates that the
+ server does not support, or refuses to support, the major version of
+ HTTP that was used in the request message. The server is indicating
+ that it is unable or unwilling to complete the request using the same
+ major version as the client, as described in Section 2.5, other than
+ with this error message. The server SHOULD generate a representation
+ for the 505 response that describes why that version is not supported
+ and what other protocols are supported by that server.
+
+16. Extending HTTP
+
+ HTTP defines a number of generic extension points that can be used to
+ introduce capabilities to the protocol without introducing a new
+ version, including methods, status codes, field names, and further
+ extensibility points within defined fields, such as authentication
+ schemes and cache directives (see Cache-Control extensions in
+ Section 5.2.3 of [CACHING]). Because the semantics of HTTP are not
+ versioned, these extension points are persistent; the version of the
+ protocol in use does not affect their semantics.
+
+ Version-independent extensions are discouraged from depending on or
+ interacting with the specific version of the protocol in use. When
+ this is unavoidable, careful consideration needs to be given to how
+ the extension can interoperate across versions.
+
+ Additionally, specific versions of HTTP might have their own
+ extensibility points, such as transfer codings in HTTP/1.1
+ (Section 6.1 of [HTTP/1.1]) and HTTP/2 SETTINGS or frame types
+ ([HTTP/2]). These extension points are specific to the version of
+ the protocol they occur within.
+
+ Version-specific extensions cannot override or modify the semantics
+ of a version-independent mechanism or extension point (like a method
+ or header field) without explicitly being allowed by that protocol
+ element. For example, the CONNECT method (Section 9.3.6) allows
+ this.
+
+ These guidelines assure that the protocol operates correctly and
+ predictably, even when parts of the path implement different versions
+ of HTTP.
+
+16.1. Method Extensibility
+
+16.1.1. Method Registry
+
+ The "Hypertext Transfer Protocol (HTTP) Method Registry", maintained
+ by IANA at <https://www.iana.org/assignments/http-methods>, registers
+ method names.
+
+ HTTP method registrations MUST include the following fields:
+
+ * Method Name (see Section 9)
+
+ * Safe ("yes" or "no", see Section 9.2.1)
+
+ * Idempotent ("yes" or "no", see Section 9.2.2)
+
+ * Pointer to specification text
+
+ Values to be added to this namespace require IETF Review (see
+ [RFC8126], Section 4.8).
+
+16.1.2. Considerations for New Methods
+
+ Standardized methods are generic; that is, they are potentially
+ applicable to any resource, not just one particular media type, kind
+ of resource, or application. As such, it is preferred that new
+ methods be registered in a document that isn't specific to a single
+ application or data format, since orthogonal technologies deserve
+ orthogonal specification.
+
+ Since message parsing (Section 6) needs to be independent of method
+ semantics (aside from responses to HEAD), definitions of new methods
+ cannot change the parsing algorithm or prohibit the presence of
+ content on either the request or the response message. Definitions
+ of new methods can specify that only a zero-length content is allowed
+ by requiring a Content-Length header field with a value of "0".
+
+ Likewise, new methods cannot use the special host:port and asterisk
+ forms of request target that are allowed for CONNECT and OPTIONS,
+ respectively (Section 7.1). A full URI in absolute form is needed
+ for the target URI, which means either the request target needs to be
+ sent in absolute form or the target URI will be reconstructed from
+ the request context in the same way it is for other methods.
+
+ A new method definition needs to indicate whether it is safe
+ (Section 9.2.1), idempotent (Section 9.2.2), cacheable
+ (Section 9.2.3), what semantics are to be associated with the request
+ content (if any), and what refinements the method makes to header
+ field or status code semantics. If the new method is cacheable, its
+ definition ought to describe how, and under what conditions, a cache
+ can store a response and use it to satisfy a subsequent request. The
+ new method ought to describe whether it can be made conditional
+ (Section 13.1) and, if so, how a server responds when the condition
+ is false. Likewise, if the new method might have some use for
+ partial response semantics (Section 14.2), it ought to document this,
+ too.
+
+ | *Note:* Avoid defining a method name that starts with "M-",
+ | since that prefix might be misinterpreted as having the
+ | semantics assigned to it by [RFC2774].
+
+16.2. Status Code Extensibility
+
+16.2.1. Status Code Registry
+
+ The "Hypertext Transfer Protocol (HTTP) Status Code Registry",
+ maintained by IANA at <https://www.iana.org/assignments/http-status-
+ codes>, registers status code numbers.
+
+ A registration MUST include the following fields:
+
+ * Status Code (3 digits)
+
+ * Short Description
+
+ * Pointer to specification text
+
+ Values to be added to the HTTP status code namespace require IETF
+ Review (see [RFC8126], Section 4.8).
+
+16.2.2. Considerations for New Status Codes
+
+ When it is necessary to express semantics for a response that are not
+ defined by current status codes, a new status code can be registered.
+ Status codes are generic; they are potentially applicable to any
+ resource, not just one particular media type, kind of resource, or
+ application of HTTP. As such, it is preferred that new status codes
+ be registered in a document that isn't specific to a single
+ application.
+
+ New status codes are required to fall under one of the categories
+ defined in Section 15. To allow existing parsers to process the
+ response message, new status codes cannot disallow content, although
+ they can mandate a zero-length content.
+
+ Proposals for new status codes that are not yet widely deployed ought
+ to avoid allocating a specific number for the code until there is
+ clear consensus that it will be registered; instead, early drafts can
+ use a notation such as "4NN", or "3N0" .. "3N9", to indicate the
+ class of the proposed status code(s) without consuming a number
+ prematurely.
+
+ The definition of a new status code ought to explain the request
+ conditions that would cause a response containing that status code
+ (e.g., combinations of request header fields and/or method(s)) along
+ with any dependencies on response header fields (e.g., what fields
+ are required, what fields can modify the semantics, and what field
+ semantics are further refined when used with the new status code).
+
+ By default, a status code applies only to the request corresponding
+ to the response it occurs within. If a status code applies to a
+ larger scope of applicability -- for example, all requests to the
+ resource in question or all requests to a server -- this must be
+ explicitly specified. When doing so, it should be noted that not all
+ clients can be expected to consistently apply a larger scope because
+ they might not understand the new status code.
+
+ The definition of a new final status code ought to specify whether or
+ not it is heuristically cacheable. Note that any response with a
+ final status code can be cached if the response has explicit
+ freshness information. A status code defined as heuristically
+ cacheable is allowed to be cached without explicit freshness
+ information. Likewise, the definition of a status code can place
+ constraints upon cache behavior if the must-understand cache
+ directive is used. See [CACHING] for more information.
+
+ Finally, the definition of a new status code ought to indicate
+ whether the content has any implied association with an identified
+ resource (Section 6.4.2).
+
+16.3. Field Extensibility
+
+ HTTP's most widely used extensibility point is the definition of new
+ header and trailer fields.
+
+ New fields can be defined such that, when they are understood by a
+ recipient, they override or enhance the interpretation of previously
+ defined fields, define preconditions on request evaluation, or refine
+ the meaning of responses.
+
+ However, defining a field doesn't guarantee its deployment or
+ recognition by recipients. Most fields are designed with the
+ expectation that a recipient can safely ignore (but forward
+ downstream) any field not recognized. In other cases, the sender's
+ ability to understand a given field might be indicated by its prior
+ communication, perhaps in the protocol version or fields that it sent
+ in prior messages, or its use of a specific media type. Likewise,
+ direct inspection of support might be possible through an OPTIONS
+ request or by interacting with a defined well-known URI [RFC8615] if
+ such inspection is defined along with the field being introduced.
+
+16.3.1. Field Name Registry
+
+ The "Hypertext Transfer Protocol (HTTP) Field Name Registry" defines
+ the namespace for HTTP field names.
+
+ Any party can request registration of an HTTP field. See
+ Section 16.3.2 for considerations to take into account when creating
+ a new HTTP field.
+
+ The "Hypertext Transfer Protocol (HTTP) Field Name Registry" is
+ located at <https://www.iana.org/assignments/http-fields/>.
+ Registration requests can be made by following the instructions
+ located there or by sending an email to the "ietf-http-wg@w3.org"
+ mailing list.
+
+ Field names are registered on the advice of a designated expert
+ (appointed by the IESG or their delegate). Fields with the status
+ 'permanent' are Specification Required ([RFC8126], Section 4.6).
+
+ Registration requests consist of the following information:
+
+ Field name:
+ The requested field name. It MUST conform to the field-name
+ syntax defined in Section 5.1, and it SHOULD be restricted to just
+ letters, digits, and hyphen ('-') characters, with the first
+ character being a letter.
+
+ Status:
+ "permanent", "provisional", "deprecated", or "obsoleted".
+
+ Specification document(s):
+ Reference to the document that specifies the field, preferably
+ including a URI that can be used to retrieve a copy of the
+ document. Optional but encouraged for provisional registrations.
+ An indication of the relevant section(s) can also be included, but
+ is not required.
+
+ And optionally:
+
+ Comments: Additional information, such as about reserved entries.
+
+ The expert(s) can define additional fields to be collected in the
+ registry, in consultation with the community.
+
+ Standards-defined names have a status of "permanent". Other names
+ can also be registered as permanent if the expert(s) finds that they
+ are in use, in consultation with the community. Other names should
+ be registered as "provisional".
+
+ Provisional entries can be removed by the expert(s) if -- in
+ consultation with the community -- the expert(s) find that they are
+ not in use. The expert(s) can change a provisional entry's status to
+ permanent at any time.
+
+ Note that names can be registered by third parties (including the
+ expert(s)) if the expert(s) determines that an unregistered name is
+ widely deployed and not likely to be registered in a timely manner
+ otherwise.
+
+16.3.2. Considerations for New Fields
+
+ HTTP header and trailer fields are a widely used extension point for
+ the protocol. While they can be used in an ad hoc fashion, fields
+ that are intended for wider use need to be carefully documented to
+ ensure interoperability.
+
+ In particular, authors of specifications defining new fields are
+ advised to consider and, where appropriate, document the following
+ aspects:
+
+ * Under what conditions the field can be used; e.g., only in
+ responses or requests, in all messages, only on responses to a
+ particular request method, etc.
+
+ * Whether the field semantics are further refined by their context,
+ such as their use with certain request methods or status codes.
+
+ * The scope of applicability for the information conveyed. By
+ default, fields apply only to the message they are associated
+ with, but some response fields are designed to apply to all
+ representations of a resource, the resource itself, or an even
+ broader scope. Specifications that expand the scope of a response
+ field will need to carefully consider issues such as content
+ negotiation, the time period of applicability, and (in some cases)
+ multi-tenant server deployments.
+
+ * Under what conditions intermediaries are allowed to insert,
+ delete, or modify the field's value.
+
+ * If the field is allowable in trailers; by default, it will not be
+ (see Section 6.5.1).
+
+ * Whether it is appropriate or even required to list the field name
+ in the Connection header field (i.e., if the field is to be hop-
+ by-hop; see Section 7.6.1).
+
+ * Whether the field introduces any additional security
+ considerations, such as disclosure of privacy-related data.
+
+ Request header fields have additional considerations that need to be
+ documented if the default behavior is not appropriate:
+
+ * If it is appropriate to list the field name in a Vary response
+ header field (e.g., when the request header field is used by an
+ origin server's content selection algorithm; see Section 12.5.5).
+
+ * If the field is intended to be stored when received in a PUT
+ request (see Section 9.3.4).
+
+ * If the field ought to be removed when automatically redirecting a
+ request due to security concerns (see Section 15.4).
+
+16.3.2.1. Considerations for New Field Names
+
+ Authors of specifications defining new fields are advised to choose a
+ short but descriptive field name. Short names avoid needless data
+ transmission; descriptive names avoid confusion and "squatting" on
+ names that might have broader uses.
+
+ To that end, limited-use fields (such as a header confined to a
+ single application or use case) are encouraged to use a name that
+ includes that use (or an abbreviation) as a prefix; for example, if
+ the Foo Application needs a Description field, it might use "Foo-
+ Desc"; "Description" is too generic, and "Foo-Description" is
+ needlessly long.
+
+ While the field-name syntax is defined to allow any token character,
+ in practice some implementations place limits on the characters they
+ accept in field-names. To be interoperable, new field names SHOULD
+ constrain themselves to alphanumeric characters, "-", and ".", and
+ SHOULD begin with a letter. For example, the underscore ("_")
+ character can be problematic when passed through non-HTTP gateway
+ interfaces (see Section 17.10).
+
+ Field names ought not be prefixed with "X-"; see [BCP178] for further
+ information.
+
+ Other prefixes are sometimes used in HTTP field names; for example,
+ "Accept-" is used in many content negotiation headers, and "Content-"
+ is used as explained in Section 6.4. These prefixes are only an aid
+ to recognizing the purpose of a field and do not trigger automatic
+ processing.
+
+16.3.2.2. Considerations for New Field Values
+
+ A major task in the definition of a new HTTP field is the
+ specification of the field value syntax: what senders should
+ generate, and how recipients should infer semantics from what is
+ received.
+
+ Authors are encouraged (but not required) to use either the ABNF
+ rules in this specification or those in [RFC8941] to define the
+ syntax of new field values.
+
+ Authors are advised to carefully consider how the combination of
+ multiple field lines will impact them (see Section 5.3). Because
+ senders might erroneously send multiple values, and both
+ intermediaries and HTTP libraries can perform combination
+ automatically, this applies to all field values -- even when only a
+ single value is anticipated.
+
+ Therefore, authors are advised to delimit or encode values that
+ contain commas (e.g., with the quoted-string rule of Section 5.6.4,
+ the String data type of [RFC8941], or a field-specific encoding).
+ This ensures that commas within field data are not confused with the
+ commas that delimit a list value.
+
+ For example, the Content-Type field value only allows commas inside
+ quoted strings, which can be reliably parsed even when multiple
+ values are present. The Location field value provides a counter-
+ example that should not be emulated: because URIs can include commas,
+ it is not possible to reliably distinguish between a single value
+ that includes a comma from two values.
+
+ Authors of fields with a singleton value (see Section 5.5) are
+ additionally advised to document how to treat messages where the
+ multiple members are present (a sensible default would be to ignore
+ the field, but this might not always be the right choice).
+
+16.4. Authentication Scheme Extensibility
+
+16.4.1. Authentication Scheme Registry
+
+ The "Hypertext Transfer Protocol (HTTP) Authentication Scheme
+ Registry" defines the namespace for the authentication schemes in
+ challenges and credentials. It is maintained at
+ <https://www.iana.org/assignments/http-authschemes>.
+
+ Registrations MUST include the following fields:
+
+ * Authentication Scheme Name
+
+ * Pointer to specification text
+
+ * Notes (optional)
+
+ Values to be added to this namespace require IETF Review (see
+ [RFC8126], Section 4.8).
+
+16.4.2. Considerations for New Authentication Schemes
+
+ There are certain aspects of the HTTP Authentication framework that
+ put constraints on how new authentication schemes can work:
+
+ * HTTP authentication is presumed to be stateless: all of the
+ information necessary to authenticate a request MUST be provided
+ in the request, rather than be dependent on the server remembering
+ prior requests. Authentication based on, or bound to, the
+ underlying connection is outside the scope of this specification
+ and inherently flawed unless steps are taken to ensure that the
+ connection cannot be used by any party other than the
+ authenticated user (see Section 3.3).
+
+ * The authentication parameter "realm" is reserved for defining
+ protection spaces as described in Section 11.5. New schemes MUST
+ NOT use it in a way incompatible with that definition.
+
+ * The "token68" notation was introduced for compatibility with
+ existing authentication schemes and can only be used once per
+ challenge or credential. Thus, new schemes ought to use the auth-
+ param syntax instead, because otherwise future extensions will be
+ impossible.
+
+ * The parsing of challenges and credentials is defined by this
+ specification and cannot be modified by new authentication
+ schemes. When the auth-param syntax is used, all parameters ought
+ to support both token and quoted-string syntax, and syntactical
+ constraints ought to be defined on the field value after parsing
+ (i.e., quoted-string processing). This is necessary so that
+ recipients can use a generic parser that applies to all
+ authentication schemes.
+
+ *Note:* The fact that the value syntax for the "realm" parameter
+ is restricted to quoted-string was a bad design choice not to be
+ repeated for new parameters.
+
+ * Definitions of new schemes ought to define the treatment of
+ unknown extension parameters. In general, a "must-ignore" rule is
+ preferable to a "must-understand" rule, because otherwise it will
+ be hard to introduce new parameters in the presence of legacy
+ recipients. Furthermore, it's good to describe the policy for
+ defining new parameters (such as "update the specification" or
+ "use this registry").
+
+ * Authentication schemes need to document whether they are usable in
+ origin-server authentication (i.e., using WWW-Authenticate), and/
+ or proxy authentication (i.e., using Proxy-Authenticate).
+
+ * The credentials carried in an Authorization header field are
+ specific to the user agent and, therefore, have the same effect on
+ HTTP caches as the "private" cache response directive
+ (Section 5.2.2.7 of [CACHING]), within the scope of the request in
+ which they appear.
+
+ Therefore, new authentication schemes that choose not to carry
+ credentials in the Authorization header field (e.g., using a newly
+ defined header field) will need to explicitly disallow caching, by
+ mandating the use of cache response directives (e.g., "private").
+
+ * Schemes using Authentication-Info, Proxy-Authentication-Info, or
+ any other authentication related response header field need to
+ consider and document the related security considerations (see
+ Section 17.16.4).
+
+16.5. Range Unit Extensibility
+
+16.5.1. Range Unit Registry
+
+ The "HTTP Range Unit Registry" defines the namespace for the range
+ unit names and refers to their corresponding specifications. It is
+ maintained at <https://www.iana.org/assignments/http-parameters>.
+
+ Registration of an HTTP Range Unit MUST include the following fields:
+
+ * Name
+
+ * Description
+
+ * Pointer to specification text
+
+ Values to be added to this namespace require IETF Review (see
+ [RFC8126], Section 4.8).
+
+16.5.2. Considerations for New Range Units
+
+ Other range units, such as format-specific boundaries like pages,
+ sections, records, rows, or time, are potentially usable in HTTP for
+ application-specific purposes, but are not commonly used in practice.
+ Implementors of alternative range units ought to consider how they
+ would work with content codings and general-purpose intermediaries.
+
+16.6. Content Coding Extensibility
+
+16.6.1. Content Coding Registry
+
+ The "HTTP Content Coding Registry", maintained by IANA at
+ <https://www.iana.org/assignments/http-parameters/>, registers
+ content-coding names.
+
+ Content coding registrations MUST include the following fields:
+
+ * Name
+
+ * Description
+
+ * Pointer to specification text
+
+ Names of content codings MUST NOT overlap with names of transfer
+ codings (per the "HTTP Transfer Coding Registry" located at
+ <https://www.iana.org/assignments/http-parameters/>) unless the
+ encoding transformation is identical (as is the case for the
+ compression codings defined in Section 8.4.1).
+
+ Values to be added to this namespace require IETF Review (see
+ Section 4.8 of [RFC8126]) and MUST conform to the purpose of content
+ coding defined in Section 8.4.1.
+
+16.6.2. Considerations for New Content Codings
+
+ New content codings ought to be self-descriptive whenever possible,
+ with optional parameters discoverable within the coding format
+ itself, rather than rely on external metadata that might be lost
+ during transit.
+
+16.7. Upgrade Token Registry
+
+ The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry"
+ defines the namespace for protocol-name tokens used to identify
+ protocols in the Upgrade header field. The registry is maintained at
+ <https://www.iana.org/assignments/http-upgrade-tokens>.
+
+ Each registered protocol name is associated with contact information
+ and an optional set of specifications that details how the connection
+ will be processed after it has been upgraded.
+
+ Registrations happen on a "First Come First Served" basis (see
+ Section 4.4 of [RFC8126]) and are subject to the following rules:
+
+ 1. A protocol-name token, once registered, stays registered forever.
+
+ 2. A protocol-name token is case-insensitive and registered with the
+ preferred case to be generated by senders.
+
+ 3. The registration MUST name a responsible party for the
+ registration.
+
+ 4. The registration MUST name a point of contact.
+
+ 5. The registration MAY name a set of specifications associated with
+ that token. Such specifications need not be publicly available.
+
+ 6. The registration SHOULD name a set of expected "protocol-version"
+ tokens associated with that token at the time of registration.
+
+ 7. The responsible party MAY change the registration at any time.
+ The IANA will keep a record of all such changes, and make them
+ available upon request.
+
+ 8. The IESG MAY reassign responsibility for a protocol token. This
+ will normally only be used in the case when a responsible party
+ cannot be contacted.
+
+17. Security Considerations
+
+ This section is meant to inform developers, information providers,
+ and users of known security concerns relevant to HTTP semantics and
+ its use for transferring information over the Internet.
+ Considerations related to caching are discussed in Section 7 of
+ [CACHING], and considerations related to HTTP/1.1 message syntax and
+ parsing are discussed in Section 11 of [HTTP/1.1].
+
+ The list of considerations below is not exhaustive. Most security
+ concerns related to HTTP semantics are about securing server-side
+ applications (code behind the HTTP interface), securing user agent
+ processing of content received via HTTP, or secure use of the
+ Internet in general, rather than security of the protocol. The
+ security considerations for URIs, which are fundamental to HTTP
+ operation, are discussed in Section 7 of [URI]. Various
+ organizations maintain topical information and links to current
+ research on Web application security (e.g., [OWASP]).
+
+17.1. Establishing Authority
+
+ HTTP relies on the notion of an "authoritative response": a response
+ that has been determined by (or at the direction of) the origin
+ server identified within the target URI to be the most appropriate
+ response for that request given the state of the target resource at
+ the time of response message origination.
+
+ When a registered name is used in the authority component, the "http"
+ URI scheme (Section 4.2.1) relies on the user's local name resolution
+ service to determine where it can find authoritative responses. This
+ means that any attack on a user's network host table, cached names,
+ or name resolution libraries becomes an avenue for attack on
+ establishing authority for "http" URIs. Likewise, the user's choice
+ of server for Domain Name Service (DNS), and the hierarchy of servers
+ from which it obtains resolution results, could impact the
+ authenticity of address mappings; DNS Security Extensions (DNSSEC,
+ [RFC4033]) are one way to improve authenticity, as are the various
+ mechanisms for making DNS requests over more secure transfer
+ protocols.
+
+ Furthermore, after an IP address is obtained, establishing authority
+ for an "http" URI is vulnerable to attacks on Internet Protocol
+ routing.
+
+ The "https" scheme (Section 4.2.2) is intended to prevent (or at
+ least reveal) many of these potential attacks on establishing
+ authority, provided that the negotiated connection is secured and the
+ client properly verifies that the communicating server's identity
+ matches the target URI's authority component (Section 4.3.4).
+ Correctly implementing such verification can be difficult (see
+ [Georgiev]).
+
+ Authority for a given origin server can be delegated through protocol
+ extensions; for example, [ALTSVC]. Likewise, the set of servers for
+ which a connection is considered authoritative can be changed with a
+ protocol extension like [RFC8336].
+
+ Providing a response from a non-authoritative source, such as a
+ shared proxy cache, is often useful to improve performance and
+ availability, but only to the extent that the source can be trusted
+ or the distrusted response can be safely used.
+
+ Unfortunately, communicating authority to users can be difficult.
+ For example, "phishing" is an attack on the user's perception of
+ authority, where that perception can be misled by presenting similar
+ branding in hypertext, possibly aided by userinfo obfuscating the
+ authority component (see Section 4.2.1). User agents can reduce the
+ impact of phishing attacks by enabling users to easily inspect a
+ target URI prior to making an action, by prominently distinguishing
+ (or rejecting) userinfo when present, and by not sending stored
+ credentials and cookies when the referring document is from an
+ unknown or untrusted source.
+
+17.2. Risks of Intermediaries
+
+ HTTP intermediaries are inherently situated for on-path attacks.
+ Compromise of the systems on which the intermediaries run can result
+ in serious security and privacy problems. Intermediaries might have
+ access to security-related information, personal information about
+ individual users and organizations, and proprietary information
+ belonging to users and content providers. A compromised
+ intermediary, or an intermediary implemented or configured without
+ regard to security and privacy considerations, might be used in the
+ commission of a wide range of potential attacks.
+
+ Intermediaries that contain a shared cache are especially vulnerable
+ to cache poisoning attacks, as described in Section 7 of [CACHING].
+
+ Implementers need to consider the privacy and security implications
+ of their design and coding decisions, and of the configuration
+ options they provide to operators (especially the default
+ configuration).
+
+ Intermediaries are no more trustworthy than the people and policies
+ under which they operate; HTTP cannot solve this problem.
+
+17.3. Attacks Based on File and Path Names
+
+ Origin servers frequently make use of their local file system to
+ manage the mapping from target URI to resource representations. Most
+ file systems are not designed to protect against malicious file or
+ path names. Therefore, an origin server needs to avoid accessing
+ names that have a special significance to the system when mapping the
+ target resource to files, folders, or directories.
+
+ For example, UNIX, Microsoft Windows, and other operating systems use
+ ".." as a path component to indicate a directory level above the
+ current one, and they use specially named paths or file names to send
+ data to system devices. Similar naming conventions might exist
+ within other types of storage systems. Likewise, local storage
+ systems have an annoying tendency to prefer user-friendliness over
+ security when handling invalid or unexpected characters,
+ recomposition of decomposed characters, and case-normalization of
+ case-insensitive names.
+
+ Attacks based on such special names tend to focus on either denial-
+ of-service (e.g., telling the server to read from a COM port) or
+ disclosure of configuration and source files that are not meant to be
+ served.
+
+17.4. Attacks Based on Command, Code, or Query Injection
+
+ Origin servers often use parameters within the URI as a means of
+ identifying system services, selecting database entries, or choosing
+ a data source. However, data received in a request cannot be
+ trusted. An attacker could construct any of the request data
+ elements (method, target URI, header fields, or content) to contain
+ data that might be misinterpreted as a command, code, or query when
+ passed through a command invocation, language interpreter, or
+ database interface.
+
+ For example, SQL injection is a common attack wherein additional
+ query language is inserted within some part of the target URI or
+ header fields (e.g., Host, Referer, etc.). If the received data is
+ used directly within a SELECT statement, the query language might be
+ interpreted as a database command instead of a simple string value.
+ This type of implementation vulnerability is extremely common, in
+ spite of being easy to prevent.
+
+ In general, resource implementations ought to avoid use of request
+ data in contexts that are processed or interpreted as instructions.
+ Parameters ought to be compared to fixed strings and acted upon as a
+ result of that comparison, rather than passed through an interface
+ that is not prepared for untrusted data. Received data that isn't
+ based on fixed parameters ought to be carefully filtered or encoded
+ to avoid being misinterpreted.
+
+ Similar considerations apply to request data when it is stored and
+ later processed, such as within log files, monitoring tools, or when
+ included within a data format that allows embedded scripts.
+
+17.5. Attacks via Protocol Element Length
+
+ Because HTTP uses mostly textual, character-delimited fields, parsers
+ are often vulnerable to attacks based on sending very long (or very
+ slow) streams of data, particularly where an implementation is
+ expecting a protocol element with no predefined length (Section 2.3).
+
+ To promote interoperability, specific recommendations are made for
+ minimum size limits on fields (Section 5.4). These are minimum
+ recommendations, chosen to be supportable even by implementations
+ with limited resources; it is expected that most implementations will
+ choose substantially higher limits.
+
+ A server can reject a message that has a target URI that is too long
+ (Section 15.5.15) or request content that is too large
+ (Section 15.5.14). Additional status codes related to capacity
+ limits have been defined by extensions to HTTP [RFC6585].
+
+ Recipients ought to carefully limit the extent to which they process
+ other protocol elements, including (but not limited to) request
+ methods, response status phrases, field names, numeric values, and
+ chunk lengths. Failure to limit such processing can result in
+ arbitrary code execution due to buffer or arithmetic overflows, and
+ increased vulnerability to denial-of-service attacks.
+
+17.6. Attacks Using Shared-Dictionary Compression
+
+ Some attacks on encrypted protocols use the differences in size
+ created by dynamic compression to reveal confidential information;
+ for example, [BREACH]. These attacks rely on creating a redundancy
+ between attacker-controlled content and the confidential information,
+ such that a dynamic compression algorithm using the same dictionary
+ for both content will compress more efficiently when the attacker-
+ controlled content matches parts of the confidential content.
+
+ HTTP messages can be compressed in a number of ways, including using
+ TLS compression, content codings, transfer codings, and other
+ extension or version-specific mechanisms.
+
+ The most effective mitigation for this risk is to disable compression
+ on sensitive data, or to strictly separate sensitive data from
+ attacker-controlled data so that they cannot share the same
+ compression dictionary. With careful design, a compression scheme
+ can be designed in a way that is not considered exploitable in
+ limited use cases, such as HPACK ([HPACK]).
+
+17.7. Disclosure of Personal Information
+
+ Clients are often privy to large amounts of personal information,
+ including both information provided by the user to interact with
+ resources (e.g., the user's name, location, mail address, passwords,
+ encryption keys, etc.) and information about the user's browsing
+ activity over time (e.g., history, bookmarks, etc.). Implementations
+ need to prevent unintentional disclosure of personal information.
+
+17.8. Privacy of Server Log Information
+
+ A server is in the position to save personal data about a user's
+ requests over time, which might identify their reading patterns or
+ subjects of interest. In particular, log information gathered at an
+ intermediary often contains a history of user agent interaction,
+ across a multitude of sites, that can be traced to individual users.
+
+ HTTP log information is confidential in nature; its handling is often
+ constrained by laws and regulations. Log information needs to be
+ securely stored and appropriate guidelines followed for its analysis.
+ Anonymization of personal information within individual entries
+ helps, but it is generally not sufficient to prevent real log traces
+ from being re-identified based on correlation with other access
+ characteristics. As such, access traces that are keyed to a specific
+ client are unsafe to publish even if the key is pseudonymous.
+
+ To minimize the risk of theft or accidental publication, log
+ information ought to be purged of personally identifiable
+ information, including user identifiers, IP addresses, and user-
+ provided query parameters, as soon as that information is no longer
+ necessary to support operational needs for security, auditing, or
+ fraud control.
+
+17.9. Disclosure of Sensitive Information in URIs
+
+ URIs are intended to be shared, not secured, even when they identify
+ secure resources. URIs are often shown on displays, added to
+ templates when a page is printed, and stored in a variety of
+ unprotected bookmark lists. Many servers, proxies, and user agents
+ log or display the target URI in places where it might be visible to
+ third parties. It is therefore unwise to include information within
+ a URI that is sensitive, personally identifiable, or a risk to
+ disclose.
+
+ When an application uses client-side mechanisms to construct a target
+ URI out of user-provided information, such as the query fields of a
+ form using GET, potentially sensitive data might be provided that
+ would not be appropriate for disclosure within a URI. POST is often
+ preferred in such cases because it usually doesn't construct a URI;
+ instead, POST of a form transmits the potentially sensitive data in
+ the request content. However, this hinders caching and uses an
+ unsafe method for what would otherwise be a safe request.
+ Alternative workarounds include transforming the user-provided data
+ prior to constructing the URI or filtering the data to only include
+ common values that are not sensitive. Likewise, redirecting the
+ result of a query to a different (server-generated) URI can remove
+ potentially sensitive data from later links and provide a cacheable
+ response for later reuse.
+
+ Since the Referer header field tells a target site about the context
+ that resulted in a request, it has the potential to reveal
+ information about the user's immediate browsing history and any
+ personal information that might be found in the referring resource's
+ URI. Limitations on the Referer header field are described in
+ Section 10.1.3 to address some of its security considerations.
+
+17.10. Application Handling of Field Names
+
+ Servers often use non-HTTP gateway interfaces and frameworks to
+ process a received request and produce content for the response. For
+ historical reasons, such interfaces often pass received field names
+ as external variable names, using a name mapping suitable for
+ environment variables.
+
+ For example, the Common Gateway Interface (CGI) mapping of protocol-
+ specific meta-variables, defined by Section 4.1.18 of [RFC3875], is
+ applied to received header fields that do not correspond to one of
+ CGI's standard variables; the mapping consists of prepending "HTTP_"
+ to each name and changing all instances of hyphen ("-") to underscore
+ ("_"). This same mapping has been inherited by many other
+ application frameworks in order to simplify moving applications from
+ one platform to the next.
+
+ In CGI, a received Content-Length field would be passed as the meta-
+ variable "CONTENT_LENGTH" with a string value matching the received
+ field's value. In contrast, a received "Content_Length" header field
+ would be passed as the protocol-specific meta-variable
+ "HTTP_CONTENT_LENGTH", which might lead to some confusion if an
+ application mistakenly reads the protocol-specific meta-variable
+ instead of the default one. (This historical practice is why
+ Section 16.3.2.1 discourages the creation of new field names that
+ contain an underscore.)
+
+ Unfortunately, mapping field names to different interface names can
+ lead to security vulnerabilities if the mapping is incomplete or
+ ambiguous. For example, if an attacker were to send a field named
+ "Transfer_Encoding", a naive interface might map that to the same
+ variable name as the "Transfer-Encoding" field, resulting in a
+ potential request smuggling vulnerability (Section 11.2 of
+ [HTTP/1.1]).
+
+ To mitigate the associated risks, implementations that perform such
+ mappings are advised to make the mapping unambiguous and complete for
+ the full range of potential octets received as a name (including
+ those that are discouraged or forbidden by the HTTP grammar). For
+ example, a field with an unusual name character might result in the
+ request being blocked, the specific field being removed, or the name
+ being passed with a different prefix to distinguish it from other
+ fields.
+
+17.11. Disclosure of Fragment after Redirects
+
+ Although fragment identifiers used within URI references are not sent
+ in requests, implementers ought to be aware that they will be visible
+ to the user agent and any extensions or scripts running as a result
+ of the response. In particular, when a redirect occurs and the
+ original request's fragment identifier is inherited by the new
+ reference in Location (Section 10.2.2), this might have the effect of
+ disclosing one site's fragment to another site. If the first site
+ uses personal information in fragments, it ought to ensure that
+ redirects to other sites include a (possibly empty) fragment
+ component in order to block that inheritance.
+
+17.12. Disclosure of Product Information
+
+ The User-Agent (Section 10.1.5), Via (Section 7.6.3), and Server
+ (Section 10.2.4) header fields often reveal information about the
+ respective sender's software systems. In theory, this can make it
+ easier for an attacker to exploit known security holes; in practice,
+ attackers tend to try all potential holes regardless of the apparent
+ software versions being used.
+
+ Proxies that serve as a portal through a network firewall ought to
+ take special precautions regarding the transfer of header information
+ that might identify hosts behind the firewall. The Via header field
+ allows intermediaries to replace sensitive machine names with
+ pseudonyms.
+
+17.13. Browser Fingerprinting
+
+ Browser fingerprinting is a set of techniques for identifying a
+ specific user agent over time through its unique set of
+ characteristics. These characteristics might include information
+ related to how it uses the underlying transport protocol, feature
+ capabilities, and scripting environment, though of particular
+ interest here is the set of unique characteristics that might be
+ communicated via HTTP. Fingerprinting is considered a privacy
+ concern because it enables tracking of a user agent's behavior over
+ time ([Bujlow]) without the corresponding controls that the user
+ might have over other forms of data collection (e.g., cookies). Many
+ general-purpose user agents (i.e., Web browsers) have taken steps to
+ reduce their fingerprints.
+
+ There are a number of request header fields that might reveal
+ information to servers that is sufficiently unique to enable
+ fingerprinting. The From header field is the most obvious, though it
+ is expected that From will only be sent when self-identification is
+ desired by the user. Likewise, Cookie header fields are deliberately
+ designed to enable re-identification, so fingerprinting concerns only
+ apply to situations where cookies are disabled or restricted by the
+ user agent's configuration.
+
+ The User-Agent header field might contain enough information to
+ uniquely identify a specific device, usually when combined with other
+ characteristics, particularly if the user agent sends excessive
+ details about the user's system or extensions. However, the source
+ of unique information that is least expected by users is proactive
+ negotiation (Section 12.1), including the Accept, Accept-Charset,
+ Accept-Encoding, and Accept-Language header fields.
+
+ In addition to the fingerprinting concern, detailed use of the
+ Accept-Language header field can reveal information the user might
+ consider to be of a private nature. For example, understanding a
+ given language set might be strongly correlated to membership in a
+ particular ethnic group. An approach that limits such loss of
+ privacy would be for a user agent to omit the sending of Accept-
+ Language except for sites that have been explicitly permitted,
+ perhaps via interaction after detecting a Vary header field that
+ indicates language negotiation might be useful.
+
+ In environments where proxies are used to enhance privacy, user
+ agents ought to be conservative in sending proactive negotiation
+ header fields. General-purpose user agents that provide a high
+ degree of header field configurability ought to inform users about
+ the loss of privacy that might result if too much detail is provided.
+ As an extreme privacy measure, proxies could filter the proactive
+ negotiation header fields in relayed requests.
+
+17.14. Validator Retention
+
+ The validators defined by this specification are not intended to
+ ensure the validity of a representation, guard against malicious
+ changes, or detect on-path attacks. At best, they enable more
+ efficient cache updates and optimistic concurrent writes when all
+ participants are behaving nicely. At worst, the conditions will fail
+ and the client will receive a response that is no more harmful than
+ an HTTP exchange without conditional requests.
+
+ An entity tag can be abused in ways that create privacy risks. For
+ example, a site might deliberately construct a semantically invalid
+ entity tag that is unique to the user or user agent, send it in a
+ cacheable response with a long freshness time, and then read that
+ entity tag in later conditional requests as a means of re-identifying
+ that user or user agent. Such an identifying tag would become a
+ persistent identifier for as long as the user agent retained the
+ original cache entry. User agents that cache representations ought
+ to ensure that the cache is cleared or replaced whenever the user
+ performs privacy-maintaining actions, such as clearing stored cookies
+ or changing to a private browsing mode.
+
+17.15. Denial-of-Service Attacks Using Range
+
+ Unconstrained multiple range requests are susceptible to denial-of-
+ service attacks because the effort required to request many
+ overlapping ranges of the same data is tiny compared to the time,
+ memory, and bandwidth consumed by attempting to serve the requested
+ data in many parts. Servers ought to ignore, coalesce, or reject
+ egregious range requests, such as requests for more than two
+ overlapping ranges or for many small ranges in a single set,
+ particularly when the ranges are requested out of order for no
+ apparent reason. Multipart range requests are not designed to
+ support random access.
+
+17.16. Authentication Considerations
+
+ Everything about the topic of HTTP authentication is a security
+ consideration, so the list of considerations below is not exhaustive.
+ Furthermore, it is limited to security considerations regarding the
+ authentication framework, in general, rather than discussing all of
+ the potential considerations for specific authentication schemes
+ (which ought to be documented in the specifications that define those
+ schemes). Various organizations maintain topical information and
+ links to current research on Web application security (e.g.,
+ [OWASP]), including common pitfalls for implementing and using the
+ authentication schemes found in practice.
+
+17.16.1. Confidentiality of Credentials
+
+ The HTTP authentication framework does not define a single mechanism
+ for maintaining the confidentiality of credentials; instead, each
+ authentication scheme defines how the credentials are encoded prior
+ to transmission. While this provides flexibility for the development
+ of future authentication schemes, it is inadequate for the protection
+ of existing schemes that provide no confidentiality on their own, or
+ that do not sufficiently protect against replay attacks.
+ Furthermore, if the server expects credentials that are specific to
+ each individual user, the exchange of those credentials will have the
+ effect of identifying that user even if the content within
+ credentials remains confidential.
+
+ HTTP depends on the security properties of the underlying transport-
+ or session-level connection to provide confidential transmission of
+ fields. Services that depend on individual user authentication
+ require a secured connection prior to exchanging credentials
+ (Section 4.2.2).
+
+17.16.2. Credentials and Idle Clients
+
+ Existing HTTP clients and user agents typically retain authentication
+ information indefinitely. HTTP does not provide a mechanism for the
+ origin server to direct clients to discard these cached credentials,
+ since the protocol has no awareness of how credentials are obtained
+ or managed by the user agent. The mechanisms for expiring or
+ revoking credentials can be specified as part of an authentication
+ scheme definition.
+
+ Circumstances under which credential caching can interfere with the
+ application's security model include but are not limited to:
+
+ * Clients that have been idle for an extended period, following
+ which the server might wish to cause the client to re-prompt the
+ user for credentials.
+
+ * Applications that include a session termination indication (such
+ as a "logout" or "commit" button on a page) after which the server
+ side of the application "knows" that there is no further reason
+ for the client to retain the credentials.
+
+ User agents that cache credentials are encouraged to provide a
+ readily accessible mechanism for discarding cached credentials under
+ user control.
+
+17.16.3. Protection Spaces
+
+ Authentication schemes that solely rely on the "realm" mechanism for
+ establishing a protection space will expose credentials to all
+ resources on an origin server. Clients that have successfully made
+ authenticated requests with a resource can use the same
+ authentication credentials for other resources on the same origin
+ server. This makes it possible for a different resource to harvest
+ authentication credentials for other resources.
+
+ This is of particular concern when an origin server hosts resources
+ for multiple parties under the same origin (Section 11.5). Possible
+ mitigation strategies include restricting direct access to
+ authentication credentials (i.e., not making the content of the
+ Authorization request header field available), and separating
+ protection spaces by using a different host name (or port number) for
+ each party.
+
+17.16.4. Additional Response Fields
+
+ Adding information to responses that are sent over an unencrypted
+ channel can affect security and privacy. The presence of the
+ Authentication-Info and Proxy-Authentication-Info header fields alone
+ indicates that HTTP authentication is in use. Additional information
+ could be exposed by the contents of the authentication-scheme
+ specific parameters; this will have to be considered in the
+ definitions of these schemes.
+
+18. IANA Considerations
+
+ The change controller for the following registrations is: "IETF
+ (iesg@ietf.org) - Internet Engineering Task Force".
+
+18.1. URI Scheme Registration
+
+ IANA has updated the "Uniform Resource Identifier (URI) Schemes"
+ registry [BCP35] at <https://www.iana.org/assignments/uri-schemes/>
+ with the permanent schemes listed in Table 2 in Section 4.2.
+
+18.2. Method Registration
+
+ IANA has updated the "Hypertext Transfer Protocol (HTTP) Method
+ Registry" at <https://www.iana.org/assignments/http-methods> with the
+ registration procedure of Section 16.1.1 and the method names
+ summarized in the following table.
+
+ +=========+======+============+=========+
+ | Method | Safe | Idempotent | Section |
+ +=========+======+============+=========+
+ | CONNECT | no | no | 9.3.6 |
+ +---------+------+------------+---------+
+ | DELETE | no | yes | 9.3.5 |
+ +---------+------+------------+---------+
+ | GET | yes | yes | 9.3.1 |
+ +---------+------+------------+---------+
+ | HEAD | yes | yes | 9.3.2 |
+ +---------+------+------------+---------+
+ | OPTIONS | yes | yes | 9.3.7 |
+ +---------+------+------------+---------+
+ | POST | no | no | 9.3.3 |
+ +---------+------+------------+---------+
+ | PUT | no | yes | 9.3.4 |
+ +---------+------+------------+---------+
+ | TRACE | yes | yes | 9.3.8 |
+ +---------+------+------------+---------+
+ | * | no | no | 18.2 |
+ +---------+------+------------+---------+
+
+ Table 7
+
+ The method name "*" is reserved because using "*" as a method name
+ would conflict with its usage as a wildcard in some fields (e.g.,
+ "Access-Control-Request-Method").
+
+18.3. Status Code Registration
+
+ IANA has updated the "Hypertext Transfer Protocol (HTTP) Status Code
+ Registry" at <https://www.iana.org/assignments/http-status-codes>
+ with the registration procedure of Section 16.2.1 and the status code
+ values summarized in the following table.
+
+ +=======+===============================+=========+
+ | Value | Description | Section |
+ +=======+===============================+=========+
+ | 100 | Continue | 15.2.1 |
+ +-------+-------------------------------+---------+
+ | 101 | Switching Protocols | 15.2.2 |
+ +-------+-------------------------------+---------+
+ | 200 | OK | 15.3.1 |
+ +-------+-------------------------------+---------+
+ | 201 | Created | 15.3.2 |
+ +-------+-------------------------------+---------+
+ | 202 | Accepted | 15.3.3 |
+ +-------+-------------------------------+---------+
+ | 203 | Non-Authoritative Information | 15.3.4 |
+ +-------+-------------------------------+---------+
+ | 204 | No Content | 15.3.5 |
+ +-------+-------------------------------+---------+
+ | 205 | Reset Content | 15.3.6 |
+ +-------+-------------------------------+---------+
+ | 206 | Partial Content | 15.3.7 |
+ +-------+-------------------------------+---------+
+ | 300 | Multiple Choices | 15.4.1 |
+ +-------+-------------------------------+---------+
+ | 301 | Moved Permanently | 15.4.2 |
+ +-------+-------------------------------+---------+
+ | 302 | Found | 15.4.3 |
+ +-------+-------------------------------+---------+
+ | 303 | See Other | 15.4.4 |
+ +-------+-------------------------------+---------+
+ | 304 | Not Modified | 15.4.5 |
+ +-------+-------------------------------+---------+
+ | 305 | Use Proxy | 15.4.6 |
+ +-------+-------------------------------+---------+
+ | 306 | (Unused) | 15.4.7 |
+ +-------+-------------------------------+---------+
+ | 307 | Temporary Redirect | 15.4.8 |
+ +-------+-------------------------------+---------+
+ | 308 | Permanent Redirect | 15.4.9 |
+ +-------+-------------------------------+---------+
+ | 400 | Bad Request | 15.5.1 |
+ +-------+-------------------------------+---------+
+ | 401 | Unauthorized | 15.5.2 |
+ +-------+-------------------------------+---------+
+ | 402 | Payment Required | 15.5.3 |
+ +-------+-------------------------------+---------+
+ | 403 | Forbidden | 15.5.4 |
+ +-------+-------------------------------+---------+
+ | 404 | Not Found | 15.5.5 |
+ +-------+-------------------------------+---------+
+ | 405 | Method Not Allowed | 15.5.6 |
+ +-------+-------------------------------+---------+
+ | 406 | Not Acceptable | 15.5.7 |
+ +-------+-------------------------------+---------+
+ | 407 | Proxy Authentication Required | 15.5.8 |
+ +-------+-------------------------------+---------+
+ | 408 | Request Timeout | 15.5.9 |
+ +-------+-------------------------------+---------+
+ | 409 | Conflict | 15.5.10 |
+ +-------+-------------------------------+---------+
+ | 410 | Gone | 15.5.11 |
+ +-------+-------------------------------+---------+
+ | 411 | Length Required | 15.5.12 |
+ +-------+-------------------------------+---------+
+ | 412 | Precondition Failed | 15.5.13 |
+ +-------+-------------------------------+---------+
+ | 413 | Content Too Large | 15.5.14 |
+ +-------+-------------------------------+---------+
+ | 414 | URI Too Long | 15.5.15 |
+ +-------+-------------------------------+---------+
+ | 415 | Unsupported Media Type | 15.5.16 |
+ +-------+-------------------------------+---------+
+ | 416 | Range Not Satisfiable | 15.5.17 |
+ +-------+-------------------------------+---------+
+ | 417 | Expectation Failed | 15.5.18 |
+ +-------+-------------------------------+---------+
+ | 418 | (Unused) | 15.5.19 |
+ +-------+-------------------------------+---------+
+ | 421 | Misdirected Request | 15.5.20 |
+ +-------+-------------------------------+---------+
+ | 422 | Unprocessable Content | 15.5.21 |
+ +-------+-------------------------------+---------+
+ | 426 | Upgrade Required | 15.5.22 |
+ +-------+-------------------------------+---------+
+ | 500 | Internal Server Error | 15.6.1 |
+ +-------+-------------------------------+---------+
+ | 501 | Not Implemented | 15.6.2 |
+ +-------+-------------------------------+---------+
+ | 502 | Bad Gateway | 15.6.3 |
+ +-------+-------------------------------+---------+
+ | 503 | Service Unavailable | 15.6.4 |
+ +-------+-------------------------------+---------+
+ | 504 | Gateway Timeout | 15.6.5 |
+ +-------+-------------------------------+---------+
+ | 505 | HTTP Version Not Supported | 15.6.6 |
+ +-------+-------------------------------+---------+
+
+ Table 8
+
+18.4. Field Name Registration
+
+ This specification updates the HTTP-related aspects of the existing
+ registration procedures for message header fields defined in
+ [RFC3864]. It replaces the old procedures as they relate to HTTP by
+ defining a new registration procedure and moving HTTP field
+ definitions into a separate registry.
+
+ IANA has created a new registry titled "Hypertext Transfer Protocol
+ (HTTP) Field Name Registry" as outlined in Section 16.3.1.
+
+ IANA has moved all entries in the "Permanent Message Header Field
+ Names" and "Provisional Message Header Field Names" registries (see
+ <https://www.iana.org/assignments/message-headers/>) with the
+ protocol 'http' to this registry and has applied the following
+ changes:
+
+ 1. The 'Applicable Protocol' field has been omitted.
+
+ 2. Entries that had a status of 'standard', 'experimental',
+ 'reserved', or 'informational' have been made to have a status of
+ 'permanent'.
+
+ 3. Provisional entries without a status have been made to have a
+ status of 'provisional'.
+
+ 4. Permanent entries without a status (after confirmation that the
+ registration document did not define one) have been made to have
+ a status of 'provisional'. The expert(s) can choose to update
+ the entries' status if there is evidence that another is more
+ appropriate.
+
+ IANA has annotated the "Permanent Message Header Field Names" and
+ "Provisional Message Header Field Names" registries with the
+ following note to indicate that HTTP field name registrations have
+ moved:
+
+ | *Note*
+ |
+ | HTTP field name registrations have been moved to
+ | [https://www.iana.org/assignments/http-fields] per [RFC9110].
+
+ IANA has updated the "Hypertext Transfer Protocol (HTTP) Field Name
+ Registry" with the field names listed in the following table.
+
+ +===========================+============+=========+============+
+ | Field Name | Status | Section | Comments |
+ +===========================+============+=========+============+
+ | Accept | permanent | 12.5.1 | |
+ +---------------------------+------------+---------+------------+
+ | Accept-Charset | deprecated | 12.5.2 | |
+ +---------------------------+------------+---------+------------+
+ | Accept-Encoding | permanent | 12.5.3 | |
+ +---------------------------+------------+---------+------------+
+ | Accept-Language | permanent | 12.5.4 | |
+ +---------------------------+------------+---------+------------+
+ | Accept-Ranges | permanent | 14.3 | |
+ +---------------------------+------------+---------+------------+
+ | Allow | permanent | 10.2.1 | |
+ +---------------------------+------------+---------+------------+
+ | Authentication-Info | permanent | 11.6.3 | |
+ +---------------------------+------------+---------+------------+
+ | Authorization | permanent | 11.6.2 | |
+ +---------------------------+------------+---------+------------+
+ | Connection | permanent | 7.6.1 | |
+ +---------------------------+------------+---------+------------+
+ | Content-Encoding | permanent | 8.4 | |
+ +---------------------------+------------+---------+------------+
+ | Content-Language | permanent | 8.5 | |
+ +---------------------------+------------+---------+------------+
+ | Content-Length | permanent | 8.6 | |
+ +---------------------------+------------+---------+------------+
+ | Content-Location | permanent | 8.7 | |
+ +---------------------------+------------+---------+------------+
+ | Content-Range | permanent | 14.4 | |
+ +---------------------------+------------+---------+------------+
+ | Content-Type | permanent | 8.3 | |
+ +---------------------------+------------+---------+------------+
+ | Date | permanent | 6.6.1 | |
+ +---------------------------+------------+---------+------------+
+ | ETag | permanent | 8.8.3 | |
+ +---------------------------+------------+---------+------------+
+ | Expect | permanent | 10.1.1 | |
+ +---------------------------+------------+---------+------------+
+ | From | permanent | 10.1.2 | |
+ +---------------------------+------------+---------+------------+
+ | Host | permanent | 7.2 | |
+ +---------------------------+------------+---------+------------+
+ | If-Match | permanent | 13.1.1 | |
+ +---------------------------+------------+---------+------------+
+ | If-Modified-Since | permanent | 13.1.3 | |
+ +---------------------------+------------+---------+------------+
+ | If-None-Match | permanent | 13.1.2 | |
+ +---------------------------+------------+---------+------------+
+ | If-Range | permanent | 13.1.5 | |
+ +---------------------------+------------+---------+------------+
+ | If-Unmodified-Since | permanent | 13.1.4 | |
+ +---------------------------+------------+---------+------------+
+ | Last-Modified | permanent | 8.8.2 | |
+ +---------------------------+------------+---------+------------+
+ | Location | permanent | 10.2.2 | |
+ +---------------------------+------------+---------+------------+
+ | Max-Forwards | permanent | 7.6.2 | |
+ +---------------------------+------------+---------+------------+
+ | Proxy-Authenticate | permanent | 11.7.1 | |
+ +---------------------------+------------+---------+------------+
+ | Proxy-Authentication-Info | permanent | 11.7.3 | |
+ +---------------------------+------------+---------+------------+
+ | Proxy-Authorization | permanent | 11.7.2 | |
+ +---------------------------+------------+---------+------------+
+ | Range | permanent | 14.2 | |
+ +---------------------------+------------+---------+------------+
+ | Referer | permanent | 10.1.3 | |
+ +---------------------------+------------+---------+------------+
+ | Retry-After | permanent | 10.2.3 | |
+ +---------------------------+------------+---------+------------+
+ | Server | permanent | 10.2.4 | |
+ +---------------------------+------------+---------+------------+
+ | TE | permanent | 10.1.4 | |
+ +---------------------------+------------+---------+------------+
+ | Trailer | permanent | 6.6.2 | |
+ +---------------------------+------------+---------+------------+
+ | Upgrade | permanent | 7.8 | |
+ +---------------------------+------------+---------+------------+
+ | User-Agent | permanent | 10.1.5 | |
+ +---------------------------+------------+---------+------------+
+ | Vary | permanent | 12.5.5 | |
+ +---------------------------+------------+---------+------------+
+ | Via | permanent | 7.6.3 | |
+ +---------------------------+------------+---------+------------+
+ | WWW-Authenticate | permanent | 11.6.1 | |
+ +---------------------------+------------+---------+------------+
+ | * | permanent | 12.5.5 | (reserved) |
+ +---------------------------+------------+---------+------------+
+
+ Table 9
+
+ The field name "*" is reserved because using that name as an HTTP
+ header field might conflict with its special semantics in the Vary
+ header field (Section 12.5.5).
+
+ IANA has updated the "Content-MD5" entry in the new registry to have
+ a status of 'obsoleted' with references to Section 14.15 of [RFC2616]
+ (for the definition of the header field) and Appendix B of [RFC7231]
+ (which removed the field definition from the updated specification).
+
+18.5. Authentication Scheme Registration
+
+ IANA has updated the "Hypertext Transfer Protocol (HTTP)
+ Authentication Scheme Registry" at <https://www.iana.org/assignments/
+ http-authschemes> with the registration procedure of Section 16.4.1.
+ No authentication schemes are defined in this document.
+
+18.6. Content Coding Registration
+
+ IANA has updated the "HTTP Content Coding Registry" at
+ <https://www.iana.org/assignments/http-parameters/> with the
+ registration procedure of Section 16.6.1 and the content coding names
+ summarized in the table below.
+
+ +============+===========================================+=========+
+ | Name | Description | Section |
+ +============+===========================================+=========+
+ | compress | UNIX "compress" data format [Welch] | 8.4.1.1 |
+ +------------+-------------------------------------------+---------+
+ | deflate | "deflate" compressed data ([RFC1951]) | 8.4.1.2 |
+ | | inside the "zlib" data format ([RFC1950]) | |
+ +------------+-------------------------------------------+---------+
+ | gzip | GZIP file format [RFC1952] | 8.4.1.3 |
+ +------------+-------------------------------------------+---------+
+ | identity | Reserved | 12.5.3 |
+ +------------+-------------------------------------------+---------+
+ | x-compress | Deprecated (alias for compress) | 8.4.1.1 |
+ +------------+-------------------------------------------+---------+
+ | x-gzip | Deprecated (alias for gzip) | 8.4.1.3 |
+ +------------+-------------------------------------------+---------+
+
+ Table 10
+
+18.7. Range Unit Registration
+
+ IANA has updated the "HTTP Range Unit Registry" at
+ <https://www.iana.org/assignments/http-parameters/> with the
+ registration procedure of Section 16.5.1 and the range unit names
+ summarized in the table below.
+
+ +=================+==================================+=========+
+ | Range Unit Name | Description | Section |
+ +=================+==================================+=========+
+ | bytes | a range of octets | 14.1.2 |
+ +-----------------+----------------------------------+---------+
+ | none | reserved as keyword to indicate | 14.3 |
+ | | range requests are not supported | |
+ +-----------------+----------------------------------+---------+
+
+ Table 11
+
+18.8. Media Type Registration
+
+ IANA has updated the "Media Types" registry at
+ <https://www.iana.org/assignments/media-types> with the registration
+ information in Section 14.6 for the media type "multipart/
+ byteranges".
+
+ IANA has updated the registry note about "q" parameters with a link
+ to Section 12.5.1 of this document.
+
+18.9. Port Registration
+
+ IANA has updated the "Service Name and Transport Protocol Port Number
+ Registry" at <https://www.iana.org/assignments/service-names-port-
+ numbers/> for the services on ports 80 and 443 that use UDP or TCP
+ to:
+
+ 1. use this document as "Reference", and
+
+ 2. when currently unspecified, set "Assignee" to "IESG" and
+ "Contact" to "IETF_Chair".
+
+18.10. Upgrade Token Registration
+
+ IANA has updated the "Hypertext Transfer Protocol (HTTP) Upgrade
+ Token Registry" at <https://www.iana.org/assignments/http-upgrade-
+ tokens> with the registration procedure described in Section 16.7 and
+ the upgrade token names summarized in the following table.
+
+ +======+===================+=========================+=========+
+ | Name | Description | Expected Version Tokens | Section |
+ +======+===================+=========================+=========+
+ | HTTP | Hypertext | any DIGIT.DIGIT (e.g., | 2.5 |
+ | | Transfer Protocol | "2.0") | |
+ +------+-------------------+-------------------------+---------+
+
+ Table 12
+
+19. References
+
+19.1. Normative References
+
+ [CACHING] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Caching", STD 98, RFC 9111,
+ DOI 10.17487/RFC9111, June 2022,
+ <https://www.rfc-editor.org/info/rfc9111>.
+
+ [RFC1950] Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format
+ Specification version 3.3", RFC 1950,
+ DOI 10.17487/RFC1950, May 1996,
+ <https://www.rfc-editor.org/info/rfc1950>.
+
+ [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification
+ version 1.3", RFC 1951, DOI 10.17487/RFC1951, May 1996,
+ <https://www.rfc-editor.org/info/rfc1951>.
+
+ [RFC1952] Deutsch, P., "GZIP file format specification version 4.3",
+ RFC 1952, DOI 10.17487/RFC1952, May 1996,
+ <https://www.rfc-editor.org/info/rfc1952>.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ DOI 10.17487/RFC2046, November 1996,
+ <https://www.rfc-editor.org/info/rfc2046>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC4647] Phillips, A., Ed. and M. Davis, Ed., "Matching of Language
+ Tags", BCP 47, RFC 4647, DOI 10.17487/RFC4647, September
+ 2006, <https://www.rfc-editor.org/info/rfc4647>.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
+ <https://www.rfc-editor.org/info/rfc4648>.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234,
+ DOI 10.17487/RFC5234, January 2008,
+ <https://www.rfc-editor.org/info/rfc5234>.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation List
+ (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008,
+ <https://www.rfc-editor.org/info/rfc5280>.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ DOI 10.17487/RFC5322, October 2008,
+ <https://www.rfc-editor.org/info/rfc5322>.
+
+ [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying
+ Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646,
+ September 2009, <https://www.rfc-editor.org/info/rfc5646>.
+
+ [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and
+ Verification of Domain-Based Application Service Identity
+ within Internet Public Key Infrastructure Using X.509
+ (PKIX) Certificates in the Context of Transport Layer
+ Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, March
+ 2011, <https://www.rfc-editor.org/info/rfc6125>.
+
+ [RFC6365] Hoffman, P. and J. Klensin, "Terminology Used in
+ Internationalization in the IETF", BCP 166, RFC 6365,
+ DOI 10.17487/RFC6365, September 2011,
+ <https://www.rfc-editor.org/info/rfc6365>.
+
+ [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF",
+ RFC 7405, DOI 10.17487/RFC7405, December 2014,
+ <https://www.rfc-editor.org/info/rfc7405>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [TCP] Postel, J., "Transmission Control Protocol", STD 7,
+ RFC 793, DOI 10.17487/RFC0793, September 1981,
+ <https://www.rfc-editor.org/info/rfc793>.
+
+ [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+ [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, DOI 10.17487/RFC3986, January 2005,
+ <https://www.rfc-editor.org/info/rfc3986>.
+
+ [USASCII] American National Standards Institute, "Coded Character
+ Set -- 7-bit American Standard Code for Information
+ Interchange", ANSI X3.4, 1986.
+
+ [Welch] Welch, T., "A Technique for High-Performance Data
+ Compression", IEEE Computer 17(6),
+ DOI 10.1109/MC.1984.1659158, June 1984,
+ <https://ieeexplore.ieee.org/document/1659158/>.
+
+19.2. Informative References
+
+ [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP
+ Alternative Services", RFC 7838, DOI 10.17487/RFC7838,
+ April 2016, <https://www.rfc-editor.org/info/rfc7838>.
+
+ [BCP13] Freed, N. and J. Klensin, "Multipurpose Internet Mail
+ Extensions (MIME) Part Four: Registration Procedures",
+ BCP 13, RFC 4289, December 2005.
+
+ Freed, N., Klensin, J., and T. Hansen, "Media Type
+ Specifications and Registration Procedures", BCP 13,
+ RFC 6838, January 2013.
+
+ <https://www.rfc-editor.org/info/bcp13>
+
+ [BCP178] Saint-Andre, P., Crocker, D., and M. Nottingham,
+ "Deprecating the "X-" Prefix and Similar Constructs in
+ Application Protocols", BCP 178, RFC 6648, June 2012.
+
+ <https://www.rfc-editor.org/info/bcp178>
+
+ [BCP35] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines
+ and Registration Procedures for URI Schemes", BCP 35,
+ RFC 7595, June 2015.
+
+ <https://www.rfc-editor.org/info/bcp35>
+
+ [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the
+ CRIME Attack", July 2013,
+ <http://breachattack.com/resources/
+ BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>.
+
+ [Bujlow] Bujlow, T., Carela-Español, V., Solé-Pareta, J., and P.
+ Barlet-Ros, "A Survey on Web Tracking: Mechanisms,
+ Implications, and Defenses", In Proceedings of the IEEE
+ 105(8), DOI 10.1109/JPROC.2016.2637878, August 2017,
+ <https://doi.org/10.1109/JPROC.2016.2637878>.
+
+ [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265,
+ DOI 10.17487/RFC6265, April 2011,
+ <https://www.rfc-editor.org/info/rfc6265>.
+
+ [Err1912] RFC Errata, Erratum ID 1912, RFC 2978,
+ <https://www.rfc-editor.org/errata/eid1912>.
+
+ [Err5433] RFC Errata, Erratum ID 5433, RFC 2978,
+ <https://www.rfc-editor.org/errata/eid5433>.
+
+ [Georgiev] Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh,
+ D., and V. Shmatikov, "The Most Dangerous Code in the
+ World: Validating SSL Certificates in Non-Browser
+ Software", In Proceedings of the 2012 ACM Conference on
+ Computer and Communications Security (CCS '12), pp. 38-49,
+ DOI 10.1145/2382196.2382204, October 2012,
+ <https://doi.org/10.1145/2382196.2382204>.
+
+ [HPACK] Peon, R. and H. Ruellan, "HPACK: Header Compression for
+ HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015,
+ <https://www.rfc-editor.org/info/rfc7541>.
+
+ [HTTP/1.0] Berners-Lee, T., Fielding, R., and H. Frystyk, "Hypertext
+ Transfer Protocol -- HTTP/1.0", RFC 1945,
+ DOI 10.17487/RFC1945, May 1996,
+ <https://www.rfc-editor.org/info/rfc1945>.
+
+ [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112,
+ June 2022, <https://www.rfc-editor.org/info/rfc9112>.
+
+ [HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113,
+ DOI 10.17487/RFC9113, June 2022,
+ <https://www.rfc-editor.org/info/rfc9113>.
+
+ [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114,
+ June 2022, <https://www.rfc-editor.org/info/rfc9114>.
+
+ [ISO-8859-1]
+ International Organization for Standardization,
+ "Information technology -- 8-bit single-byte coded graphic
+ character sets -- Part 1: Latin alphabet No. 1", ISO/
+ IEC 8859-1:1998, 1998.
+
+ [Kri2001] Kristol, D., "HTTP Cookies: Standards, Privacy, and
+ Politics", ACM Transactions on Internet Technology 1(2),
+ November 2001, <http://arxiv.org/abs/cs.SE/0105018>.
+
+ [OWASP] The Open Web Application Security Project,
+ <https://www.owasp.org/>.
+
+ [REST] Fielding, R.T., "Architectural Styles and the Design of
+ Network-based Software Architectures", Doctoral
+ Dissertation, University of California, Irvine, September
+ 2000, <https://roy.gbiv.com/pubs/dissertation/top.htm>.
+
+ [RFC1919] Chatel, M., "Classical versus Transparent IP Proxies",
+ RFC 1919, DOI 10.17487/RFC1919, March 1996,
+ <https://www.rfc-editor.org/info/rfc1919>.
+
+ [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions)
+ Part Three: Message Header Extensions for Non-ASCII Text",
+ RFC 2047, DOI 10.17487/RFC2047, November 1996,
+ <https://www.rfc-editor.org/info/rfc2047>.
+
+ [RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., and T.
+ Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1",
+ RFC 2068, DOI 10.17487/RFC2068, January 1997,
+ <https://www.rfc-editor.org/info/rfc2068>.
+
+ [RFC2145] Mogul, J. C., Fielding, R., Gettys, J., and H. Frystyk,
+ "Use and Interpretation of HTTP Version Numbers",
+ RFC 2145, DOI 10.17487/RFC2145, May 1997,
+ <https://www.rfc-editor.org/info/rfc2145>.
+
+ [RFC2295] Holtman, K. and A. Mutz, "Transparent Content Negotiation
+ in HTTP", RFC 2295, DOI 10.17487/RFC2295, March 1998,
+ <https://www.rfc-editor.org/info/rfc2295>.
+
+ [RFC2324] Masinter, L., "Hyper Text Coffee Pot Control Protocol
+ (HTCPCP/1.0)", RFC 2324, DOI 10.17487/RFC2324, 1 April
+ 1998, <https://www.rfc-editor.org/info/rfc2324>.
+
+ [RFC2557] Palme, J., Hopmann, A., and N. Shelness, "MIME
+ Encapsulation of Aggregate Documents, such as HTML
+ (MHTML)", RFC 2557, DOI 10.17487/RFC2557, March 1999,
+ <https://www.rfc-editor.org/info/rfc2557>.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616,
+ DOI 10.17487/RFC2616, June 1999,
+ <https://www.rfc-editor.org/info/rfc2616>.
+
+ [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+ Leach, P., Luotonen, A., and L. Stewart, "HTTP
+ Authentication: Basic and Digest Access Authentication",
+ RFC 2617, DOI 10.17487/RFC2617, June 1999,
+ <https://www.rfc-editor.org/info/rfc2617>.
+
+ [RFC2774] Nielsen, H., Leach, P., and S. Lawrence, "An HTTP
+ Extension Framework", RFC 2774, DOI 10.17487/RFC2774,
+ February 2000, <https://www.rfc-editor.org/info/rfc2774>.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ DOI 10.17487/RFC2818, May 2000,
+ <https://www.rfc-editor.org/info/rfc2818>.
+
+ [RFC2978] Freed, N. and J. Postel, "IANA Charset Registration
+ Procedures", BCP 19, RFC 2978, DOI 10.17487/RFC2978,
+ October 2000, <https://www.rfc-editor.org/info/rfc2978>.
+
+ [RFC3040] Cooper, I., Melve, I., and G. Tomlinson, "Internet Web
+ Replication and Caching Taxonomy", RFC 3040,
+ DOI 10.17487/RFC3040, January 2001,
+ <https://www.rfc-editor.org/info/rfc3040>.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ DOI 10.17487/RFC3864, September 2004,
+ <https://www.rfc-editor.org/info/rfc3864>.
+
+ [RFC3875] Robinson, D. and K. Coar, "The Common Gateway Interface
+ (CGI) Version 1.1", RFC 3875, DOI 10.17487/RFC3875,
+ October 2004, <https://www.rfc-editor.org/info/rfc3875>.
+
+ [RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S.
+ Rose, "DNS Security Introduction and Requirements",
+ RFC 4033, DOI 10.17487/RFC4033, March 2005,
+ <https://www.rfc-editor.org/info/rfc4033>.
+
+ [RFC4559] Jaganathan, K., Zhu, L., and J. Brezak, "SPNEGO-based
+ Kerberos and NTLM HTTP Authentication in Microsoft
+ Windows", RFC 4559, DOI 10.17487/RFC4559, June 2006,
+ <https://www.rfc-editor.org/info/rfc4559>.
+
+ [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP",
+ RFC 5789, DOI 10.17487/RFC5789, March 2010,
+ <https://www.rfc-editor.org/info/rfc5789>.
+
+ [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch,
+ "Network Time Protocol Version 4: Protocol and Algorithms
+ Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010,
+ <https://www.rfc-editor.org/info/rfc5905>.
+
+ [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454,
+ DOI 10.17487/RFC6454, December 2011,
+ <https://www.rfc-editor.org/info/rfc6454>.
+
+ [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status
+ Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012,
+ <https://www.rfc-editor.org/info/rfc6585>.
+
+ [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
+ Protocol (HTTP/1.1): Message Syntax and Routing",
+ RFC 7230, DOI 10.17487/RFC7230, June 2014,
+ <https://www.rfc-editor.org/info/rfc7230>.
+
+ [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
+ Protocol (HTTP/1.1): Semantics and Content", RFC 7231,
+ DOI 10.17487/RFC7231, June 2014,
+ <https://www.rfc-editor.org/info/rfc7231>.
+
+ [RFC7232] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
+ Protocol (HTTP/1.1): Conditional Requests", RFC 7232,
+ DOI 10.17487/RFC7232, June 2014,
+ <https://www.rfc-editor.org/info/rfc7232>.
+
+ [RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed.,
+ "Hypertext Transfer Protocol (HTTP/1.1): Range Requests",
+ RFC 7233, DOI 10.17487/RFC7233, June 2014,
+ <https://www.rfc-editor.org/info/rfc7233>.
+
+ [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching",
+ RFC 7234, DOI 10.17487/RFC7234, June 2014,
+ <https://www.rfc-editor.org/info/rfc7234>.
+
+ [RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
+ Protocol (HTTP/1.1): Authentication", RFC 7235,
+ DOI 10.17487/RFC7235, June 2014,
+ <https://www.rfc-editor.org/info/rfc7235>.
+
+ [RFC7538] Reschke, J., "The Hypertext Transfer Protocol Status Code
+ 308 (Permanent Redirect)", RFC 7538, DOI 10.17487/RFC7538,
+ April 2015, <https://www.rfc-editor.org/info/rfc7538>.
+
+ [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext
+ Transfer Protocol Version 2 (HTTP/2)", RFC 7540,
+ DOI 10.17487/RFC7540, May 2015,
+ <https://www.rfc-editor.org/info/rfc7540>.
+
+ [RFC7578] Masinter, L., "Returning Values from Forms: multipart/
+ form-data", RFC 7578, DOI 10.17487/RFC7578, July 2015,
+ <https://www.rfc-editor.org/info/rfc7578>.
+
+ [RFC7615] Reschke, J., "HTTP Authentication-Info and Proxy-
+ Authentication-Info Response Header Fields", RFC 7615,
+ DOI 10.17487/RFC7615, September 2015,
+ <https://www.rfc-editor.org/info/rfc7615>.
+
+ [RFC7616] Shekh-Yusef, R., Ed., Ahrens, D., and S. Bremer, "HTTP
+ Digest Access Authentication", RFC 7616,
+ DOI 10.17487/RFC7616, September 2015,
+ <https://www.rfc-editor.org/info/rfc7616>.
+
+ [RFC7617] Reschke, J., "The 'Basic' HTTP Authentication Scheme",
+ RFC 7617, DOI 10.17487/RFC7617, September 2015,
+ <https://www.rfc-editor.org/info/rfc7617>.
+
+ [RFC7694] Reschke, J., "Hypertext Transfer Protocol (HTTP) Client-
+ Initiated Content-Encoding", RFC 7694,
+ DOI 10.17487/RFC7694, November 2015,
+ <https://www.rfc-editor.org/info/rfc7694>.
+
+ [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
+ Writing an IANA Considerations Section in RFCs", BCP 26,
+ RFC 8126, DOI 10.17487/RFC8126, June 2017,
+ <https://www.rfc-editor.org/info/rfc8126>.
+
+ [RFC8187] Reschke, J., "Indicating Character Encoding and Language
+ for HTTP Header Field Parameters", RFC 8187,
+ DOI 10.17487/RFC8187, September 2017,
+ <https://www.rfc-editor.org/info/rfc8187>.
+
+ [RFC8246] McManus, P., "HTTP Immutable Responses", RFC 8246,
+ DOI 10.17487/RFC8246, September 2017,
+ <https://www.rfc-editor.org/info/rfc8246>.
+
+ [RFC8288] Nottingham, M., "Web Linking", RFC 8288,
+ DOI 10.17487/RFC8288, October 2017,
+ <https://www.rfc-editor.org/info/rfc8288>.
+
+ [RFC8336] Nottingham, M. and E. Nygren, "The ORIGIN HTTP/2 Frame",
+ RFC 8336, DOI 10.17487/RFC8336, March 2018,
+ <https://www.rfc-editor.org/info/rfc8336>.
+
+ [RFC8615] Nottingham, M., "Well-Known Uniform Resource Identifiers
+ (URIs)", RFC 8615, DOI 10.17487/RFC8615, May 2019,
+ <https://www.rfc-editor.org/info/rfc8615>.
+
+ [RFC8941] Nottingham, M. and P-H. Kamp, "Structured Field Values for
+ HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021,
+ <https://www.rfc-editor.org/info/rfc8941>.
+
+ [Sniffing] WHATWG, "MIME Sniffing",
+ <https://mimesniff.spec.whatwg.org>.
+
+ [WEBDAV] Dusseault, L., Ed., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918,
+ DOI 10.17487/RFC4918, June 2007,
+ <https://www.rfc-editor.org/info/rfc4918>.
+
+Appendix A. Collected ABNF
+
+ In the collected ABNF below, list rules are expanded per
+ Section 5.6.1.
+
+ Accept = [ ( media-range [ weight ] ) *( OWS "," OWS ( media-range [
+ weight ] ) ) ]
+ Accept-Charset = [ ( ( token / "*" ) [ weight ] ) *( OWS "," OWS ( (
+ token / "*" ) [ weight ] ) ) ]
+ Accept-Encoding = [ ( codings [ weight ] ) *( OWS "," OWS ( codings [
+ weight ] ) ) ]
+ Accept-Language = [ ( language-range [ weight ] ) *( OWS "," OWS (
+ language-range [ weight ] ) ) ]
+ Accept-Ranges = acceptable-ranges
+ Allow = [ method *( OWS "," OWS method ) ]
+ Authentication-Info = [ auth-param *( OWS "," OWS auth-param ) ]
+ Authorization = credentials
+
+ BWS = OWS
+
+ Connection = [ connection-option *( OWS "," OWS connection-option )
+ ]
+ Content-Encoding = [ content-coding *( OWS "," OWS content-coding )
+ ]
+ Content-Language = [ language-tag *( OWS "," OWS language-tag ) ]
+ Content-Length = 1*DIGIT
+ Content-Location = absolute-URI / partial-URI
+ Content-Range = range-unit SP ( range-resp / unsatisfied-range )
+ Content-Type = media-type
+
+ Date = HTTP-date
+
+ ETag = entity-tag
+ Expect = [ expectation *( OWS "," OWS expectation ) ]
+
+ From = mailbox
+
+ GMT = %x47.4D.54 ; GMT
+
+ HTTP-date = IMF-fixdate / obs-date
+ Host = uri-host [ ":" port ]
+
+ IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT
+ If-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ]
+ If-Modified-Since = HTTP-date
+ If-None-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ]
+ If-Range = entity-tag / HTTP-date
+ If-Unmodified-Since = HTTP-date
+
+ Last-Modified = HTTP-date
+ Location = URI-reference
+
+ Max-Forwards = 1*DIGIT
+
+ OWS = *( SP / HTAB )
+
+ Proxy-Authenticate = [ challenge *( OWS "," OWS challenge ) ]
+ Proxy-Authentication-Info = [ auth-param *( OWS "," OWS auth-param )
+ ]
+ Proxy-Authorization = credentials
+
+ RWS = 1*( SP / HTAB )
+ Range = ranges-specifier
+ Referer = absolute-URI / partial-URI
+ Retry-After = HTTP-date / delay-seconds
+
+ Server = product *( RWS ( product / comment ) )
+
+ TE = [ t-codings *( OWS "," OWS t-codings ) ]
+ Trailer = [ field-name *( OWS "," OWS field-name ) ]
+
+ URI-reference = <URI-reference, see [URI], Section 4.1>
+ Upgrade = [ protocol *( OWS "," OWS protocol ) ]
+ User-Agent = product *( RWS ( product / comment ) )
+
+ Vary = [ ( "*" / field-name ) *( OWS "," OWS ( "*" / field-name ) )
+ ]
+ Via = [ ( received-protocol RWS received-by [ RWS comment ] ) *( OWS
+ "," OWS ( received-protocol RWS received-by [ RWS comment ] ) ) ]
+
+ WWW-Authenticate = [ challenge *( OWS "," OWS challenge ) ]
+
+ absolute-URI = <absolute-URI, see [URI], Section 4.3>
+ absolute-path = 1*( "/" segment )
+ acceptable-ranges = range-unit *( OWS "," OWS range-unit )
+ asctime-date = day-name SP date3 SP time-of-day SP year
+ auth-param = token BWS "=" BWS ( token / quoted-string )
+ auth-scheme = token
+ authority = <authority, see [URI], Section 3.2>
+
+ challenge = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS ","
+ OWS auth-param ) ] ) ]
+ codings = content-coding / "identity" / "*"
+ comment = "(" *( ctext / quoted-pair / comment ) ")"
+ complete-length = 1*DIGIT
+ connection-option = token
+ content-coding = token
+ credentials = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS ","
+ OWS auth-param ) ] ) ]
+ ctext = HTAB / SP / %x21-27 ; '!'-'''
+ / %x2A-5B ; '*'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+
+ date1 = day SP month SP year
+ date2 = day "-" month "-" 2DIGIT
+ date3 = month SP ( 2DIGIT / ( SP DIGIT ) )
+ day = 2DIGIT
+ day-name = %x4D.6F.6E ; Mon
+ / %x54.75.65 ; Tue
+ / %x57.65.64 ; Wed
+ / %x54.68.75 ; Thu
+ / %x46.72.69 ; Fri
+ / %x53.61.74 ; Sat
+ / %x53.75.6E ; Sun
+ day-name-l = %x4D.6F.6E.64.61.79 ; Monday
+ / %x54.75.65.73.64.61.79 ; Tuesday
+ / %x57.65.64.6E.65.73.64.61.79 ; Wednesday
+ / %x54.68.75.72.73.64.61.79 ; Thursday
+ / %x46.72.69.64.61.79 ; Friday
+ / %x53.61.74.75.72.64.61.79 ; Saturday
+ / %x53.75.6E.64.61.79 ; Sunday
+ delay-seconds = 1*DIGIT
+
+ entity-tag = [ weak ] opaque-tag
+ etagc = "!" / %x23-7E ; '#'-'~'
+ / obs-text
+ expectation = token [ "=" ( token / quoted-string ) parameters ]
+
+ field-content = field-vchar [ 1*( SP / HTAB / field-vchar )
+ field-vchar ]
+ field-name = token
+ field-value = *field-content
+ field-vchar = VCHAR / obs-text
+ first-pos = 1*DIGIT
+
+ hour = 2DIGIT
+ http-URI = "http://" authority path-abempty [ "?" query ]
+ https-URI = "https://" authority path-abempty [ "?" query ]
+
+ incl-range = first-pos "-" last-pos
+ int-range = first-pos "-" [ last-pos ]
+
+ language-range = <language-range, see [RFC4647], Section 2.1>
+ language-tag = <Language-Tag, see [RFC5646], Section 2.1>
+ last-pos = 1*DIGIT
+
+ mailbox = <mailbox, see [RFC5322], Section 3.4>
+ media-range = ( "*/*" / ( type "/*" ) / ( type "/" subtype ) )
+ parameters
+ media-type = type "/" subtype parameters
+ method = token
+ minute = 2DIGIT
+ month = %x4A.61.6E ; Jan
+ / %x46.65.62 ; Feb
+ / %x4D.61.72 ; Mar
+ / %x41.70.72 ; Apr
+ / %x4D.61.79 ; May
+ / %x4A.75.6E ; Jun
+ / %x4A.75.6C ; Jul
+ / %x41.75.67 ; Aug
+ / %x53.65.70 ; Sep
+ / %x4F.63.74 ; Oct
+ / %x4E.6F.76 ; Nov
+ / %x44.65.63 ; Dec
+
+ obs-date = rfc850-date / asctime-date
+ obs-text = %x80-FF
+ opaque-tag = DQUOTE *etagc DQUOTE
+ other-range = 1*( %x21-2B ; '!'-'+'
+ / %x2D-7E ; '-'-'~'
+ )
+
+ parameter = parameter-name "=" parameter-value
+ parameter-name = token
+ parameter-value = ( token / quoted-string )
+ parameters = *( OWS ";" OWS [ parameter ] )
+ partial-URI = relative-part [ "?" query ]
+ path-abempty = <path-abempty, see [URI], Section 3.3>
+ port = <port, see [URI], Section 3.2.3>
+ product = token [ "/" product-version ]
+ product-version = token
+ protocol = protocol-name [ "/" protocol-version ]
+ protocol-name = token
+ protocol-version = token
+ pseudonym = token
+
+ qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+ query = <query, see [URI], Section 3.4>
+ quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
+ quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] )
+
+ range-resp = incl-range "/" ( complete-length / "*" )
+ range-set = range-spec *( OWS "," OWS range-spec )
+ range-spec = int-range / suffix-range / other-range
+ range-unit = token
+ ranges-specifier = range-unit "=" range-set
+ received-by = pseudonym [ ":" port ]
+ received-protocol = [ protocol-name "/" ] protocol-version
+ relative-part = <relative-part, see [URI], Section 4.2>
+ rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT
+
+ second = 2DIGIT
+ segment = <segment, see [URI], Section 3.3>
+ subtype = token
+ suffix-length = 1*DIGIT
+ suffix-range = "-" suffix-length
+
+ t-codings = "trailers" / ( transfer-coding [ weight ] )
+ tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
+ "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
+ time-of-day = hour ":" minute ":" second
+ token = 1*tchar
+ token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" )
+ *"="
+ transfer-coding = token *( OWS ";" OWS transfer-parameter )
+ transfer-parameter = token BWS "=" BWS ( token / quoted-string )
+ type = token
+
+ unsatisfied-range = "*/" complete-length
+ uri-host = <host, see [URI], Section 3.2.2>
+
+ weak = %x57.2F ; W/
+ weight = OWS ";" OWS "q=" qvalue
+
+ year = 4DIGIT
+
+Appendix B. Changes from Previous RFCs
+
+B.1. Changes from RFC 2818
+
+ None.
+
+B.2. Changes from RFC 7230
+
+ The sections introducing HTTP's design goals, history, architecture,
+ conformance criteria, protocol versioning, URIs, message routing, and
+ header fields have been moved here.
+
+ The requirement on semantic conformance has been replaced with
+ permission to ignore or work around implementation-specific failures.
+ (Section 2.2)
+
+ The description of an origin and authoritative access to origin
+ servers has been extended for both "http" and "https" URIs to account
+ for alternative services and secured connections that are not
+ necessarily based on TCP. (Sections 4.2.1, 4.2.2, 4.3.1, and 7.3.3)
+
+ Explicit requirements have been added to check the target URI
+ scheme's semantics and reject requests that don't meet any associated
+ requirements. (Section 7.4)
+
+ Parameters in media type, media range, and expectation can be empty
+ via one or more trailing semicolons. (Section 5.6.6)
+
+ "Field value" now refers to the value after multiple field lines are
+ combined with commas -- by far the most common use. To refer to a
+ single header line's value, use "field line value". (Section 6.3)
+
+ Trailer field semantics now transcend the specifics of chunked
+ transfer coding. The use of trailer fields has been further limited
+ to allow generation as a trailer field only when the sender knows the
+ field defines that usage and to allow merging into the header section
+ only if the recipient knows the corresponding field definition
+ permits and defines how to merge. In all other cases,
+ implementations are encouraged either to store the trailer fields
+ separately or to discard them instead of merging. (Section 6.5.1)
+
+ The priority of the absolute form of the request URI over the Host
+ header field by origin servers has been made explicit to align with
+ proxy handling. (Section 7.2)
+
+ The grammar definition for the Via field's "received-by" was expanded
+ in RFC 7230 due to changes in the URI grammar for host [URI] that are
+ not desirable for Via. For simplicity, we have removed uri-host from
+ the received-by production because it can be encompassed by the
+ existing grammar for pseudonym. In particular, this change removed
+ comma from the allowed set of characters for a host name in received-
+ by. (Section 7.6.3)
+
+B.3. Changes from RFC 7231
+
+ Minimum URI lengths to be supported by implementations are now
+ recommended. (Section 4.1)
+
+ The following have been clarified: CR and NUL in field values are to
+ be rejected or mapped to SP, and leading and trailing whitespace
+ needs to be stripped from field values before they are consumed.
+ (Section 5.5)
+
+ Parameters in media type, media range, and expectation can be empty
+ via one or more trailing semicolons. (Section 5.6.6)
+
+ An abstract data type for HTTP messages has been introduced to define
+ the components of a message and their semantics as an abstraction
+ across multiple HTTP versions, rather than in terms of the specific
+ syntax form of HTTP/1.1 in [HTTP/1.1], and reflect the contents after
+ the message is parsed. This makes it easier to distinguish between
+ requirements on the content (what is conveyed) versus requirements on
+ the messaging syntax (how it is conveyed) and avoids baking
+ limitations of early protocol versions into the future of HTTP.
+ (Section 6)
+
+ The terms "payload" and "payload body" have been replaced with
+ "content", to better align with its usage elsewhere (e.g., in field
+ names) and to avoid confusion with frame payloads in HTTP/2 and
+ HTTP/3. (Section 6.4)
+
+ The term "effective request URI" has been replaced with "target URI".
+ (Section 7.1)
+
+ Restrictions on client retries have been loosened to reflect
+ implementation behavior. (Section 9.2.2)
+
+ The fact that request bodies on GET, HEAD, and DELETE are not
+ interoperable has been clarified. (Sections 9.3.1, 9.3.2, and 9.3.5)
+
+ The use of the Content-Range header field (Section 14.4) as a request
+ modifier on PUT is allowed. (Section 9.3.4)
+
+ A superfluous requirement about setting Content-Length has been
+ removed from the description of the OPTIONS method. (Section 9.3.7)
+
+ The normative requirement to use the "message/http" media type in
+ TRACE responses has been removed. (Section 9.3.8)
+
+ List-based grammar for Expect has been restored for compatibility
+ with RFC 2616. (Section 10.1.1)
+
+ Accept and Accept-Encoding are allowed in response messages; the
+ latter was introduced by [RFC7694]. (Section 12.3)
+
+ "Accept Parameters" (accept-params and accept-ext ABNF production)
+ have been removed from the definition of the Accept field.
+ (Section 12.5.1)
+
+ The Accept-Charset field is now deprecated. (Section 12.5.2)
+
+ The semantics of "*" in the Vary header field when other values are
+ present was clarified. (Section 12.5.5)
+
+ Range units are compared in a case-insensitive fashion.
+ (Section 14.1)
+
+ The use of the Accept-Ranges field is not restricted to origin
+ servers. (Section 14.3)
+
+ The process of creating a redirected request has been clarified.
+ (Section 15.4)
+
+ Status code 308 (previously defined in [RFC7538]) has been added so
+ that it's defined closer to status codes 301, 302, and 307.
+ (Section 15.4.9)
+
+ Status code 421 (previously defined in Section 9.1.2 of [RFC7540])
+ has been added because of its general applicability. 421 is no longer
+ defined as heuristically cacheable since the response is specific to
+ the connection (not the target resource). (Section 15.5.20)
+
+ Status code 422 (previously defined in Section 11.2 of [WEBDAV]) has
+ been added because of its general applicability. (Section 15.5.21)
+
+B.4. Changes from RFC 7232
+
+ Previous revisions of HTTP imposed an arbitrary 60-second limit on
+ the determination of whether Last-Modified was a strong validator to
+ guard against the possibility that the Date and Last-Modified values
+ are generated from different clocks or at somewhat different times
+ during the preparation of the response. This specification has
+ relaxed that to allow reasonable discretion. (Section 8.8.2.2)
+
+ An edge-case requirement on If-Match and If-Unmodified-Since has been
+ removed that required a validator not to be sent in a 2xx response if
+ validation fails because the change request has already been applied.
+ (Sections 13.1.1 and 13.1.4)
+
+ The fact that If-Unmodified-Since does not apply to a resource
+ without a concept of modification time has been clarified.
+ (Section 13.1.4)
+
+ Preconditions can now be evaluated before the request content is
+ processed rather than waiting until the response would otherwise be
+ successful. (Section 13.2)
+
+B.5. Changes from RFC 7233
+
+ Refactored the range-unit and ranges-specifier grammars to simplify
+ and reduce artificial distinctions between bytes and other
+ (extension) range units, removing the overlapping grammar of other-
+ range-unit by defining range units generically as a token and placing
+ extensions within the scope of a range-spec (other-range). This
+ disambiguates the role of list syntax (commas) in all range sets,
+ including extension range units, for indicating a range-set of more
+ than one range. Moving the extension grammar into range specifiers
+ also allows protocol specific to byte ranges to be specified
+ separately.
+
+ It is now possible to define Range handling on extension methods.
+ (Section 14.2)
+
+ Described use of the Content-Range header field (Section 14.4) as a
+ request modifier to perform a partial PUT. (Section 14.5)
+
+B.6. Changes from RFC 7235
+
+ None.
+
+B.7. Changes from RFC 7538
+
+ None.
+
+B.8. Changes from RFC 7615
+
+ None.
+
+B.9. Changes from RFC 7694
+
+ This specification includes the extension defined in [RFC7694] but
+ leaves out examples and deployment considerations.
+
+Acknowledgements
+
+ Aside from the current editors, the following individuals deserve
+ special recognition for their contributions to early aspects of HTTP
+ and its core specifications: Marc Andreessen, Tim Berners-Lee, Robert
+ Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jim Gettys,
+ Jean-François Groff, Phillip M. Hallam-Baker, Koen Holtman, Jeffery
+ L. Hostetler, Shel Kaphan, Dave Kristol, Yves Lafon, Scott
+ D. Lawrence, Paul J. Leach, Håkon W. Lie, Ari Luotonen, Larry
+ Masinter, Rob McCool, Jeffrey C. Mogul, Lou Montulli, David Morris,
+ Henrik Frystyk Nielsen, Dave Raggett, Eric Rescorla, Tony Sanders,
+ Lawrence C. Stewart, Marc VanHeyningen, and Steve Zilles.
+
+ This document builds on the many contributions that went into past
+ specifications of HTTP, including [HTTP/1.0], [RFC2068], [RFC2145],
+ [RFC2616], [RFC2617], [RFC2818], [RFC7230], [RFC7231], [RFC7232],
+ [RFC7233], [RFC7234], and [RFC7235]. The acknowledgements within
+ those documents still apply.
+
+ Since 2014, the following contributors have helped improve this
+ specification by reporting bugs, asking smart questions, drafting or
+ reviewing text, and evaluating issues:
+
+ Alan Egerton, Alex Rousskov, Amichai Rothman, Amos Jeffries, Anders
+ Kaseorg, Andreas Gebhardt, Anne van Kesteren, Armin Abfalterer, Aron
+ Duby, Asanka Herath, Asbjørn Ulsberg, Asta Olofsson, Attila Gulyas,
+ Austin Wright, Barry Pollard, Ben Burkert, Benjamin Kaduk, Björn
+ Höhrmann, Brad Fitzpatrick, Chris Pacejo, Colin Bendell, Cory
+ Benfield, Cory Nelson, Daisuke Miyakawa, Dale Worley, Daniel
+ Stenberg, Danil Suits, David Benjamin, David Matson, David Schinazi,
+ Дилян Палаузов (Dilyan Palauzov), Eric Anderson, Eric Rescorla, Éric
+ Vyncke, Erik Kline, Erwin Pe, Etan Kissling, Evert Pot, Evgeny
+ Vrublevsky, Florian Best, Francesca Palombini, Igor Lubashev, James
+ Callahan, James Peach, Jeffrey Yasskin, Kalin Gyokov, Kannan Goundan,
+ 奥 一穂 (Kazuho Oku), Ken Murchison, Krzysztof Maczyński, Lars Eggert,
+ Lucas Pardue, Martin Duke, Martin Dürst, Martin Thomson, Martynas
+ Jusevičius, Matt Menke, Matthias Pigulla, Mattias Grenfeldt, Michael
+ Osipov, Mike Bishop, Mike Pennisi, Mike Taylor, Mike West, Mohit
+ Sethi, Murray Kucherawy, Nathaniel J. Smith, Nicholas Hurley, Nikita
+ Prokhorov, Patrick McManus, Piotr Sikora, Poul-Henning Kamp, Rick van
+ Rein, Robert Wilton, Roberto Polli, Roman Danyliw, Samuel Williams,
+ Semyon Kholodnov, Simon Pieters, Simon Schüppel, Stefan Eissing,
+ Taylor Hunt, Todd Greer, Tommy Pauly, Vasiliy Faronov, Vladimir
+ Lashchev, Wenbo Zhu, William A. Rowe Jr., Willy Tarreau, Xingwei Liu,
+ Yishuai Li, and Zaheduzzaman Sarker.
+
+Index
+
+ 1 2 3 4 5 A B C D E F G H I L M N O P R S T U V W X
+
+ 1
+
+ 100 Continue (status code) *_Section 15.2.1_*
+ 100-continue (expect value) *_Section 10.1.1_*
+ 101 Switching Protocols (status code) *_Section 15.2.2_*
+ 1xx Informational (status code class) *_Section 15.2_*
+
+ 2
+
+ 200 OK (status code) *_Section 15.3.1_*
+ 201 Created (status code) *_Section 15.3.2_*
+ 202 Accepted (status code) *_Section 15.3.3_*
+ 203 Non-Authoritative Information (status code) *_Section 15.3
+ .4_*
+ 204 No Content (status code) *_Section 15.3.5_*
+ 205 Reset Content (status code) *_Section 15.3.6_*
+ 206 Partial Content (status code) *_Section 15.3.7_*
+ 2xx Successful (status code class) *_Section 15.3_*
+
+ 3
+
+ 300 Multiple Choices (status code) *_Section 15.4.1_*
+ 301 Moved Permanently (status code) *_Section 15.4.2_*
+ 302 Found (status code) *_Section 15.4.3_*
+ 303 See Other (status code) *_Section 15.4.4_*
+ 304 Not Modified (status code) *_Section 15.4.5_*
+ 305 Use Proxy (status code) *_Section 15.4.6_*
+ 306 (Unused) (status code) *_Section 15.4.7_*
+ 307 Temporary Redirect (status code) *_Section 15.4.8_*
+ 308 Permanent Redirect (status code) *_Section 15.4.9_*
+ 3xx Redirection (status code class) *_Section 15.4_*
+
+ 4
+
+ 400 Bad Request (status code) *_Section 15.5.1_*
+ 401 Unauthorized (status code) *_Section 15.5.2_*
+ 402 Payment Required (status code) *_Section 15.5.3_*
+ 403 Forbidden (status code) *_Section 15.5.4_*
+ 404 Not Found (status code) *_Section 15.5.5_*
+ 405 Method Not Allowed (status code) *_Section 15.5.6_*
+ 406 Not Acceptable (status code) *_Section 15.5.7_*
+ 407 Proxy Authentication Required (status code) *_Section 15.5
+ .8_*
+ 408 Request Timeout (status code) *_Section 15.5.9_*
+ 409 Conflict (status code) *_Section 15.5.10_*
+ 410 Gone (status code) *_Section 15.5.11_*
+ 411 Length Required (status code) *_Section 15.5.12_*
+ 412 Precondition Failed (status code) *_Section 15.5.13_*
+ 413 Content Too Large (status code) *_Section 15.5.14_*
+ 414 URI Too Long (status code) *_Section 15.5.15_*
+ 415 Unsupported Media Type (status code) *_Section 15.5.16_*
+ 416 Range Not Satisfiable (status code) *_Section 15.5.17_*
+ 417 Expectation Failed (status code) *_Section 15.5.18_*
+ 418 (Unused) (status code) *_Section 15.5.19_*
+ 421 Misdirected Request (status code) *_Section 15.5.20_*
+ 422 Unprocessable Content (status code) *_Section 15.5.21_*
+ 426 Upgrade Required (status code) *_Section 15.5.22_*
+ 4xx Client Error (status code class) *_Section 15.5_*
+
+ 5
+
+ 500 Internal Server Error (status code) *_Section 15.6.1_*
+ 501 Not Implemented (status code) *_Section 15.6.2_*
+ 502 Bad Gateway (status code) *_Section 15.6.3_*
+ 503 Service Unavailable (status code) *_Section 15.6.4_*
+ 504 Gateway Timeout (status code) *_Section 15.6.5_*
+ 505 HTTP Version Not Supported (status code) *_Section 15.6.6_
+ *
+ 5xx Server Error (status code class) *_Section 15.6_*
+
+ A
+
+ accelerator *_Section 3.7, Paragraph 6_*
+ Accept header field *_Section 12.5.1_*
+ Accept-Charset header field *_Section 12.5.2_*
+ Accept-Encoding header field *_Section 12.5.3_*
+ Accept-Language header field *_Section 12.5.4_*
+ Accept-Ranges header field *_Section 14.3_*
+ Allow header field *_Section 10.2.1_*
+ Authentication-Info header field *_Section 11.6.3_*
+ authoritative response *_Section 17.1_*
+ Authorization header field *_Section 11.6.2_*
+
+ B
+
+ browser *_Section 3.5_*
+
+ C
+
+ cache *_Section 3.8_*
+ cacheable *_Section 3.8, Paragraph 4_*
+ client *_Section 3.3_*
+ clock *_Section 5.6.7_*
+ complete *_Section 6.1_*
+ compress (Coding Format) Section 8.4.1.1
+ compress (content coding) *_Section 8.4.1_*
+ conditional request *_Section 13_*
+ CONNECT method *_Section 9.3.6_*
+ connection *_Section 3.3_*
+ Connection header field *_Section 7.6.1_*
+ content Section 6.4
+ content coding *_Section 8.4.1_*
+ content negotiation Section 1.3, Paragraph 4
+ Content-Encoding header field *_Section 8.4_*
+ Content-Language header field *_Section 8.5_*
+ Content-Length header field *_Section 8.6_*
+ Content-Location header field *_Section 8.7_*
+ Content-MD5 header field *_Section 18.4, Paragraph 10_*
+ Content-Range header field *_Section 14.4_*; Section 14.5
+ Content-Type header field *_Section 8.3_*
+ control data *_Section 6.2_*
+
+ D
+
+ Date header field *_Section 6.6.1_*
+ deflate (Coding Format) Section 8.4.1.2
+ deflate (content coding) *_Section 8.4.1_*
+ DELETE method *_Section 9.3.5_*
+ Delimiters Section 5.6.2, Paragraph 3
+ downstream *_Section 3.7, Paragraph 4_*
+
+ E
+
+ effective request URI *_Section 7.1, Paragraph 8.1_*
+ ETag field *_Section 8.8.3_*
+ Expect header field *_Section 10.1.1_*
+
+ F
+
+ field *_Section 5_*; Section 6.3
+ field line Section 5.2, Paragraph 1
+ field line value Section 5.2, Paragraph 1
+ field name Section 5.2, Paragraph 1
+ field value Section 5.2, Paragraph 2
+ Fields
+ * *_Section 18.4, Paragraph 9_*
+ Accept *_Section 12.5.1_*
+ Accept-Charset *_Section 12.5.2_*
+ Accept-Encoding *_Section 12.5.3_*
+ Accept-Language *_Section 12.5.4_*
+ Accept-Ranges *_Section 14.3_*
+ Allow *_Section 10.2.1_*
+ Authentication-Info *_Section 11.6.3_*
+ Authorization *_Section 11.6.2_*
+ Connection *_Section 7.6.1_*
+ Content-Encoding *_Section 8.4_*
+ Content-Language *_Section 8.5_*
+ Content-Length *_Section 8.6_*
+ Content-Location *_Section 8.7_*
+ Content-MD5 *_Section 18.4, Paragraph 10_*
+ Content-Range *_Section 14.4_*; Section 14.5
+ Content-Type *_Section 8.3_*
+ Date *_Section 6.6.1_*
+ ETag *_Section 8.8.3_*
+ Expect *_Section 10.1.1_*
+ From *_Section 10.1.2_*
+ Host *_Section 7.2_*
+ If-Match *_Section 13.1.1_*
+ If-Modified-Since *_Section 13.1.3_*
+ If-None-Match *_Section 13.1.2_*
+ If-Range *_Section 13.1.5_*
+ If-Unmodified-Since *_Section 13.1.4_*
+ Last-Modified *_Section 8.8.2_*
+ Location *_Section 10.2.2_*
+ Max-Forwards *_Section 7.6.2_*
+ Proxy-Authenticate *_Section 11.7.1_*
+ Proxy-Authentication-Info *_Section 11.7.3_*
+ Proxy-Authorization *_Section 11.7.2_*
+ Range *_Section 14.2_*
+ Referer *_Section 10.1.3_*
+ Retry-After *_Section 10.2.3_*
+ Server *_Section 10.2.4_*
+ TE *_Section 10.1.4_*
+ Trailer *_Section 6.6.2_*
+ Upgrade *_Section 7.8_*
+ User-Agent *_Section 10.1.5_*
+ Vary *_Section 12.5.5_*
+ Via *_Section 7.6.3_*
+ WWW-Authenticate *_Section 11.6.1_*
+ Fragment Identifiers Section 4.2.5
+ From header field *_Section 10.1.2_*
+
+ G
+
+ gateway *_Section 3.7, Paragraph 6_*
+ GET method *_Section 9.3.1_*
+ Grammar
+ ALPHA *_Section 2.1_*
+ Accept *_Section 12.5.1_*
+ Accept-Charset *_Section 12.5.2_*
+ Accept-Encoding *_Section 12.5.3_*
+ Accept-Language *_Section 12.5.4_*
+ Accept-Ranges *_Section 14.3_*
+ Allow *_Section 10.2.1_*
+ Authentication-Info *_Section 11.6.3_*
+ Authorization *_Section 11.6.2_*
+ BWS *_Section 5.6.3_*
+ CR *_Section 2.1_*
+ CRLF *_Section 2.1_*
+ CTL *_Section 2.1_*
+ Connection *_Section 7.6.1_*
+ Content-Encoding *_Section 8.4_*
+ Content-Language *_Section 8.5_*
+ Content-Length *_Section 8.6_*
+ Content-Location *_Section 8.7_*
+ Content-Range *_Section 14.4_*
+ Content-Type *_Section 8.3_*
+ DIGIT *_Section 2.1_*
+ DQUOTE *_Section 2.1_*
+ Date *_Section 6.6.1_*
+ ETag *_Section 8.8.3_*
+ Expect *_Section 10.1.1_*
+ From *_Section 10.1.2_*
+ GMT *_Section 5.6.7_*
+ HEXDIG *_Section 2.1_*
+ HTAB *_Section 2.1_*
+ HTTP-date *_Section 5.6.7_*
+ Host *_Section 7.2_*
+ IMF-fixdate *_Section 5.6.7_*
+ If-Match *_Section 13.1.1_*
+ If-Modified-Since *_Section 13.1.3_*
+ If-None-Match *_Section 13.1.2_*
+ If-Range *_Section 13.1.5_*
+ If-Unmodified-Since *_Section 13.1.4_*
+ LF *_Section 2.1_*
+ Last-Modified *_Section 8.8.2_*
+ Location *_Section 10.2.2_*
+ Max-Forwards *_Section 7.6.2_*
+ OCTET *_Section 2.1_*
+ OWS *_Section 5.6.3_*
+ Proxy-Authenticate *_Section 11.7.1_*
+ Proxy-Authentication-Info *_Section 11.7.3_*
+ Proxy-Authorization *_Section 11.7.2_*
+ RWS *_Section 5.6.3_*
+ Range *_Section 14.2_*
+ Referer *_Section 10.1.3_*
+ Retry-After *_Section 10.2.3_*
+ SP *_Section 2.1_*
+ Server *_Section 10.2.4_*
+ TE *_Section 10.1.4_*
+ Trailer *_Section 6.6.2_*
+ URI-reference *_Section 4.1_*
+ Upgrade *_Section 7.8_*
+ User-Agent *_Section 10.1.5_*
+ VCHAR *_Section 2.1_*
+ Vary *_Section 12.5.5_*
+ Via *_Section 7.6.3_*
+ WWW-Authenticate *_Section 11.6.1_*
+ absolute-URI *_Section 4.1_*
+ absolute-path *_Section 4.1_*
+ acceptable-ranges *_Section 14.3_*
+ asctime-date *_Section 5.6.7_*
+ auth-param *_Section 11.2_*
+ auth-scheme *_Section 11.1_*
+ authority *_Section 4.1_*
+ challenge *_Section 11.3_*
+ codings *_Section 12.5.3_*
+ comment *_Section 5.6.5_*
+ complete-length *_Section 14.4_*
+ connection-option *_Section 7.6.1_*
+ content-coding *_Section 8.4.1_*
+ credentials *_Section 11.4_*
+ ctext *_Section 5.6.5_*
+ date1 *_Section 5.6.7_*
+ day *_Section 5.6.7_*
+ day-name *_Section 5.6.7_*
+ day-name-l *_Section 5.6.7_*
+ delay-seconds *_Section 10.2.3_*
+ entity-tag *_Section 8.8.3_*
+ etagc *_Section 8.8.3_*
+ field-content *_Section 5.5_*
+ field-name *_Section 5.1_*; Section 6.6.2
+ field-value *_Section 5.5_*
+ field-vchar *_Section 5.5_*
+ first-pos *_Section 14.1.1_*; Section 14.4
+ hour *_Section 5.6.7_*
+ http-URI *_Section 4.2.1_*
+ https-URI *_Section 4.2.2_*
+ incl-range *_Section 14.4_*
+ int-range *_Section 14.1.1_*
+ language-range *_Section 12.5.4_*
+ language-tag *_Section 8.5.1_*
+ last-pos *_Section 14.1.1_*; Section 14.4
+ media-range *_Section 12.5.1_*
+ media-type *_Section 8.3.1_*
+ method *_Section 9.1_*
+ minute *_Section 5.6.7_*
+ month *_Section 5.6.7_*
+ obs-date *_Section 5.6.7_*
+ obs-text *_Section 5.5_*
+ opaque-tag *_Section 8.8.3_*
+ other-range *_Section 14.1.1_*
+ parameter *_Section 5.6.6_*
+ parameter-name *_Section 5.6.6_*
+ parameter-value *_Section 5.6.6_*
+ parameters *_Section 5.6.6_*
+ partial-URI *_Section 4.1_*
+ port *_Section 4.1_*
+ product *_Section 10.1.5_*
+ product-version *_Section 10.1.5_*
+ protocol-name *_Section 7.6.3_*
+ protocol-version *_Section 7.6.3_*
+ pseudonym *_Section 7.6.3_*
+ qdtext *_Section 5.6.4_*
+ query *_Section 4.1_*
+ quoted-pair *_Section 5.6.4_*
+ quoted-string *_Section 5.6.4_*
+ qvalue *_Section 12.4.2_*
+ range-resp *_Section 14.4_*
+ range-set *_Section 14.1.1_*
+ range-spec *_Section 14.1.1_*
+ range-unit *_Section 14.1_*
+ ranges-specifier *_Section 14.1.1_*
+ received-by *_Section 7.6.3_*
+ received-protocol *_Section 7.6.3_*
+ rfc850-date *_Section 5.6.7_*
+ second *_Section 5.6.7_*
+ segment *_Section 4.1_*
+ subtype *_Section 8.3.1_*
+ suffix-length *_Section 14.1.1_*
+ suffix-range *_Section 14.1.1_*
+ t-codings *_Section 10.1.4_*
+ tchar *_Section 5.6.2_*
+ time-of-day *_Section 5.6.7_*
+ token *_Section 5.6.2_*
+ token68 *_Section 11.2_*
+ transfer-coding *_Section 10.1.4_*
+ transfer-parameter *_Section 10.1.4_*
+ type *_Section 8.3.1_*
+ unsatisfied-range *_Section 14.4_*
+ uri-host *_Section 4.1_*
+ weak *_Section 8.8.3_*
+ weight *_Section 12.4.2_*
+ year *_Section 5.6.7_*
+ gzip (Coding Format) Section 8.4.1.3
+ gzip (content coding) *_Section 8.4.1_*
+
+ H
+
+ HEAD method *_Section 9.3.2_*
+ Header Fields
+ Accept *_Section 12.5.1_*
+ Accept-Charset *_Section 12.5.2_*
+ Accept-Encoding *_Section 12.5.3_*
+ Accept-Language *_Section 12.5.4_*
+ Accept-Ranges *_Section 14.3_*
+ Allow *_Section 10.2.1_*
+ Authentication-Info *_Section 11.6.3_*
+ Authorization *_Section 11.6.2_*
+ Connection *_Section 7.6.1_*
+ Content-Encoding *_Section 8.4_*
+ Content-Language *_Section 8.5_*
+ Content-Length *_Section 8.6_*
+ Content-Location *_Section 8.7_*
+ Content-MD5 *_Section 18.4, Paragraph 10_*
+ Content-Range *_Section 14.4_*; Section 14.5
+ Content-Type *_Section 8.3_*
+ Date *_Section 6.6.1_*
+ ETag *_Section 8.8.3_*
+ Expect *_Section 10.1.1_*
+ From *_Section 10.1.2_*
+ Host *_Section 7.2_*
+ If-Match *_Section 13.1.1_*
+ If-Modified-Since *_Section 13.1.3_*
+ If-None-Match *_Section 13.1.2_*
+ If-Range *_Section 13.1.5_*
+ If-Unmodified-Since *_Section 13.1.4_*
+ Last-Modified *_Section 8.8.2_*
+ Location *_Section 10.2.2_*
+ Max-Forwards *_Section 7.6.2_*
+ Proxy-Authenticate *_Section 11.7.1_*
+ Proxy-Authentication-Info *_Section 11.7.3_*
+ Proxy-Authorization *_Section 11.7.2_*
+ Range *_Section 14.2_*
+ Referer *_Section 10.1.3_*
+ Retry-After *_Section 10.2.3_*
+ Server *_Section 10.2.4_*
+ TE *_Section 10.1.4_*
+ Trailer *_Section 6.6.2_*
+ Upgrade *_Section 7.8_*
+ User-Agent *_Section 10.1.5_*
+ Vary *_Section 12.5.5_*
+ Via *_Section 7.6.3_*
+ WWW-Authenticate *_Section 11.6.1_*
+ header section *_Section 6.3_*
+ Host header field *_Section 7.2_*
+ http URI scheme *_Section 4.2.1_*
+ https URI scheme *_Section 4.2.2_*
+
+ I
+
+ idempotent *_Section 9.2.2_*
+ If-Match header field *_Section 13.1.1_*
+ If-Modified-Since header field *_Section 13.1.3_*
+ If-None-Match header field *_Section 13.1.2_*
+ If-Range header field *_Section 13.1.5_*
+ If-Unmodified-Since header field *_Section 13.1.4_*
+ inbound *_Section 3.7, Paragraph 4_*
+ incomplete *_Section 6.1_*
+ interception proxy *_Section 3.7, Paragraph 10_*
+ intermediary *_Section 3.7_*
+
+ L
+
+ Last-Modified header field *_Section 8.8.2_*
+ list-based field Section 5.5, Paragraph 7
+ Location header field *_Section 10.2.2_*
+
+ M
+
+ Max-Forwards header field *_Section 7.6.2_*
+ Media Type
+ multipart/byteranges *_Section 14.6_*
+ multipart/x-byteranges Section 14.6, Paragraph 4, Item 3
+ message Section 3.4; *_Section 6_*
+ message abstraction *_Section 6_*
+ messages *_Section 3.4_*
+ metadata *_Section 8.8_*
+ Method
+ * *_Section 18.2, Paragraph 3_*
+ CONNECT *_Section 9.3.6_*
+ DELETE *_Section 9.3.5_*
+ GET *_Section 9.3.1_*
+ HEAD *_Section 9.3.2_*
+ OPTIONS *_Section 9.3.7_*
+ POST *_Section 9.3.3_*
+ PUT *_Section 9.3.4_*
+ TRACE *_Section 9.3.8_*
+ multipart/byteranges Media Type *_Section 14.6_*
+ multipart/x-byteranges Media Type Section 14.6, Paragraph 4,
+ Item 3
+
+ N
+
+ non-transforming proxy *_Section 7.7_*
+
+ O
+
+ OPTIONS method *_Section 9.3.7_*
+ origin *_Section 4.3.1_*; Section 11.5
+ origin server *_Section 3.6_*
+ outbound *_Section 3.7, Paragraph 4_*
+
+ P
+
+ phishing *_Section 17.1_*
+ POST method *_Section 9.3.3_*
+ Protection Space Section 11.5
+ proxy *_Section 3.7, Paragraph 5_*
+ Proxy-Authenticate header field *_Section 11.7.1_*
+ Proxy-Authentication-Info header field *_Section 11.7.3_*
+ Proxy-Authorization header field *_Section 11.7.2_*
+ PUT method *_Section 9.3.4_*
+
+ R
+
+ Range header field *_Section 14.2_*
+ Realm Section 11.5
+ recipient *_Section 3.4_*
+ Referer header field *_Section 10.1.3_*
+ representation *_Section 3.2_*
+ request *_Section 3.4_*
+ request target *_Section 7.1_*
+ resource *_Section 3.1_*; Section 4
+ response *_Section 3.4_*
+ Retry-After header field *_Section 10.2.3_*
+ reverse proxy *_Section 3.7, Paragraph 6_*
+
+ S
+
+ safe *_Section 9.2.1_*
+ satisfiable range *_Section 14.1.1_*
+ secured *_Section 4.2.2_*
+ selected representation *_Section 3.2, Paragraph 4_*;
+ Section 8.8; Section 13.1
+ self-descriptive *_Section 6_*
+ sender *_Section 3.4_*
+ server *_Section 3.3_*
+ Server header field *_Section 10.2.4_*
+ singleton field Section 5.5, Paragraph 6
+ spider *_Section 3.5_*
+ Status Code Section 15
+ Status Codes
+ Final Section 15, Paragraph 7
+ Informational Section 15, Paragraph 7
+ Interim Section 15, Paragraph 7
+ Status Codes Classes
+ 1xx Informational *_Section 15.2_*
+ 2xx Successful *_Section 15.3_*
+ 3xx Redirection *_Section 15.4_*
+ 4xx Client Error *_Section 15.5_*
+ 5xx Server Error *_Section 15.6_*
+
+ T
+
+ target resource *_Section 7.1_*
+ target URI *_Section 7.1_*
+ TE header field *_Section 10.1.4_*
+ TRACE method *_Section 9.3.8_*
+ Trailer Fields *_Section 6.5_*
+ ETag *_Section 8.8.3_*
+ Trailer header field *_Section 6.6.2_*
+ trailer section *_Section 6.5_*
+ trailers *_Section 6.5_*
+ transforming proxy *_Section 7.7_*
+ transparent proxy *_Section 3.7, Paragraph 10_*
+ tunnel *_Section 3.7, Paragraph 8_*
+
+ U
+
+ unsatisfiable range *_Section 14.1.1_*
+ Upgrade header field *_Section 7.8_*
+ upstream *_Section 3.7, Paragraph 4_*
+ URI *_Section 4_*
+ origin *_Section 4.3.1_*
+ URI reference *_Section 4.1_*
+ URI scheme
+ http *_Section 4.2.1_*
+ https *_Section 4.2.2_*
+ user agent *_Section 3.5_*
+ User-Agent header field *_Section 10.1.5_*
+
+ V
+
+ validator *_Section 8.8_*
+ strong *_Section 8.8.1_*
+ weak *_Section 8.8.1_*
+ Vary header field *_Section 12.5.5_*
+ Via header field *_Section 7.6.3_*
+
+ W
+
+ WWW-Authenticate header field *_Section 11.6.1_*
+
+ X
+
+ x-compress (content coding) *_Section 8.4.1_*
+ x-gzip (content coding) *_Section 8.4.1_*
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Adobe
+ 345 Park Ave
+ San Jose, CA 95110
+ United States of America
+ Email: fielding@gbiv.com
+ URI: https://roy.gbiv.com/
+
+
+ Mark Nottingham (editor)
+ Fastly
+ Prahran
+ Australia
+ Email: mnot@mnot.net
+ URI: https://www.mnot.net/
+
+
+ Julian Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ 48155 Münster
+ Germany
+ Email: julian.reschke@greenbytes.de
+ URI: https://greenbytes.de/tech/webdav/