Internet DRAFT - draft-vanderstok-core-patch

draft-vanderstok-core-patch







core                                                     P. van der Stok
Internet-Draft                                                 A. Sehgal
Intended status: Informational                                Consultant
Expires: September 16, 2016                               March 15, 2016


        Patch Method for Constrained Application Protocol (CoAP)
                     draft-vanderstok-core-patch-03

Abstract

   The existing Constrained Application Protocol (CoAP) PUT method only
   allows a complete replacement of a resource.  This does not permit
   applications to perform partial resource modifications.  In case of
   resources with larger or complex data, or in situations where a
   resource continuity is required, replacing a resource is not an
   option.  Several applications using CoAP will need to perform partial
   resource modifications.  This proposal adds new CoAP methods, PATCH
   and iPATCH, to modify an existing CoAP resource partially.

Status of This Memo

   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 http://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 16, 2016.

Copyright Notice

   Copyright (c) 2016 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
   (http://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



van der Stok & Sehgal  Expires September 16, 2016               [Page 1]


Internet-Draft                 CoAP Patch                     March 2016


   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.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   2
     1.1.  Requirements Language . . . . . . . . . . . . . . . . . .   3
     1.2.  Terminology and Acronyms  . . . . . . . . . . . . . . . .   3
   2.  PATCH (iPATCH) Method . . . . . . . . . . . . . . . . . . . .   3
     2.1.  A Simple PATCH (iPATCH) Example . . . . . . . . . . . . .   4
     2.2.  Response Codes  . . . . . . . . . . . . . . . . . . . . .   7
     2.3.  Option Numbers  . . . . . . . . . . . . . . . . . . . . .   7
   3.  Error Handling  . . . . . . . . . . . . . . . . . . . . . . .   8
   4.  Security Considerations . . . . . . . . . . . . . . . . . . .   9
   5.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  10
   6.  Acknowledgements  . . . . . . . . . . . . . . . . . . . . . .  10
   7.  Change log  . . . . . . . . . . . . . . . . . . . . . . . . .  10
   8.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  11
     8.1.  Normative References  . . . . . . . . . . . . . . . . . .  11
     8.2.  Informative References  . . . . . . . . . . . . . . . . .  12
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  12

1.  Introduction

   This specification defines the new Constrained Application Protocol
   (CoAP) [RFC7252] methods, PATCH and iPATCH, which are used to apply
   partial modifications to a resource.

   PATCH is also specified for HTTP in [RFC5789].  Most of the
   motivation for PATCH described in [RFC5789] also applies here. iPATCH
   is the idem-potent version of PATCH.

   The PUT method exists to overwrite a resource with completely new
   contents, and cannot be used to perform partial changes.  When using
   PUT for partial changes, proxies and caches, and even clients and
   servers, may get confused as to the result of the operation.  PATCH
   was not adopted in an early design stage of CoAP, however, it has
   become necessary with the arrival of applications that require
   partial updates to resources (e.g.  [I-D.vanderstok-core-comi]).
   Using PATCH avoids transferring all data associated with a resource
   in case of modifications, thereby not burdening the constrained
   communication medium.

   This document relies on knowledge of the PATCH specification for HTTP
   [RFC5789].  This document provides extracts from [RFC5789] to make
   independent reading possible.




van der Stok & Sehgal  Expires September 16, 2016               [Page 2]


Internet-Draft                 CoAP Patch                     March 2016


1.1.  Requirements Language

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in [RFC2119].

1.2.  Terminology and Acronyms

   This document uses terminology defined in [RFC5789] and [RFC7252].

2.  PATCH (iPATCH) Method

   The PATCH (iPATCH) method requests that a set of changes described in
   the request payload is applied to the target resource of the request.
   The set of changes is represented in a format identified by a media
   type.  If the Request-URI does not point to an existing resource, the
   server MAY create a new resource with that URI, depending on the
   patch document type (whether it can logically modify a null resource)
   and permissions, etc.  Creation of a new resource would result in a
   2.01 (Created) Response Code dependent of the patch document type.

   Restrictions to a PATCH (iPATCH) can be made by including the If-
   Match or If-None-Match options in the request (see Section 5.10.8.1
   and 5.10.8.2 of [RFC7252]).  If the resource could not be created or
   modified, then an appropriate Error Response Code SHOULD be sent.

   The difference between the PUT and PATCH requests is extensively
   documented in [RFC5789].

   PATCH is not safe and not idempotent conformant to HTTP PATCH
   specified in [RFC5789].

   iPATCH is not safe but idempotent conformant to CoAP PUT specified in
   [RFC7252], Section 5.8.3.

   An iPATCH request is idempotent to prevent bad outcomes from
   collisions between two iPATCH requests on the same resource in a
   similar time frame.  These collisions can be detected with the
   MessageId and the source end-point provided by the CoAP protocol (see
   section 4.5 of [RFC7252].

   PATCH and iPATCH are both atomic.  The server MUST apply the entire
   set of changes atomically and never provide a partially modified
   representation to a concurrently executed GET request.  Given the
   constrained nature of the servers, most servers will only execute
   CoAP requests consecutively, thus preventing a concurrent partial
   overlapping of request modifications.  Resuming, modifications MUST
   NOT be applied to the server state when an error occurs or only a



van der Stok & Sehgal  Expires September 16, 2016               [Page 3]


Internet-Draft                 CoAP Patch                     March 2016


   partial execution is possible on the resources present in the server.
   When the PATCH request is over-specified (i.e.  Request specifies
   modifications to attributes which do not exist in the server), The
   server MAY execute all modifications to existing attributes and
   return a response code 2.02 Accepted.

   The atomicity applies to a single server.  When a PATCH (iPATCH)
   request is multicast to a set of servers, each server can either
   execute all required modifications or not.  It is not required that
   all servers execute all modifications or none.  An Atomic Commit
   protocol that provides multiple server atomicity, is out of scope.

   A PATCH (iPATCH) response can invalidate a cache conformant with the
   PUT response.  Caching behaviour as function of the valid 2.xx
   response codes for PATCH (iPATCH) are:

      A 2.01 (Created) response invalidates any cache entry for the
      resource indicated by the Location-* Options; the payload is a
      representation of the action result.

      A 2.04 (Changed) response invalidates any cache entry for the
      target resource; the payload is a representation of the action
      result.

   There is no guarantee that a resource can be modified with PATCH
   (iPATCH).  Servers are required to support a subset of the content
   formats as specified in sections 12.3 and 5.10.3 of [RFC7252].
   Servers MUST ensure that a received PATCH payload is appropriate for
   the type of resource identified by the target resource of the
   request.

   Clients MUST choose to use PATCH (iPATCH) rather than PUT when the
   request affects partial updates of a given resource.

   PATCH (iPATCH) MUST not be used to restore default values to resource
   attributes which are not specified in the payload.  PATCH (iPATCH)
   specifically guarantees that unspecified resource attributes are not
   changed.

2.1.  A Simple PATCH (iPATCH) Example

   The example is taken over from [RFC6902], which specifies a JSON
   notation for PATCH operations.  A resource located at
   www.example.com/object contains a target JSON document.







van der Stok & Sehgal  Expires September 16, 2016               [Page 4]


Internet-Draft                 CoAP Patch                     March 2016


   JSON document original state
               {
                 "x-coord": 256,
                 "y-coord": 45",
                 "foo": ["bar","baz"]
               }

    REQ:
        iPATCH CoAP://www.example.com/object
   Content-Format: application/json-patch+json
            [
                { "op":"replace","path":"x-coord","value":45}
            ]
   RET:
        CoAP 2.04 Changed

   JSON document final state
               {
                  "x-coord": 45,
                  "y-coord": 45,
                  "foo": ["bar","baz"]
                }

   This example illustrates use of an idempotent modification to the
   x-coord attribute of the existing resource "object".  The 2.04
   (Changed) response code is conform with the CoAP PUT method.

   The same example using the Content-Format application/merge-
   patch+json from [RFC7396] looks like:






















van der Stok & Sehgal  Expires September 16, 2016               [Page 5]


Internet-Draft                 CoAP Patch                     March 2016


   JSON document original state
               {
                 "x-coord": 256,
                 "y-coord": 45,
                 "foo": ["bar","baz"]
               }

    REQ:
        iPATCH CoAP://www.example.com/object
   Content-Format: application/merge-patch+json
        { "x-coord":45}
   RET:
        CoAP 2.04 Changed

   JSON document final state
               {
                  "x-coord": 45,
                  "y-coord": 45,
                  "foo": ["bar","baz"]
                }

   The examples show the use of the iPATCH method, but the use of the
   PATCH method must have led to the same result.  Below a non-
   idempotent modification is shown.  Because the action is non-
   idempotent, iPATCH returns an error, while PATCH executes the action.


























van der Stok & Sehgal  Expires September 16, 2016               [Page 6]


Internet-Draft                 CoAP Patch                     March 2016


   JSON document original state
               {
                 "x-coord": 256,
                 "y-coord": 45",
                 "foo": ["bar","baz"]
               }

    REQ:
        iPATCH CoAP://www.example.com/object
   Content-Format: application/json-patch+json
            [
                { "op":"add","path":"foo/1","value":"bar"}
            ]
   RET:
        CoAP 4.12 Precondition Failed

   JSON document final state is unchanged

   REQ:
        PATCH CoAP://www.example.com/object
   Content-Format: application/json-patch+json
            [
                { "op":"add","path":"foo/1","value":"bar"}
            ]
   RET:
        CoAP 2.04 Changed

   JSON document final state

               {
                  "x-coord": 45,
                  "y-coord": 45,
                  "foo": ["bar","bar","baz"]
                }

2.2.  Response Codes

   PATCH (iPATCH) for CoAP adopt the response codes as specified in
   sections 5.9 and 12.1.2 of [RFC7252].

2.3.  Option Numbers

   PATCH for CoAP adopts the option numbers as specified in sections
   5.10 and 12.2 of [RFC7252].







van der Stok & Sehgal  Expires September 16, 2016               [Page 7]


Internet-Draft                 CoAP Patch                     March 2016


3.  Error Handling

   A PATCH (iPATCH) request may fail under certain known conditions.
   These situations should be dealt with as expressed below.

   Malformed PATCH (iPATCH) payload:  If a server determines that the
      payload provided with a PATCH (iPATCH) request is not properly
      formatted, it can return a 4.00 (Bad Request) CoAP error.  The
      definition of a malformed payload depends upon the CoAP Content-
      Format specified with the request.

   Unsupported PATCH (iPATCH) payload:  In case a client sends payload
      that is inappropriate for the resource identified by the Request-
      URI, the server can return a 4.15 (Unsupported Content-Format)
      CoAP error.  The server can determine if the payload is supported
      by checking the CoAP Content-Format specified with the request.

   Unprocessable request:  This situation occurs when the payload of a
      PATCH request is determined as valid, i.e. well-formed and
      supported, however, the server is unable to or incapable of
      processing the request.  The server can return a 4.22
      (Unprocessable Entity) CoAP error.  More specific scenarios might
      include situations when:

      *  the server has insufficient computing resources to complete the
         request successfully -- 4.13 (Request Entity Too Large) CoAP
         Response Code,

      *  the resource specified in the request becomes invalid by
         applying the payload -- 4.06 (Not Acceptable) CoAP Response
         Code,

      In case there are more specific errors that provide more insight
      into the problem, then those should be used.

   Resource not found:  The 4.04 (Not Found) error should be returned in
      case the payload of a PATCH request cannot be applied to a non-
      existent resource.

   Failed precondition:  In case the client uses the conditional If-
      Match or If-None-Match option to define a precondition for the
      PATCH request, and that precondition fails, then the server can
      return the 4.12 (Precondition Failed) CoAP error.

   Request too large:  If the payload of the PATCH request is larger
      than a CoAP server can process, then it can return the 4.13
      (Request Entity Too Large) CoAP error.




van der Stok & Sehgal  Expires September 16, 2016               [Page 8]


Internet-Draft                 CoAP Patch                     March 2016


   Conflicting state:  If the modification specified by a PATCH (iPATCH)
      request causes the resource to enter an inconsistent state that
      the server cannot resolve, the server can return the 4.09
      (Conflict) CoAP response.  The server SHOULD generate a payload
      that includes enough information for a user to recognize the
      source of the conflict.  The server MAY return the actual resource
      state to provide the client with the means to create a new
      consistent resource state.  Such a situation might be encountered
      when a structural modification is applied to a configuration data-
      store, but the structures being modified do not exist.

   Concurrent modification:  Resource constrained devices might need to
      process requests in the order they are received.  In case requests
      are received concurrently to modify the same resource but they
      cannot be queued, the server can return a 5.03 (Service
      unavailable) CoAP response code.

   Conflict handling failure:  If the modification implies the
      reservation of resources or the waiting on conditions to become
      true, leading to a too long request execution time, the server can
      return 5.03 (service unavailable) response code.

   It is possible that other error situations, not mentioned here, are
   encountered by a CoAP server while processing the PATCH request.  In
   these situations other appropriate CoAP status codes can also be
   returned.

4.  Security Considerations

   This section analyses the possible threats to the CoAP PATCH (iPATCH)
   protocol.  It is meant to inform protocol and application developers
   about the security limitations of CoAP PATCH (iPATCH) as described in
   this document.  The security consideration of section 15 of
   [RFC2616], section 11 of [RFC7252], and section 5 of [RFC5789] also
   apply.

   The security considerations for PATCH (iPATCH) are nearly identical
   to the security considerations for PUT ([RFC7252]).  The mechanisms
   used for PUT can be used for PATCH (iPATCH) as well.

   PATCH (iPATCH) is secured following the CoAP recommendations as
   specified in section 9 of [RFC7252].  When more appropriate security
   techniques are standardized for CoAP, PATCH (iPATCH) can also be
   secured by those new techniques.







van der Stok & Sehgal  Expires September 16, 2016               [Page 9]


Internet-Draft                 CoAP Patch                     March 2016


5.  IANA Considerations

   The entry with name PATCH in the sub-registry, "CoAP Method Codes",
   is 0.05.  The entry with name iPATCH in the sub-registry, "CoAP
   Method Codes", is 0.06.  The additions will follow the "IETF Review
   or IESG Approval" procedure as described in [RFC5226].

   A new response code must be entered to the sub-registry "CoAP
   response codes" which apply to the methods PATCH and iPATCH.

   Code 4.09 with Description "Conflict" and described in this
   specification.

   The addition to this sub-registry will follow the "IETF Review or
   IESG Approval" as described in [RFC5226].

   Additions to the sub-registry "CoAP Content-Formats", within the
   "CoRE Parameters" registry are needed for the following media type
   formats: "application/json-patch+json" [RFC6902], and "application/
   merge-patch+json" [RFC7396].

6.  Acknowledgements

   Klaus Hartke has pointed out some essential differences between CoAP
   and HTTP.  We are grateful for discussions with Christian Amsuss,
   Carsten Bormann, Timothy Carey, Paul Duffy, Kovatsch Matthias, Michel
   Veillette, Michael Verschoor, Thomas Watteyne, and Gengyu Wei.

7.  Change log

   When published as a RFC, this section needs to be removed.

   Version 0 to version 1:

   o  Changed patch motivation text.

   o  Removed sub-resource concept.

   o  Updated cache handling.

   o  Extended example.

   o  Update of error handling.

   Version 1 to version 2

   o  section 3 rephrased use of error 4.09




van der Stok & Sehgal  Expires September 16, 2016              [Page 10]


Internet-Draft                 CoAP Patch                     March 2016


   o  added conflict handling failure

   o  added idempotent iPATCH method

   Version 2 to version 3

   o  added line about default values

   o  content-Type to content_Format

   o  extended Patch example with non-idempotent request

8.  References

8.1.  Normative References

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <http://www.rfc-editor.org/info/rfc2119>.

   [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,
              <http://www.rfc-editor.org/info/rfc2616>.

   [RFC5226]  Narten, T. and H. Alvestrand, "Guidelines for Writing an
              IANA Considerations Section in RFCs", BCP 26, RFC 5226,
              DOI 10.17487/RFC5226, May 2008,
              <http://www.rfc-editor.org/info/rfc5226>.

   [RFC5789]  Dusseault, L. and J. Snell, "PATCH Method for HTTP",
              RFC 5789, DOI 10.17487/RFC5789, March 2010,
              <http://www.rfc-editor.org/info/rfc5789>.

   [RFC6902]  Bryan, P., Ed. and M. Nottingham, Ed., "JavaScript Object
              Notation (JSON) Patch", RFC 6902, DOI 10.17487/RFC6902,
              April 2013, <http://www.rfc-editor.org/info/rfc6902>.

   [RFC7252]  Shelby, Z., Hartke, K., and C. Bormann, "The Constrained
              Application Protocol (CoAP)", RFC 7252,
              DOI 10.17487/RFC7252, June 2014,
              <http://www.rfc-editor.org/info/rfc7252>.

   [RFC7396]  Hoffman, P. and J. Snell, "JSON Merge Patch", RFC 7396,
              DOI 10.17487/RFC7396, October 2014,
              <http://www.rfc-editor.org/info/rfc7396>.



van der Stok & Sehgal  Expires September 16, 2016              [Page 11]


Internet-Draft                 CoAP Patch                     March 2016


8.2.  Informative References

   [I-D.vanderstok-core-comi]
              Stok, P. and A. Bierman, "CoAP Management Interface",
              draft-vanderstok-core-comi-09 (work in progress), March
              2016.

Authors' Addresses

   Peter van der Stok
   Consultant

   Email: consultancy@vanderstok.org


   Anuj Sehgal
   Consultant

   Email: anuj@iurs.org
































van der Stok & Sehgal  Expires September 16, 2016              [Page 12]