rfc9205v1.txt | rfc9205.txt | |||
---|---|---|---|---|
skipping to change at line 68 ¶ | skipping to change at line 68 ¶ | |||
3.1. Generic Semantics | 3.1. Generic Semantics | |||
3.2. Links | 3.2. Links | |||
3.3. Rich Functionality | 3.3. Rich Functionality | |||
4. Best Practices for Specifying the Use of HTTP | 4. Best Practices for Specifying the Use of HTTP | |||
4.1. Specifying the Use of HTTP | 4.1. Specifying the Use of HTTP | |||
4.2. Specifying Server Behaviour | 4.2. Specifying Server Behaviour | |||
4.3. Specifying Client Behaviour | 4.3. Specifying Client Behaviour | |||
4.4. Specifying URLs | 4.4. Specifying URLs | |||
4.4.1. Discovering an Application's URLs | 4.4.1. Discovering an Application's URLs | |||
4.4.2. Considering URI Schemes | 4.4.2. Considering URI Schemes | |||
4.4.3. Transport Ports | 4.4.3. Choosing Transport Ports | |||
4.5. Using HTTP Methods | 4.5. Using HTTP Methods | |||
4.5.1. GET | 4.5.1. GET | |||
4.5.2. OPTIONS | 4.5.2. OPTIONS | |||
4.6. Using HTTP Status Codes | 4.6. Using HTTP Status Codes | |||
4.6.1. Redirection | 4.6.1. Redirection | |||
4.7. Specifying HTTP Header Fields | 4.7. Specifying HTTP Header Fields | |||
4.8. Defining Message Content | 4.8. Defining Message Content | |||
4.9. Leveraging HTTP Caching | 4.9. Leveraging HTTP Caching | |||
4.9.1. Freshness | 4.9.1. Freshness | |||
4.9.2. Stale Responses | 4.9.2. Stale Responses | |||
skipping to change at line 155 ¶ | skipping to change at line 155 ¶ | |||
ones? | ones? | |||
* How can the maximum value be extracted from the use of HTTP? | * How can the maximum value be extracted from the use of HTTP? | |||
* How does it coexist with other uses of HTTP -- especially Web | * How does it coexist with other uses of HTTP -- especially Web | |||
browsing? | browsing? | |||
* How can interoperability problems and "protocol dead ends" be | * How can interoperability problems and "protocol dead ends" be | |||
avoided? | avoided? | |||
This document contains best current practices for the specification | Section 2 defines when this document applies, Section 3 surveys the | |||
of such applications. Section 2 defines when it applies, Section 3 | properties of HTTP that are important to preserve, and Section 4 | |||
surveys the properties of HTTP that are important to preserve, and | contains best practices for the specification of applications that | |||
Section 4 conveys best practices for specifying them. | use HTTP. | |||
It is written primarily to guide IETF efforts to define application | It is written primarily to guide IETF efforts to define application | |||
protocols using HTTP for deployment on the Internet but might be | protocols using HTTP for deployment on the Internet but might be | |||
applicable in other situations. Note that the requirements herein do | applicable in other situations. Note that the requirements herein do | |||
not necessarily apply to the development of generic HTTP extensions. | not necessarily apply to the development of generic HTTP extensions. | |||
This document obsoletes [RFC3205] to reflect the experience and | This document obsoletes [RFC3205] to reflect the experience and | |||
developments regarding HTTP in the intervening time. | developments regarding HTTP in the intervening time. | |||
1.1. Notational Conventions | 1.1. Notational Conventions | |||
skipping to change at line 210 ¶ | skipping to change at line 210 ¶ | |||
encouraged to adhere to its requirements. | encouraged to adhere to its requirements. | |||
2.1. Non-HTTP Protocols | 2.1. Non-HTTP Protocols | |||
An application can rely upon HTTP without meeting the criteria for | An application can rely upon HTTP without meeting the criteria for | |||
using it as defined above. For example, an application might wish to | using it as defined above. For example, an application might wish to | |||
avoid re-specifying parts of the message format but might change | avoid re-specifying parts of the message format but might change | |||
other aspects of the protocol's operation, or it might want to use | other aspects of the protocol's operation, or it might want to use | |||
application-specific methods. | application-specific methods. | |||
Doing so brings more freedom to modify protocol operations, but loses | Doing so permits more freedom to modify protocol operations, but at | |||
at least a portion of the benefits outlined in Section 3, as most | least a portion of the benefits outlined in Section 3 are lost as | |||
HTTP implementations won't be easily adaptable to these changes, and | most HTTP implementations won't be easily adaptable to these changes. | |||
the benefit of mindshare will be lost. | The benefit of mindshare will also be lost. | |||
Such specifications MUST NOT use HTTP's URI schemes, transport ports, | Such specifications MUST NOT use HTTP's URI schemes, transport ports, | |||
ALPN protocol IDs, or IANA registries; rather, they are encouraged to | ALPN protocol IDs, or IANA registries; rather, they are encouraged to | |||
establish their own. | establish their own. | |||
3. What's Important About HTTP | 3. What's Important About HTTP | |||
This section examines the characteristics of HTTP that are important | This section examines the characteristics of HTTP that are important | |||
to consider when using HTTP to define an application protocol. | to consider when using HTTP to define an application protocol. | |||
3.1. Generic Semantics | 3.1. Generic Semantics | |||
Much of the value of HTTP is in its generic semantics -- that is, the | Much of the value of HTTP is in its generic semantics -- that is, the | |||
protocol elements defined by HTTP are potentially applicable to every | protocol elements defined by HTTP are potentially applicable to every | |||
resource and are not specific to a particular context. Application- | resource and are not specific to a particular context. Application- | |||
specific semantics are best expressed in message content and in | specific semantics are best expressed in message content and header | |||
header fields, not status codes or methods (although the latter do | fields, not status codes or methods (although status codes and | |||
have generic semantics that relate to application state). | methods do have generic semantics that relate to application state). | |||
This generic/application-specific split allows an HTTP message to be | This split between generic and application-specific semantics allows | |||
handled by common software (e.g., HTTP servers, intermediaries, | an HTTP message to be handled by common software (e.g., HTTP servers, | |||
client implementations, and caches) without understanding the | intermediaries, client implementations, and caches) without requiring | |||
specific application. It also allows people to leverage their | those implementations to understand the application in use. It also | |||
knowledge of HTTP semantics without specialising them for a | allows people to leverage their knowledge of HTTP semantics without | |||
particular application. | needing specialised knowledge of a particular application. | |||
Therefore, applications that use HTTP MUST NOT redefine, refine, or | Therefore, applications that use HTTP MUST NOT redefine, refine, or | |||
overlay the semantics of generic protocol elements such as methods, | overlay the semantics of generic protocol elements such as methods, | |||
status codes, or existing header fields. Instead, they should focus | status codes, or existing header fields. Instead, they should focus | |||
their specifications on protocol elements that are specific to that | their specifications on protocol elements that are specific to that | |||
application -- namely, their HTTP resources. | application -- namely, their HTTP resources. | |||
When writing a specification, it's often tempting to specify exactly | When writing a specification, it's often tempting to specify exactly | |||
how HTTP is to be implemented, supported, and used. However, this | how HTTP is to be implemented, supported, and used. However, this | |||
can easily lead to an unintended profile of HTTP behaviour. For | can easily lead to an unintended profile of HTTP behaviour. For | |||
example, it's common to see specifications with language like this: | example, it's common to see specifications with language like this: | |||
A 'POST' request MUST result in a '201 Created' response. | | A POST request MUST result in a 201 (Created) response. | |||
This forms an expectation in the client that the response will always | This forms an expectation in the client that the response will always | |||
be 201 Created when in fact there are a number of reasons why the | be 201 (Created) when in fact there are a number of reasons why the | |||
status code might differ in a real deployment; for example, there | status code might differ in a real deployment; for example, there | |||
might be a proxy that requires authentication, or a server-side | might be a proxy that requires authentication, or a server-side | |||
error, or a redirection. If the client does not anticipate this, the | error, or a redirection. If the client does not anticipate this, the | |||
application's deployment is brittle. | application's deployment is brittle. | |||
See Section 4.2 for more details. | See Section 4.2 for more details. | |||
3.2. Links | 3.2. Links | |||
Another common practice is assuming that the HTTP server's namespace | Another common practice is assuming that the HTTP server's namespace | |||
(or a portion thereof) is exclusively for the use of a single | (or a portion thereof) is exclusively for the use of a single | |||
application. This effectively overlays special, application-specific | application. This effectively overlays special, application-specific | |||
semantics onto that space and precludes other applications from using | semantics onto that space and precludes other applications from using | |||
it. | it. | |||
As explained in [RFC8820], such "squatting" on a part of the URL | As explained in [BCP190], such "squatting" on a part of the URL space | |||
space by a standard usurps the server's authority over its own | by a standard usurps the server's authority over its own resources, | |||
resources, can cause deployment issues, and is therefore bad practice | can cause deployment issues, and is therefore bad practice in | |||
in standards. | standards. | |||
Instead of statically defining URI components like paths, it is | Instead of statically defining URI components like paths, it is | |||
RECOMMENDED that applications using HTTP define and use links | RECOMMENDED that applications using HTTP define and use links | |||
[WEB-LINKING] to allow flexibility in deployment. | [WEB-LINKING] to allow flexibility in deployment. | |||
Using runtime links in this fashion has a number of other benefits -- | Using runtime links in this fashion has a number of other benefits -- | |||
especially when an application is to have multiple implementations | especially when an application is to have multiple implementations | |||
and/or deployments (as is often the case for those that are | and/or deployments (as is often the case for those that are | |||
standardised). | standardised). | |||
For example, navigating with a link allows a request to be routed to | For example, navigating with a link allows a request to be routed to | |||
a different server without the overhead of a redirection, thereby | a different server without the overhead of a redirection, thereby | |||
supporting deployment across machines well. | supporting deployment across machines well. | |||
It also becomes possible to "mix and match" different applications on | By using links, it also becomes possible to "mix and match" different | |||
the same server and offers a natural mechanism for extensibility, | applications on the same server. The use of links also offers a | |||
versioning, and capability management since the document containing | natural mechanism for extensibility, versioning, and capability | |||
the links can also contain information about their targets. | management because the document containing the links can also contain | |||
information about their targets. | ||||
Using links also offers a form of cache invalidation that's seen on | Using links also offers a form of cache invalidation that's seen on | |||
the Web; when a resource's state changes, the application can change | the Web; when a resource's state changes, the application can change | |||
its link to it so that a fresh copy is always fetched. | the affected links so that a fresh copy is always fetched. | |||
3.3. Rich Functionality | 3.3. Rich Functionality | |||
HTTP offers a number of features to applications, such as: | HTTP offers a number of features to applications, such as: | |||
* Message framing | * Message framing | |||
* Multiplexing (in HTTP/2 [HTTP2] and HTTP/3 [HTTP3]) | * Multiplexing (in HTTP/2 [HTTP2] and HTTP/3 [HTTP3]) | |||
* Integration with TLS | * Integration with TLS | |||
skipping to change at line 325 ¶ | skipping to change at line 326 ¶ | |||
and reliability | and reliability | |||
* Granularity of access control (through use of a rich space of | * Granularity of access control (through use of a rich space of | |||
URLs) | URLs) | |||
* Partial content to selectively request part of a response | * Partial content to selectively request part of a response | |||
* The ability to interact with the application easily using a Web | * The ability to interact with the application easily using a Web | |||
browser | browser | |||
Applications that use HTTP are encouraged to utilise the various | An application that uses HTTP is encouraged to utilise the various | |||
features that the protocol offers so that their users receive the | features that the protocol offers so that its users receive the | |||
maximum benefit from it and to allow it to be deployed in a variety | maximum benefit from those features and so that the application can | |||
of situations. This document does not require specific features to | be deployed in a variety of situations. This document does not | |||
be used since the appropriate design trade-offs are highly specific | require specific features to be used since the appropriate design | |||
to a given situation. However, following the practices in Section 4 | trade-offs are highly specific to a given situation. However, | |||
is a good starting point. | following the practices in Section 4 is a good starting point. | |||
4. Best Practices for Specifying the Use of HTTP | 4. Best Practices for Specifying the Use of HTTP | |||
This section contains best practices for specifying the use of HTTP | This section contains best practices for specifying the use of HTTP | |||
by applications, including practices for specific HTTP protocol | by applications, including practices for specific HTTP protocol | |||
elements. | elements. | |||
4.1. Specifying the Use of HTTP | 4.1. Specifying the Use of HTTP | |||
Specifications should use [HTTP] as the primary reference for HTTP; | Specifications should use [HTTP] as the primary reference for HTTP; | |||
skipping to change at line 394 ¶ | skipping to change at line 395 ¶ | |||
* HTTP header fields, per Section 4.7; and | * HTTP header fields, per Section 4.7; and | |||
* The behaviour of resources, as identified by link relations | * The behaviour of resources, as identified by link relations | |||
[WEB-LINKING]. | [WEB-LINKING]. | |||
An application can define its operation by composing these protocol | An application can define its operation by composing these protocol | |||
elements to define a set of resources that are identified by link | elements to define a set of resources that are identified by link | |||
relations and that implement specified behaviours, including: | relations and that implement specified behaviours, including: | |||
* retrieval of their state using GET in one or more formats | * retrieval of resource state using GET in one or more formats | |||
identified by media type; | identified by media type; | |||
* resource creation or update using POST or PUT, with an | * resource creation or update using POST or PUT, with an | |||
appropriately identified request content format; | appropriately identified request content format; | |||
* data processing using POST and identified request and response | * data processing using POST and identified request and response | |||
content format(s); and | content format(s); and | |||
* Resource deletion using DELETE. | * Resource deletion using DELETE. | |||
For example, an application might specify: | For example, an application might specify: | |||
Resources linked to with the "example-widget" link relation type are | | Resources linked to with the "example-widget" link relation type | |||
Widgets. The state of a Widget can be fetched in the | | are Widgets. The state of a Widget can be fetched in the | |||
"application/example-widget+json" format, and can be updated by PUT | | "application/example-widget+json" format, and can be updated by | |||
to the same link. Widget resources can be deleted. | | PUT to the same link. Widget resources can be deleted. | |||
| | ||||
The "Example-Count" response header field on Widget representations | | The Example-Count response header field on Widget representations | |||
indicates how many Widgets are held by the sender. | | indicates how many Widgets are held by the sender. | |||
| | ||||
The "application/example-widget+json" format is a JSON [RFC8259] | | The "application/example-widget+json" format is a JSON [RFC8259] | |||
format representing the state of a Widget. It contains links to | | format representing the state of a Widget. It contains links to | |||
related information in the link indicated by the Link header field | | related information in the link indicated by the Link header field | |||
value with the "example-other-info" link relation type. | | value with the "example-other-info" link relation type. | |||
Applications can also specify the use of URI Templates [URI-TEMPLATE] | Applications can also specify the use of URI Templates [URI-TEMPLATE] | |||
to allow clients to generate URLs based upon runtime data. | to allow clients to generate URLs based upon runtime data. | |||
4.3. Specifying Client Behaviour | 4.3. Specifying Client Behaviour | |||
An application's expectations for client behaviour ought to be | An application's expectations for client behaviour ought to be | |||
closely aligned with those of Web browsers to avoid interoperability | closely aligned with those of Web browsers to avoid interoperability | |||
issues when they are used. | issues when they are used. | |||
skipping to change at line 448 ¶ | skipping to change at line 449 ¶ | |||
Redirect handling: Applications need to specify how redirects are | Redirect handling: Applications need to specify how redirects are | |||
expected to be handled; see Section 4.6.1. | expected to be handled; see Section 4.6.1. | |||
Cookies: Applications using HTTP should explicitly reference the | Cookies: Applications using HTTP should explicitly reference the | |||
Cookie specification [COOKIES] if they are required. | Cookie specification [COOKIES] if they are required. | |||
Certificates: Applications using HTTP should specify that TLS | Certificates: Applications using HTTP should specify that TLS | |||
certificates are to be checked according to Section 4.3.4 of | certificates are to be checked according to Section 4.3.4 of | |||
[HTTP] when HTTPS is used. | [HTTP] when HTTPS is used. | |||
Applications using HTTP should not statically require HTTP features | Applications using HTTP should not require that clients statically | |||
that are usually negotiated to be supported by clients. For example, | support HTTP features that are usually negotiated. For example, | |||
requiring that clients support responses with a certain content | requiring that clients support responses with a certain content | |||
coding ([HTTP], Section 8.4.1) instead of negotiating for it ([HTTP], | coding ([HTTP], Section 8.4.1) instead of negotiating for it ([HTTP], | |||
Section 12.5.3) means that otherwise conformant clients cannot | Section 12.5.3) means that otherwise conformant clients cannot | |||
interoperate with the application. Applications can encourage the | interoperate with the application. Applications can encourage the | |||
implementation of such features, though. | implementation of such features, though. | |||
4.4. Specifying URLs | 4.4. Specifying URLs | |||
In HTTP, the resources that clients interact with are identified with | In HTTP, the resources that clients interact with are identified with | |||
URLs [URL]. As [RFC8820] explains, parts of the URL are designed to | URLs [URL]. As [BCP190] explains, parts of the URL are designed to | |||
be under the control of the owner (also known as the "authority") of | be under the control of the owner (also known as the "authority") of | |||
that server to give them the flexibility in deployment. | that server to give them the flexibility in deployment. | |||
This means that in most cases, specifications for applications that | This means that in most cases, specifications for applications that | |||
use HTTP won't contain fixed application URLs or paths; while it is | use HTTP won't contain fixed application URLs or paths; while it is | |||
common practice for a specification of a single-deployment API to | common practice for a specification of a single-deployment API to | |||
specify the path prefix "/app/v1" (for example), doing so in an IETF | specify the path prefix "/app/v1" (for example), doing so in an IETF | |||
specification is inappropriate. | specification is inappropriate. | |||
Therefore, the specification writer needs some mechanism to allow | Therefore, the specification writer needs some mechanism to allow | |||
skipping to change at line 496 ¶ | skipping to change at line 497 ¶ | |||
The most straightforward mechanism for URL discovery is to configure | The most straightforward mechanism for URL discovery is to configure | |||
the client with (or otherwise convey to it) a full URL. This might | the client with (or otherwise convey to it) a full URL. This might | |||
be done in a configuration document or through another discovery | be done in a configuration document or through another discovery | |||
mechanism. | mechanism. | |||
However, if the client only knows the server's hostname and the | However, if the client only knows the server's hostname and the | |||
identity of the application, there needs to be some way to derive the | identity of the application, there needs to be some way to derive the | |||
initial URL from that information. | initial URL from that information. | |||
An application cannot define a fixed prefix for its URL paths; see | An application cannot define a fixed prefix for its URL paths; see | |||
[RFC8820]. Instead, a specification for such an application can use | [BCP190]. Instead, a specification for such an application can use | |||
one of the following strategies: | one of the following strategies: | |||
* Register a well-known URI [WELL-KNOWN-URI] as an entry point for | * Register a well-known URI [WELL-KNOWN-URI] as an entry point for | |||
that application. This provides a fixed path on every potential | that application. This provides a fixed path on every potential | |||
server that will not collide with other applications. | server that will not collide with other applications. | |||
* Enable the server authority to convey a URI Template | * Enable the server authority to convey a URI Template | |||
[URI-TEMPLATE] or similar mechanism for generating a URL for an | [URI-TEMPLATE] or similar mechanism for generating a URL for an | |||
entry point. For example, this might be done in a configuration | entry point. For example, this might be done in a configuration | |||
document or other artefact. | document or other artefact. | |||
skipping to change at line 569 ¶ | skipping to change at line 570 ¶ | |||
might or might not work correctly, depending on how they are | might or might not work correctly, depending on how they are | |||
defined and implemented. Generally, they are designed and | defined and implemented. Generally, they are designed and | |||
implemented with an assumption that the URL will always be "http" | implemented with an assumption that the URL will always be "http" | |||
or "https". | or "https". | |||
* Web features that require a secure context [SECCTXT] will likely | * Web features that require a secure context [SECCTXT] will likely | |||
treat a new scheme as insecure. | treat a new scheme as insecure. | |||
See [RFC7595] for more information about minting new URI schemes. | See [RFC7595] for more information about minting new URI schemes. | |||
4.4.3. Transport Ports | 4.4.3. Choosing Transport Ports | |||
Applications can use the applicable default port (80 for HTTP, 443 | Applications can use the applicable default port (80 for HTTP, 443 | |||
for HTTPS), or they can be deployed upon other ports. This decision | for HTTPS), or they can be deployed upon other ports. This decision | |||
can be made at deployment time or might be encouraged by the | can be made at deployment time or might be encouraged by the | |||
application's specification (e.g., by registering a port for that | application's specification (e.g., by registering a port for that | |||
application). | application). | |||
If a non-default port is used, it needs to be reflected in the | If a non-default port is used, it needs to be reflected in the | |||
authority of all URLs for that resource; the only mechanism for | authority of all URLs for that resource; the only mechanism for | |||
changing a default port is changing the URI scheme (see | changing a default port is changing the URI scheme (see | |||
skipping to change at line 606 ¶ | skipping to change at line 607 ¶ | |||
New HTTP methods are rare; they are required to be registered in the | New HTTP methods are rare; they are required to be registered in the | |||
"HTTP Method Registry" with IETF Review (see [HTTP]) and are also | "HTTP Method Registry" with IETF Review (see [HTTP]) and are also | |||
required to be generic. That means that they need to be potentially | required to be generic. That means that they need to be potentially | |||
applicable to all resources, not just those of one application. | applicable to all resources, not just those of one application. | |||
While historically some applications (e.g., [RFC4791]) have defined | While historically some applications (e.g., [RFC4791]) have defined | |||
non-generic methods, [HTTP] now forbids this. | non-generic methods, [HTTP] now forbids this. | |||
When authors believe that a new method is required, they are | When authors believe that a new method is required, they are | |||
encouraged to engage with the HTTP community early (e.g., on the | encouraged to engage with the HTTP community early (e.g., on the | |||
<ietf-http-wg@w3.org> mailing list) and document their proposal as a | <mailto:ietf-http-wg@w3.org> mailing list) and document their | |||
separate HTTP extension rather than as part of an application's | proposal as a separate HTTP extension rather than as part of an | |||
specification. | application's specification. | |||
4.5.1. GET | 4.5.1. GET | |||
GET is the most common and useful HTTP method; its retrieval | GET is the most common and useful HTTP method; its retrieval | |||
semantics allow caching and side-effect free linking and underlie | semantics allow caching and side-effect free linking and underlie | |||
many of the benefits of using HTTP. | many of the benefits of using HTTP. | |||
Queries can be performed with GET, often using the query component of | Queries can be performed with GET, often using the query component of | |||
the URL; this is a familiar pattern from Web browsing, and the | the URL; this is a familiar pattern from Web browsing, and the | |||
results can be cached, improving the efficiency of an often expensive | results can be cached, improving the efficiency of an often expensive | |||
skipping to change at line 636 ¶ | skipping to change at line 637 ¶ | |||
requests. Additionally, some HTTP implementations limit the size of | requests. Additionally, some HTTP implementations limit the size of | |||
URLs they support, although modern HTTP software has much more | URLs they support, although modern HTTP software has much more | |||
generous limits than previously (typically, considerably more than | generous limits than previously (typically, considerably more than | |||
8000 octets, as required by [HTTP]). | 8000 octets, as required by [HTTP]). | |||
In these cases, an application using HTTP might consider using POST | In these cases, an application using HTTP might consider using POST | |||
to express queries in the request's content; doing so avoids encoding | to express queries in the request's content; doing so avoids encoding | |||
overhead and URL length limits in implementations. However, in doing | overhead and URL length limits in implementations. However, in doing | |||
so, it should be noted that the benefits of GET such as caching and | so, it should be noted that the benefits of GET such as caching and | |||
linking to query results are lost. Therefore, applications using | linking to query results are lost. Therefore, applications using | |||
HTTP that feel a need to allow POST queries ought to consider | HTTP that require support for POST queries ought to consider allowing | |||
allowing both methods. | both methods. | |||
Processing of GET requests should not change the application state or | Processing of GET requests should not change the application's state | |||
have other side effects that might be significant to the client since | or have other side effects that might be significant to the client | |||
implementations can and do retry HTTP GET requests that fail and some | since implementations can and do retry HTTP GET requests that fail | |||
GET requests protected by TLS early data might be vulnerable to | and some GET requests protected by TLS early data might be vulnerable | |||
replay attacks (see [RFC8470]). Note that this does not include | to replay attacks (see [RFC8470]). Note that this does not include | |||
logging and similar functions; see [HTTP], Section 9.2.1. | logging and similar functions; see [HTTP], Section 9.2.1. | |||
Finally, note that while the generic HTTP syntax allows a GET request | Finally, note that while the generic HTTP syntax allows a GET request | |||
message to contain content, the purpose is to allow message parsers | message to contain content, the purpose is to allow message parsers | |||
to be generic; per [HTTP], Section 9.3.1, content in a GET is not | to be generic; per [HTTP], Section 9.3.1, content in a GET is not | |||
recommended, has no meaning, and will be either ignored or rejected | recommended, has no meaning, and will be either ignored or rejected | |||
by generic HTTP software (such as intermediaries, caches, servers, | by generic HTTP software (such as intermediaries, caches, servers, | |||
and client libraries). | and client libraries). | |||
4.5.2. OPTIONS | 4.5.2. OPTIONS | |||
skipping to change at line 671 ¶ | skipping to change at line 672 ¶ | |||
* It isn't possible to link to the metadata with a simple URL | * It isn't possible to link to the metadata with a simple URL | |||
because OPTIONS is not the default method. | because OPTIONS is not the default method. | |||
* OPTIONS responses are not cacheable because HTTP caches operate on | * OPTIONS responses are not cacheable because HTTP caches operate on | |||
representations of the resource (i.e., GET and HEAD). If OPTIONS | representations of the resource (i.e., GET and HEAD). If OPTIONS | |||
responses are cached separately, their interactions with the HTTP | responses are cached separately, their interactions with the HTTP | |||
cache expiry, secondary keys, and other mechanisms need to be | cache expiry, secondary keys, and other mechanisms need to be | |||
considered. | considered. | |||
* OPTIONS is "chatty" -- always separating metadata out into a | * OPTIONS is "chatty" -- requesting metadata separately increases | |||
separate request increases the number of requests needed to | the number of requests needed to interact with the application. | |||
interact with the application. | ||||
* Implementation support for OPTIONS is not universal; some servers | * Implementation support for OPTIONS is not universal; some servers | |||
do not expose the ability to respond to OPTIONS requests without | do not expose the ability to respond to OPTIONS requests without | |||
significant effort. | significant effort. | |||
Instead of OPTIONS, one of these alternative approaches might be more | Instead of OPTIONS, one of these alternative approaches might be more | |||
appropriate: | appropriate: | |||
* For server-wide metadata, create a well-known URI [WELL-KNOWN-URI] | * For server-wide metadata, create a well-known URI [WELL-KNOWN-URI] | |||
or use an already existing one if appropriate (e.g., host-meta | or use an already existing one if appropriate (e.g., host-meta | |||
skipping to change at line 735 ¶ | skipping to change at line 735 ¶ | |||
To distinguish between multiple error conditions that are mapped to | To distinguish between multiple error conditions that are mapped to | |||
the same status code and to avoid the misattribution issue outlined | the same status code and to avoid the misattribution issue outlined | |||
above, applications using HTTP should convey finer-grained error | above, applications using HTTP should convey finer-grained error | |||
information in the response's message content and/or header fields. | information in the response's message content and/or header fields. | |||
[PROBLEM-DETAILS] provides one way to do so. | [PROBLEM-DETAILS] provides one way to do so. | |||
Because the set of registered HTTP status codes can expand, | Because the set of registered HTTP status codes can expand, | |||
applications using HTTP should explicitly point out that clients | applications using HTTP should explicitly point out that clients | |||
ought to be able to handle all applicable status codes gracefully | ought to be able to handle all applicable status codes gracefully | |||
(i.e., falling back to the generic n00 semantics of a given status | (i.e., falling back to the generic n00 semantics of a given status | |||
code; e.g., 499 can be safely handled as 400 by clients that don't | code; e.g., 499 can be safely handled as 400 (Bad Request) by clients | |||
recognise it). This is preferable to creating a "laundry list" of | that don't recognise it). This is preferable to creating a "laundry | |||
potential status codes since such a list won't be complete in the | list" of potential status codes since such a list won't be complete | |||
foreseeable future. | in the foreseeable future. | |||
Applications using HTTP MUST NOT re-specify the semantics of HTTP | Applications using HTTP MUST NOT re-specify the semantics of HTTP | |||
status codes, even if it is only by copying their definition. It is | status codes, even if it is only by copying their definition. It is | |||
NOT RECOMMENDED they require specific reason phrases to be used; the | NOT RECOMMENDED they require specific reason phrases to be used; the | |||
reason phrase has no function in HTTP, is not guaranteed to be | reason phrase has no function in HTTP, is not guaranteed to be | |||
preserved by implementations, and is not carried at all in the HTTP/2 | preserved by implementations, and is not carried at all in the HTTP/2 | |||
[HTTP2] message format. | [HTTP2] message format. | |||
Applications MUST only use registered HTTP status codes. As with | Applications MUST only use registered HTTP status codes. As with | |||
methods, new HTTP status codes are rare and required (by [HTTP]) to | methods, new HTTP status codes are rare and required (by [HTTP]) to | |||
be registered with IETF Review. Similarly, HTTP status codes are | be registered with IETF Review. Similarly, HTTP status codes are | |||
generic; they are required (by [HTTP]) to be potentially applicable | generic; they are required (by [HTTP]) to be potentially applicable | |||
to all resources, not just to those of one application. | to all resources, not just to those of one application. | |||
When authors believe that a new status code is required, they are | When authors believe that a new status code is required, they are | |||
encouraged to engage with the HTTP community early (e.g., on the | encouraged to engage with the HTTP community early (e.g., on the | |||
<ietf-http-wg@w3.org> mailing list) and document their proposal as a | <mailto:ietf-http-wg@w3.org> mailing list) and document their | |||
separate HTTP extension, rather than as part of an application's | proposal as a separate HTTP extension, rather than as part of an | |||
specification. | application's specification. | |||
4.6.1. Redirection | 4.6.1. Redirection | |||
The 3xx series of status codes specified in Section 15.4 of [HTTP] | The 3xx series of status codes specified in Section 15.4 of [HTTP] | |||
directs the user agent to another resource to satisfy the request. | directs the user agent to another resource to satisfy the request. | |||
The most common of these are 301, 302, 307, and 308, all of which use | The most common of these are 301, 302, 307, and 308, all of which use | |||
the Location response header field to indicate where the client | the Location response header field to indicate where the client | |||
should resend the request. | should resend the request. | |||
There are two ways that the members of this group of status codes | There are two ways that the members of this group of status codes | |||
skipping to change at line 852 ¶ | skipping to change at line 852 ¶ | |||
See Section 16.3.2 of [HTTP] for guidelines to consider when minting | See Section 16.3.2 of [HTTP] for guidelines to consider when minting | |||
new header fields. [STRUCTURED-FIELDS] provides a common structure | new header fields. [STRUCTURED-FIELDS] provides a common structure | |||
for new header fields and avoids many issues in their parsing and | for new header fields and avoids many issues in their parsing and | |||
handling; it is RECOMMENDED that new header fields use it. | handling; it is RECOMMENDED that new header fields use it. | |||
It is RECOMMENDED that header field names be short (even when field | It is RECOMMENDED that header field names be short (even when field | |||
compression is used, there is an overhead) but appropriately | compression is used, there is an overhead) but appropriately | |||
specific. In particular, if a header field is specific to an | specific. In particular, if a header field is specific to an | |||
application, an identifier for that application can form a prefix to | application, an identifier for that application can form a prefix to | |||
the header field name, separated by a "-". | the header field name, separated by a hyphen. | |||
For example, if the "example" application needs to create three | For example, if the "example" application needs to create three | |||
header fields, they might be called "example-foo", "example-bar", and | header fields, they might be called "example-foo", "example-bar", and | |||
"example-baz". Note that the primary motivation here is to avoid | "example-baz". Note that the primary motivation here is to avoid | |||
consuming more generic field names, not to reserve a portion of the | consuming more generic field names, not to reserve a portion of the | |||
namespace for the application; see [RFC6648] for related | namespace for the application; see [RFC6648] for related | |||
considerations. | considerations. | |||
The semantics of existing HTTP header fields MUST NOT be redefined | The semantics of existing HTTP header fields MUST NOT be redefined | |||
without updating their registration or defining an extension to them | without updating their registration or defining an extension to them | |||
(if allowed). For example, an application using HTTP cannot specify | (if allowed). For example, an application using HTTP cannot specify | |||
that the Location header field has a special meaning in a certain | that the Location header field has a special meaning in a certain | |||
context. | context. | |||
See Section 4.9 for the interaction between header fields and HTTP | See Section 4.9 for the interaction between header fields and HTTP | |||
caching; in particular, request header fields that are used to | caching; in particular, request header fields that are used to choose | |||
"select" a response have impact there and need to be carefully | (per Section 4.1 of [HTTP-CACHING]) a response have impact there and | |||
considered. | need to be carefully considered. | |||
See Section 4.10 for considerations regarding header fields that | See Section 4.10 for considerations regarding header fields that | |||
carry application state (e.g., Cookie). | carry application state (e.g., Cookie). | |||
4.8. Defining Message Content | 4.8. Defining Message Content | |||
Common syntactic conventions for message contents include JSON | Common syntactic conventions for message contents include JSON | |||
[JSON], XML [XML], and Concise Binary Object Representation (CBOR) | [JSON], XML [XML], and Concise Binary Object Representation (CBOR) | |||
[RFC8949]. Best practices for their use are out of scope for this | [RFC8949]. Best practices for their use are out of scope for this | |||
document. | document. | |||
skipping to change at line 910 ¶ | skipping to change at line 910 ¶ | |||
Assigning even a short freshness lifetime ([HTTP-CACHING], | Assigning even a short freshness lifetime ([HTTP-CACHING], | |||
Section 4.2) -- e.g., 5 seconds -- allows a response to be reused to | Section 4.2) -- e.g., 5 seconds -- allows a response to be reused to | |||
satisfy multiple clients and/or a single client making the same | satisfy multiple clients and/or a single client making the same | |||
request repeatedly. In general, if it is safe to reuse something, | request repeatedly. In general, if it is safe to reuse something, | |||
consider assigning a freshness lifetime. | consider assigning a freshness lifetime. | |||
The most common method for specifying freshness is the max-age | The most common method for specifying freshness is the max-age | |||
response directive ([HTTP-CACHING], Section 5.2.2.1). The Expires | response directive ([HTTP-CACHING], Section 5.2.2.1). The Expires | |||
header field ([HTTP-CACHING], Section 5.3) can also be used, but it | header field ([HTTP-CACHING], Section 5.3) can also be used, but it | |||
is not necessary; all modern cache implementations support Cache- | is not necessary; all modern cache implementations support the Cache- | |||
Control, and specifying freshness as a delta is usually more | Control header field, and specifying freshness as a delta is usually | |||
convenient and less error-prone. | more convenient and less error-prone. | |||
It is not necessary to add the "public" response directive | It is not necessary to add the public response directive | |||
([HTTP-CACHING], Section 5.2.2.9) to cache most responses; it is only | ([HTTP-CACHING], Section 5.2.2.9) to cache most responses; it is only | |||
necessary when it's desirable to store an authenticated response, or | necessary when it's desirable to store an authenticated response, or | |||
when the status code isn't understood by the cache and there isn't | when the status code isn't understood by the cache and there isn't | |||
explicit freshness information available. | explicit freshness information available. | |||
In some situations, responses without explicit cache freshness | In some situations, responses without explicit cache freshness | |||
directives will be stored and served using a heuristic freshness | directives will be stored and served using a heuristic freshness | |||
lifetime; see [HTTP-CACHING], Section 4.2.2. As the heuristic is not | lifetime; see [HTTP-CACHING], Section 4.2.2. As the heuristic is not | |||
under the control of the application, it is generally preferable to | under the control of the application, it is generally preferable to | |||
set an explicit freshness lifetime or make the response explicitly | set an explicit freshness lifetime or make the response explicitly | |||
uncacheable. | uncacheable. | |||
If caching of a response is not desired, the appropriate response | If caching of a response is not desired, the appropriate cache | |||
directive is "Cache-Control: no-store". Other directives are not | response directive is no-store. Other directives are not necessary, | |||
necessary, and no-store only needs to be sent in situations where the | and no-store only needs to be sent in situations where the response | |||
response might be cached; see [HTTP-CACHING], Section 3. Note that | might be cached; see [HTTP-CACHING], Section 3. Note that the no- | |||
"Cache-Control: no-cache" allows a response to be stored, just not | cache directive allows a response to be stored, just not reused by a | |||
reused by a cache without validation; it does not prevent caching | cache without validation; it does not prevent caching (despite its | |||
(despite its name). | name). | |||
For example, this response cannot be stored or reused by a cache: | For example, this response cannot be stored or reused by a cache: | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/example+xml | Content-Type: application/example+xml | |||
Cache-Control: no-store | Cache-Control: no-store | |||
[content] | [content] | |||
4.9.2. Stale Responses | 4.9.2. Stale Responses | |||
Authors should understand that stale responses (e.g., with "Cache- | Authors should understand that stale responses (e.g., with Cache- | |||
Control: max-age=0") can be reused by caches when disconnected from | Control: max-age=0) can be reused by caches when disconnected from | |||
the origin server; this can be useful for handling network issues. | the origin server; this can be useful for handling network issues. | |||
If doing so is not suitable for a given response, the origin should | If doing so is not suitable for a given response, the origin should | |||
use "Cache-Control: must-revalidate". See Section 4.2.4 of | send the must-revalidate cache directive. See Section 4.2.4 of | |||
[HTTP-CACHING] and also [RFC5861] for additional controls over stale | [HTTP-CACHING] and also [RFC5861] for additional controls over stale | |||
content. | content. | |||
Stale responses can be refreshed by assigning a validator, saving | Stale responses can be refreshed by assigning a validator, saving | |||
both transfer bandwidth and latency for large responses; see | both transfer bandwidth and latency for large responses; see | |||
Section 13 of [HTTP]. | Section 13 of [HTTP]. | |||
4.9.3. Caching and Application Semantics | 4.9.3. Caching and Application Semantics | |||
When an application has a need to express a lifetime that's separate | When an application has a need to express a lifetime that's separate | |||
skipping to change at line 981 ¶ | skipping to change at line 981 ¶ | |||
[HTTP-CACHING], Section 4.2.3). | [HTTP-CACHING], Section 4.2.3). | |||
One way to address this is to explicitly specify that responses need | One way to address this is to explicitly specify that responses need | |||
to be fresh upon use. | to be fresh upon use. | |||
4.9.4. Varying Content Based Upon the Request | 4.9.4. Varying Content Based Upon the Request | |||
If an application uses a request header field to change the | If an application uses a request header field to change the | |||
response's header fields or content, authors should point out that | response's header fields or content, authors should point out that | |||
this has implications for caching; in general, such resources need to | this has implications for caching; in general, such resources need to | |||
either make their responses uncacheable (e.g., with the "no-store" | either make their responses uncacheable (e.g., with the no-store | |||
cache-control directive defined in [HTTP-CACHING], Section 5.2.2.5) | cache directive defined in [HTTP-CACHING], Section 5.2.2.5) or send | |||
or send the Vary response header field ([HTTP], Section 12.5.5) on | the Vary response header field ([HTTP], Section 12.5.5) on all | |||
all responses from that resource (including the "default" response). | responses from that resource (including the "default" response). | |||
For example, this response: | For example, this response: | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: application/example+xml | Content-Type: application/example+xml | |||
Cache-Control: max-age=60 | Cache-Control: max-age=60 | |||
ETag: "sa0f8wf20fs0f" | ETag: "sa0f8wf20fs0f" | |||
Vary: Accept-Encoding | Vary: Accept-Encoding | |||
[content] | [content] | |||
skipping to change at line 1032 ¶ | skipping to change at line 1032 ¶ | |||
HTTP/2 [HTTP2] and HTTP/3 [HTTP3] offer multiplexing to applications, | HTTP/2 [HTTP2] and HTTP/3 [HTTP3] offer multiplexing to applications, | |||
removing the need to use multiple connections. However, application | removing the need to use multiple connections. However, application | |||
performance can still be significantly affected by how the server | performance can still be significantly affected by how the server | |||
chooses to prioritize responses. Depending on the application, it | chooses to prioritize responses. Depending on the application, it | |||
might be best for the server to determine the priority of responses | might be best for the server to determine the priority of responses | |||
or for the client to hint its priorities to the server (see, e.g., | or for the client to hint its priorities to the server (see, e.g., | |||
[HTTP-PRIORITY]). | [HTTP-PRIORITY]). | |||
In all versions of HTTP, requests are made independently -- you can't | In all versions of HTTP, requests are made independently -- you can't | |||
rely on the relative order of two requests to guarantee the | rely on the relative order of two requests to guarantee their | |||
processing order. This is because they might be sent over a | processing order. This is because they might be sent over a | |||
multiplexed protocol by an intermediary or sent to different origin | multiplexed protocol by an intermediary or sent to different origin | |||
servers, or the server might even perform processing in a different | servers, or the server might even perform processing in a different | |||
order. If two requests need strict ordering, the only reliable way | order. If two requests need strict ordering, the only reliable way | |||
to ensure the outcome is to issue the second request when the final | to ensure the outcome is to issue the second request when the final | |||
response to the first has begun. | response to the first has begun. | |||
Applications MUST NOT make assumptions about the relationship between | Applications MUST NOT make assumptions about the relationship between | |||
separate requests on a single transport connection; doing so breaks | separate requests on a single transport connection; doing so breaks | |||
many of the assumptions of HTTP as a stateless protocol and will | many of the assumptions of HTTP as a stateless protocol and will | |||
skipping to change at line 1059 ¶ | skipping to change at line 1059 ¶ | |||
identify clients. Per [RFC7617], the Basic authentication scheme is | identify clients. Per [RFC7617], the Basic authentication scheme is | |||
not suitable for protecting sensitive or valuable information unless | not suitable for protecting sensitive or valuable information unless | |||
the channel is secure (e.g., using the "https" URI scheme). | the channel is secure (e.g., using the "https" URI scheme). | |||
Likewise, [RFC7616] requires the Digest authentication scheme to be | Likewise, [RFC7616] requires the Digest authentication scheme to be | |||
used over a secure channel. | used over a secure channel. | |||
With HTTPS, clients might also be authenticated using certificates | With HTTPS, clients might also be authenticated using certificates | |||
[RFC8446], but note that such authentication is intrinsically scoped | [RFC8446], but note that such authentication is intrinsically scoped | |||
to the underlying transport connection. As a result, a client has no | to the underlying transport connection. As a result, a client has no | |||
way of knowing whether the authenticated status was used in preparing | way of knowing whether the authenticated status was used in preparing | |||
the response (though "Vary: *" and/or "Cache-Control: private" can | the response (though Vary: * and/or the private cache directive can | |||
provide a partial indication), and the only way to obtain a | provide a partial indication), and the only way to obtain a | |||
specifically unauthenticated response is to open a new connection. | specifically unauthenticated response is to open a new connection. | |||
When used, it is important to carefully specify the scoping and use | When used, it is important to carefully specify the scoping and use | |||
of authentication; if the application exposes sensitive data or | of authentication; if the application exposes sensitive data or | |||
capabilities (e.g., by acting as an ambient authority; see | capabilities (e.g., by acting as an ambient authority; see | |||
Section 8.3 of [RFC6454]), exploits are possible. Mitigations | Section 8.3 of [RFC6454]), exploits are possible. Mitigations | |||
include using a request-specific token to ensure the intent of the | include using a request-specific token to ensure the intent of the | |||
client. | client. | |||
skipping to change at line 1148 ¶ | skipping to change at line 1148 ¶ | |||
If an application has browser compatibility as a goal, client | If an application has browser compatibility as a goal, client | |||
interaction ought to be defined in terms of [FETCH] since that is the | interaction ought to be defined in terms of [FETCH] since that is the | |||
abstraction that browsers use for HTTP; it enforces many of these | abstraction that browsers use for HTTP; it enforces many of these | |||
best practices. | best practices. | |||
4.14. Maintaining Application Boundaries | 4.14. Maintaining Application Boundaries | |||
Because many HTTP capabilities are scoped to the origin [RFC6454], | Because many HTTP capabilities are scoped to the origin [RFC6454], | |||
applications also need to consider how deployments might interact | applications also need to consider how deployments might interact | |||
with other applications (including Web browsing) with the same | with other applications (including Web browsing) that use the same | |||
origin. | origin server. | |||
For example, if cookies [COOKIES] are used to carry application | For example, if cookies [COOKIES] are used to carry application | |||
state, they will be sent with all requests to the origin by default | state, they will be sent with all requests to the origin by default | |||
(unless scoped by path), and the application might receive cookies | (unless scoped by path), and the application might receive cookies | |||
from other applications on the origin. This can lead to security | from other applications on the origin server. This can lead to | |||
issues as well as collision in cookie names. | security issues as well as collision in cookie names. | |||
One solution to these issues is to require a dedicated hostname for | One solution to these issues is to require a dedicated hostname for | |||
the application so that it has a unique origin. However, it is often | the application so that it has a unique origin. However, it is often | |||
desirable to allow multiple applications to be deployed on a single | desirable to allow multiple applications to be deployed on a single | |||
hostname; doing so provides the most deployment flexibility and | hostname; doing so provides the most deployment flexibility and | |||
enables them to be "mixed" together (see [RFC8820] for details). | enables them to be "mixed" together (see [BCP190] for details). | |||
Therefore, applications using HTTP should strive to allow multiple | ||||
applications on an origin. | ||||
To enable this, when specifying the use of cookies, HTTP | Therefore, applications using HTTP should strive to allow multiple | |||
authentication realms [HTTP], or other origin-wide HTTP mechanisms, | applications on an origin. Specifically, when specifying the use of | |||
applications using HTTP should not mandate the use of a particular | cookies, HTTP authentication realms [HTTP], or other origin-wide HTTP | |||
name but instead let deployments configure them. Consideration | mechanisms, applications using HTTP should not mandate the use of a | |||
should be given to scoping them to part of the origin, using their | particular name but instead let deployments configure them. | |||
specified mechanisms for doing so. | Consideration should be given to scoping them to part of the origin, | |||
using their specified mechanisms for doing so. | ||||
Modern Web browsers constrain the ability of content from one origin | Modern Web browsers constrain the ability of content from one origin | |||
to access resources from another to avoid leaking private | to access resources from another to avoid leaking private | |||
information. As a result, applications that wish to expose cross- | information. As a result, applications that wish to expose cross- | |||
origin data to browsers will need to implement the CORS protocol; see | origin data to browsers will need to implement the CORS protocol; see | |||
[FETCH]. | [FETCH]. | |||
4.15. Using Server Push | 4.15. Using Server Push | |||
HTTP/2 added the ability for servers to "push" request/response pairs | HTTP/2 added the ability for servers to "push" request/response pairs | |||
skipping to change at line 1321 ¶ | skipping to change at line 1320 ¶ | |||
be used to profile the underlying hardware, creating a unique | be used to profile the underlying hardware, creating a unique | |||
identifier for the system. Applications are advised to avoid | identifier for the system. Applications are advised to avoid | |||
allowing the use of mobile code where possible; when it cannot be | allowing the use of mobile code where possible; when it cannot be | |||
avoided, the resulting system's security properties need be carefully | avoided, the resulting system's security properties need be carefully | |||
scrutinised. | scrutinised. | |||
7. References | 7. References | |||
7.1. Normative References | 7.1. Normative References | |||
[BCP190] Nottingham, M., "URI Design and Ownership", BCP 190, | ||||
RFC 8820, DOI 10.17487/RFC8820, June 2020, | ||||
<https://www.rfc-editor.org/rfc/rfc8820>. | ||||
[HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP Semantics", RFC 9110, DOI 10.17487/RFC9110, | Ed., "HTTP Semantics", RFC 9110, DOI 10.17487/RFC9110, | |||
February 2022, <https://www.rfc-editor.org/info/rfc9110>. | February 2022, <https://www.rfc-editor.org/info/rfc9110>. | |||
[HTTP-CACHING] | [HTTP-CACHING] | |||
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP Caching", RFC 9111, DOI 10.17487/RFC9111, | Ed., "HTTP Caching", RFC 9111, DOI 10.17487/RFC9111, | |||
February 2022, <https://www.rfc-editor.org/info/rfc9111>. | February 2022, <https://www.rfc-editor.org/info/rfc9111>. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
skipping to change at line 1354 ¶ | skipping to change at line 1357 ¶ | |||
[RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | |||
Specifications and Registration Procedures", BCP 13, | Specifications and Registration Procedures", BCP 13, | |||
RFC 6838, DOI 10.17487/RFC6838, January 2013, | RFC 6838, DOI 10.17487/RFC6838, January 2013, | |||
<https://www.rfc-editor.org/info/rfc6838>. | <https://www.rfc-editor.org/info/rfc6838>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8820] Nottingham, M., "URI Design and Ownership", BCP 190, | [STRUCTURED-FIELDS] | |||
RFC 8820, DOI 10.17487/RFC8820, June 2020, | Nottingham, M. and P-H. Kamp, "Structured Field Values for | |||
<https://www.rfc-editor.org/info/rfc8820>. | HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | |||
<https://www.rfc-editor.org/info/rfc8941>. | ||||
[URL] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [URL] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
[WEB-LINKING] | [WEB-LINKING] | |||
Nottingham, M., "Web Linking", RFC 8288, | Nottingham, M., "Web Linking", RFC 8288, | |||
DOI 10.17487/RFC8288, October 2017, | DOI 10.17487/RFC8288, October 2017, | |||
<https://www.rfc-editor.org/info/rfc8288>. | <https://www.rfc-editor.org/info/rfc8288>. | |||
skipping to change at line 1380 ¶ | skipping to change at line 1384 ¶ | |||
(URIs)", RFC 8615, DOI 10.17487/RFC8615, May 2019, | (URIs)", RFC 8615, DOI 10.17487/RFC8615, May 2019, | |||
<https://www.rfc-editor.org/info/rfc8615>. | <https://www.rfc-editor.org/info/rfc8615>. | |||
7.2. Informative References | 7.2. Informative References | |||
[COOKIES] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [COOKIES] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
DOI 10.17487/RFC6265, April 2011, | DOI 10.17487/RFC6265, April 2011, | |||
<https://www.rfc-editor.org/info/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
[CSP] West, M., "Content Security Policy Level 3", W3C Working | [CSP] West, M., "Content Security Policy Level 3", W3C Working | |||
Draft WD-CSP3-20160913, 13 September 2016, | Draft, June 2021, | |||
<https://www.w3.org/TR/2016/WD-CSP3-20160913>. | <https://www.w3.org/TR/2021/WD-CSP3-20210629>. | |||
[FETCH] WHATWG, "Fetch - Living Standard", | [FETCH] WHATWG, "Fetch - Living Standard", | |||
<https://fetch.spec.whatwg.org>. | <https://fetch.spec.whatwg.org>. | |||
[HTML] WHATWG, "HTML - Living Standard", | [HTML] WHATWG, "HTML - Living Standard", | |||
<https://html.spec.whatwg.org>. | <https://html.spec.whatwg.org>. | |||
[HTTP-PRIORITY] | [HTTP-PRIORITY] | |||
Oku, K. and L. Pardue, "Extensible Prioritization Scheme | Oku, K. and L. Pardue, "Extensible Prioritization Scheme | |||
for HTTP", Work in Progress, Internet-Draft, draft-ietf- | for HTTP", Work in Progress, Internet-Draft, draft-ietf- | |||
skipping to change at line 1496 ¶ | skipping to change at line 1500 ¶ | |||
[RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | |||
Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | |||
2018, <https://www.rfc-editor.org/info/rfc8470>. | 2018, <https://www.rfc-editor.org/info/rfc8470>. | |||
[RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object | [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object | |||
Representation (CBOR)", STD 94, RFC 8949, | Representation (CBOR)", STD 94, RFC 8949, | |||
DOI 10.17487/RFC8949, December 2020, | DOI 10.17487/RFC8949, December 2020, | |||
<https://www.rfc-editor.org/info/rfc8949>. | <https://www.rfc-editor.org/info/rfc8949>. | |||
[SECCTXT] West, M., "Secure Contexts", W3C Candidate Recommendation | [SECCTXT] West, M., "Secure Contexts", W3C Candidate Recommendation, | |||
CR-secure-contexts-20160915, 15 September 2016, | September 2021, | |||
<https://www.w3.org/TR/2016/CR-secure-contexts-20160915>. | <https://www.w3.org/TR/2021/CRD-secure-contexts-20210918>. | |||
[STRUCTURED-FIELDS] | ||||
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>. | ||||
[URI-TEMPLATE] | [URI-TEMPLATE] | |||
Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., | Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., | |||
and D. Orchard, "URI Template", RFC 6570, | and D. Orchard, "URI Template", RFC 6570, | |||
DOI 10.17487/RFC6570, March 2012, | DOI 10.17487/RFC6570, March 2012, | |||
<https://www.rfc-editor.org/info/rfc6570>. | <https://www.rfc-editor.org/info/rfc6570>. | |||
[XML] Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and | [XML] Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and | |||
F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth | F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth | |||
Edition)", W3C Recommendation REC-xml-20081126, November | Edition)", W3C Recommendation REC-xml-20081126, November | |||
2008, <https://www.w3.org/TR/2008/REC-xml-20081126>. | 2008, <https://www.w3.org/TR/2008/REC-xml-20081126>. | |||
Appendix A. Changes from RFC 3205 | Appendix A. Changes from RFC 3205 | |||
[RFC3205] captured the Best Current Practice in the early 2000s based | [RFC3205] captured the Best Current Practice in the early 2000s based | |||
on the concerns facing protocol designers at the time. Use of HTTP | on the concerns facing protocol designers at the time. Use of HTTP | |||
has changed considerably since then; as a result, this document is | has changed considerably since then; as a result, this document is | |||
substantially different. As a result, the changes are too numerous | substantially different. Consequently, the changes are too numerous | |||
to list individually. | to list individually. | |||
Author's Address | Author's Address | |||
Mark Nottingham | Mark Nottingham | |||
Prahran | Prahran | |||
Australia | Australia | |||
Email: mnot@mnot.net | Email: mnot@mnot.net | |||
URI: https://www.mnot.net/ | URI: https://www.mnot.net/ | |||
End of changes. 42 change blocks. | ||||
125 lines changed or deleted | 124 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |