CoRE | C. Amsüss |
Internet-Draft | March 25, 2019 |
Updates: 7641 (if approved) | |
Intended status: Standards Track | |
Expires: September 26, 2019 |
Accept-Any option for CoAP
draft-amsuess-core-accept-any-00
This memoy defines the Accept-Any option, which provides a more flexible content negotiation than the one originally specified for the Constrained Application Protocol (CoAP) in [RFC7252]. As this is particularly useful with but ruled out in CoAP observation ([RFC7641]), that is updated to allow it.
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."
This Internet-Draft will expire on September 26, 2019.
Copyright (c) 2019 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 Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
[ This document is being developed in git at https://github.com/chrysn/accept-any. ]
When CoAP content format defined in [RFC7252], the choice was made to have the initial content negotiation allow the client to only pick zero or one content format. This is a good choice for many situations and ensures that proxies can cache as much as possible without added complexity. A client that does not know a usable content format would either leave the request field absent, indicating it would accept any response, or try several acceptble values in a series of requests.
In line with that choice, observation ([RFC7641]) required notification responses to carry the same content format in the notification as in the original response.
For applications that expect a representation to change its representability to change during an observation’s lifetime, [I-D.ietf-core-multipart-ct] introduces a way of wrapping responses in an application/multipart-core response. That approach is convenient for bags of representations, but lacks actual content negotiation and produces representations that are not directly usable but need to be processed from inside the multipart representation.
This document introduces an additional way for the client to indicate its set of acceptable content formats, and removes the same-content-format limitation during observation.
A new option Accept-Any is defined. It is critical [ I don’t fully see why but follow Accept here ], safe-to-foward and part of the cache key. Its format is uint up to 2 long (indicating content types), it is Class E in OSCORE, usable in requests only, and repeatable
Repeatability is the only aspect in which it differs from Accept in terms of option properties.
Its values indicate a list of acceptable representations in order of decreasing preference. A server MUST answer with the first format it can represent the requested state in, or 4.06 (Not Acceptable) if it could answer successfully but the response would not match any of the option values.
The Accept-Any option MUST NOT be used exactly once; that request’s meaning would be identical to that of a single Accept option. Instead, a single Accept option is used.
A proxy MAY ignore this option per its properties (and serve a cached response if the cache key matches), but can implement additional behavior to enhance its cache.
A proxy is allowed to serve a cached representation to a request with a different sequence of Accept-Any options, provided the second request has an Accept value of the cached representation, or all the content formats that precede the available content format in the second request’s Accept-Any options also preceded the available representation in any earlier (fresh) request’s list.
When a request that carries Accept-Any is answered 4.06 (or with any but the first format requested by Accept-Any in its Content-Format), a proxy SHOULD [ we can’t have a MUST here w/o making it non-safe-to-forward, but I think it’s sufficient ] invalidate all known representations in any of the requested formats (or the formats preceeding the returned one, respectively).
The requirement that subsequent notifications carry the same Content-Format option as the original response ([RFC7641] Section 3.2) is lifted.
Observing resources whose available representations changed is a key featuer of Accept-Any, and necessary to implement pub-sub topics that have no initial value (but a “null” representation with a dedicated content format) without losing content negotiation and direct usability of the response.
The requirement was introduced initially before such content negotiation was thought of, and is not a necessary part to the remainder of the observation document.
As long as the limitation is in place, the origin server has no clear action guidance when its resource changes the available content formats (see below).
Changes to the returned media type can either happen when
Impact on proxies: A proxy that enforces the previous rule on Content-Format staying constant would close observations (probably with something like 5.02 Bad Gateway), and the client would need to re-establish. No proxy implementations are known that implement that behavior.
[RFC7252] | Shelby, Z., Hartke, K. and C. Bormann, "The Constrained Application Protocol (CoAP)", RFC 7252, DOI 10.17487/RFC7252, June 2014. |
[RFC7641] | Hartke, K., "Observing Resources in the Constrained Application Protocol (CoAP)", RFC 7641, DOI 10.17487/RFC7641, September 2015. |
[I-D.ietf-core-multipart-ct] | Fossati, T., Hartke, K. and C. Bormann, "Multipart Content-Format for CoAP", Internet-Draft draft-ietf-core-multipart-ct-03, March 2019. |