| < draft-dusseault-http-patch-15.txt | draft-dusseault-http-patch-16.txt > | |||
|---|---|---|---|---|
| Network Working Group L. Dusseault | Network Working Group L. Dusseault | |||
| Internet-Draft Linden Lab | Internet-Draft Linden Lab | |||
| Intended status: Standards Track J. Snell | Intended status: Standards Track J. Snell | |||
| Expires: April 18, 2010 October 15, 2009 | Expires: May 29, 2010 November 25, 2009 | |||
| PATCH Method for HTTP | PATCH Method for HTTP | |||
| draft-dusseault-http-patch-15 | draft-dusseault-http-patch-16 | |||
| Abstract | ||||
| Several applications extending the Hypertext Transfer Protocol (HTTP) | ||||
| require a feature to do partial resource modification. The existing | ||||
| HTTP PUT method only allows a complete replacement of a document. | ||||
| This proposal adds a new HTTP method, PATCH, to modify an existing | ||||
| HTTP resource. | ||||
| Status of this Memo | Status of this Memo | |||
| This Internet-Draft is submitted to IETF in full conformance with the | This Internet-Draft is submitted to IETF in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF), its areas, and its working groups. Note that | Task Force (IETF), its areas, and its working groups. Note that | |||
| other groups may also distribute working documents as Internet- | other groups may also distribute working documents as Internet- | |||
| Drafts. | Drafts. | |||
| skipping to change at page 1, line 32 ¶ | skipping to change at page 1, line 40 ¶ | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| The list of current Internet-Drafts can be accessed at | The list of current Internet-Drafts can be accessed at | |||
| http://www.ietf.org/ietf/1id-abstracts.txt. | http://www.ietf.org/ietf/1id-abstracts.txt. | |||
| The list of Internet-Draft Shadow Directories can be accessed at | The list of Internet-Draft Shadow Directories can be accessed at | |||
| http://www.ietf.org/shadow.html. | http://www.ietf.org/shadow.html. | |||
| This Internet-Draft will expire on April 18, 2010. | This Internet-Draft will expire on May 29, 2010. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2009 IETF Trust and the persons identified as the | Copyright (c) 2009 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents in effect on the date of | Provisions Relating to IETF Documents | |||
| publication of this document (http://trustee.ietf.org/license-info). | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | ||||
| Abstract | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | ||||
| Several applications extending the Hypertext Transfer Protocol (HTTP) | described in the BSD License. | |||
| require a feature to do partial resource modification. The existing | ||||
| HTTP PUT method only allows a complete replacement of a document. | ||||
| This proposal adds a new HTTP method, PATCH, to modify an existing | ||||
| HTTP resource. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2. The PATCH Method . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. The PATCH Method . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2.1. A simple PATCH example . . . . . . . . . . . . . . . . . . 5 | 2.1. A simple PATCH example . . . . . . . . . . . . . . . . . . 5 | |||
| 2.2. Error handling . . . . . . . . . . . . . . . . . . . . . . 5 | 2.2. Error handling . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3. Advertising Support in OPTIONS . . . . . . . . . . . . . . . . 6 | 3. Advertising Support in OPTIONS . . . . . . . . . . . . . . . . 7 | |||
| 3.1. The Accept-Patch Header . . . . . . . . . . . . . . . . . 7 | 3.1. The Accept-Patch Header . . . . . . . . . . . . . . . . . 7 | |||
| 3.2. Example OPTIONS Request and Response . . . . . . . . . . . 7 | 3.2. Example OPTIONS Request and Response . . . . . . . . . . . 7 | |||
| 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 7 | 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.1. The 'Accept-Patch' Response Header . . . . . . . . . . . . 7 | 4.1. The 'Accept-Patch' Response Header . . . . . . . . . . . . 8 | |||
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | |||
| 6. References . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 6. References . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 6.1. Normative References . . . . . . . . . . . . . . . . . . . 8 | 6.1. Normative References . . . . . . . . . . . . . . . . . . . 9 | |||
| 6.2. Informative References . . . . . . . . . . . . . . . . . . 9 | 6.2. Informative References . . . . . . . . . . . . . . . . . . 9 | |||
| Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 9 | Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 9 | |||
| Appendix B. Changes . . . . . . . . . . . . . . . . . . . . . . . 9 | Appendix B. Changes . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| B.1. Changes from -00 . . . . . . . . . . . . . . . . . . . . . 9 | B.1. Changes from -00 . . . . . . . . . . . . . . . . . . . . . 10 | |||
| B.2. Changes from -01 . . . . . . . . . . . . . . . . . . . . . 9 | B.2. Changes from -01 . . . . . . . . . . . . . . . . . . . . . 10 | |||
| B.3. Changes from -02 . . . . . . . . . . . . . . . . . . . . . 9 | B.3. Changes from -02 . . . . . . . . . . . . . . . . . . . . . 10 | |||
| B.4. Changes from -03 . . . . . . . . . . . . . . . . . . . . . 10 | B.4. Changes from -03 . . . . . . . . . . . . . . . . . . . . . 11 | |||
| B.5. Changes from -04 . . . . . . . . . . . . . . . . . . . . . 10 | B.5. Changes from -04 . . . . . . . . . . . . . . . . . . . . . 11 | |||
| B.6. Changes from -05 . . . . . . . . . . . . . . . . . . . . . 10 | B.6. Changes from -05 . . . . . . . . . . . . . . . . . . . . . 11 | |||
| B.7. Changes from -06 . . . . . . . . . . . . . . . . . . . . . 10 | B.7. Changes from -06 . . . . . . . . . . . . . . . . . . . . . 11 | |||
| B.8. Changes from -07 . . . . . . . . . . . . . . . . . . . . . 11 | B.8. Changes from -07 . . . . . . . . . . . . . . . . . . . . . 11 | |||
| B.9. Changes from -08 . . . . . . . . . . . . . . . . . . . . . 11 | B.9. Changes from -08 . . . . . . . . . . . . . . . . . . . . . 12 | |||
| B.10. Changes from -09 . . . . . . . . . . . . . . . . . . . . . 12 | B.10. Changes from -09 . . . . . . . . . . . . . . . . . . . . . 12 | |||
| B.11. Changes from -10 . . . . . . . . . . . . . . . . . . . . . 12 | B.11. Changes from -10 . . . . . . . . . . . . . . . . . . . . . 12 | |||
| B.12. Changes from -11 . . . . . . . . . . . . . . . . . . . . . 12 | B.12. Changes from -11 . . . . . . . . . . . . . . . . . . . . . 13 | |||
| B.13. Changes from -12 . . . . . . . . . . . . . . . . . . . . . 12 | B.13. Changes from -12 . . . . . . . . . . . . . . . . . . . . . 13 | |||
| B.14. Changes from -13 . . . . . . . . . . . . . . . . . . . . . 12 | B.14. Changes from -13 . . . . . . . . . . . . . . . . . . . . . 13 | |||
| B.15. Changes from -14 . . . . . . . . . . . . . . . . . . . . . 13 | B.15. Changes from -14 . . . . . . . . . . . . . . . . . . . . . 13 | |||
| Appendix C. Notes to RFC Editor . . . . . . . . . . . . . . . . . 13 | B.16. Changes from -15 . . . . . . . . . . . . . . . . . . . . . 14 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 13 | Appendix C. Notes to RFC Editor . . . . . . . . . . . . . . . . . 14 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 14 | ||||
| 1. Introduction | 1. Introduction | |||
| This specification defines the new HTTP/1.1 [RFC2616] method PATCH | This specification defines the new HTTP/1.1 [RFC2616] method PATCH | |||
| that is used to apply partial modifications to a resource. | that is used to apply partial modifications to a resource. | |||
| A new method is necessary to improve interoperability and prevent | A new method is necessary to improve interoperability and prevent | |||
| errors. The PUT method is already defined to overwrite a resource | errors. The PUT method is already defined to overwrite a resource | |||
| with a complete new body, and can not be reused to do partial | with a complete new body, and can not be reused to do partial | |||
| changes. Otherwise, proxies and caches and even clients and servers | changes. Otherwise, proxies and caches and even clients and servers | |||
| may get confused as to the result of the operation. PATCH was | may get confused as to the result of the operation. POST is already | |||
| mentioned in earlier HTTP specifications, but not completely defined. | used but without broad interoperability (for one, there is no | |||
| standard way to discover patch format support). PATCH was mentioned | ||||
| in earlier HTTP specifications, but not completely defined. | ||||
| In this document, the key words "MUST", "MUST NOT", "REQUIRED", | In this document, the key words "MUST", "MUST NOT", "REQUIRED", | |||
| "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", | "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", | |||
| and "OPTIONAL" are to be interpreted as described in [RFC2119]. | and "OPTIONAL" are to be interpreted as described in [RFC2119]. | |||
| Furthermore, this document uses the ABNF syntax defined in Section | Furthermore, this document uses the ABNF syntax defined in Section | |||
| 2.1 of [RFC2616]. | 2.1 of [RFC2616]. | |||
| 2. The PATCH Method | 2. The PATCH Method | |||
| The PATCH method requests that a set of changes described in the | The PATCH method requests that a set of changes described in the | |||
| request entity be applied to the resource identified by the Request- | request entity be applied to the resource identified by the Request- | |||
| URI. The set of changes is represented in a format called a "patch | URI. The set of changes is represented in a format called a "patch | |||
| document" identified by a media type. If the Request-URI does not | document" identified by a media type. If the Request-URI does not | |||
| point to an existing resource, the server MAY create a new resource, | point to an existing resource, the server MAY create a new resource, | |||
| depending on the patch document type (whether it can logically modify | depending on the patch document type (whether it can logically modify | |||
| a null resource) and permissions etc. | a null resource) and permissions etc. | |||
| PATCH is neither safe or idempotent as defined by [RFC2616], Section | ||||
| 9.1. | ||||
| The difference between the PUT and PATCH requests is reflected in the | The difference between the PUT and PATCH requests is reflected in the | |||
| way the server processes the enclosed entity to modify the resource | way the server processes the enclosed entity to modify the resource | |||
| identified by the Request-URI. In a PUT request, the enclosed entity | identified by the Request-URI. In a PUT request, the enclosed entity | |||
| is considered to be a modified version of the resource stored on the | is considered to be a modified version of the resource stored on the | |||
| origin server and the client is requesting that the stored version be | origin server and the client is requesting that the stored version be | |||
| replaced. With PATCH, however, the enclosed entity contains a set of | replaced. With PATCH, however, the enclosed entity contains a set of | |||
| instructions describing how a resource currently residing on the | instructions describing how a resource currently residing on the | |||
| origin server should be modified to produce a new version. The PATCH | origin server should be modified to produce a new version. The PATCH | |||
| method affects the resource identified by the Request-URI, and also | method affects the resource identified by the Request-URI, and also | |||
| MAY have side effects on other resources; i.e., new resources may be | MAY have side effects on other resources; i.e., new resources may be | |||
| created, or existing ones modified, by the application of a PATCH. | created, or existing ones modified, by the application of a PATCH. | |||
| PATCH is neither safe or idempotent as defined by [RFC2616], Section | ||||
| 9.1. | ||||
| A PATCH request can be issued in such a way as to be idempotent, | ||||
| which also helps prevent bad outcomes from collisions between two | ||||
| PATCH requests on the same resource in a similar timeframe. | ||||
| Collisions from multiple PATCH requests may be more dangerous than | ||||
| PUT collisions, because some patch formats need to operate from a | ||||
| known base point or else corrupt the resource. Clients using this | ||||
| kind of patch application SHOULD acquire a strong ETag [RFC2616] for | ||||
| the resource to be modified, and use that ETag in the If-Match header | ||||
| on the PATCH request to verify that the resource is still unchanged. | ||||
| If a strong ETag is not available for a given resource, the client | ||||
| can use If-Unmodified-Since as a less-reliable safeguard. | ||||
| There are also cases where patch formats do not need to operate from | ||||
| a known base-point (e.g. appending text lines to log files, or non- | ||||
| colliding rows to database tables), in which case the same care in | ||||
| client requests is not needed. | ||||
| The server MUST apply the entire set of changes atomically and never | The server MUST apply the entire set of changes atomically and never | |||
| provide (e.g. in response to a GET during this operation) a | provide (e.g. in response to a GET during this operation) a | |||
| partially-modified representation. If the entire patch document | partially-modified representation. If the entire patch document | |||
| cannot be successfully applied then the server MUST fail the entire | cannot be successfully applied then the server MUST NOT apply any of | |||
| request, applying none of the changes. The determination of what | the changes. The determination of what constitutes a successful | |||
| constitutes a successful PATCH can vary depending on the patch | PATCH can vary depending on the patch document and the type of | |||
| document and the type of resource being modified. See Error Handling | resource(s) being modified. For example, the common 'diff' utility | |||
| in Section 2.2 for details on status codes and possible error | can generate a patch document that applies to multiple files in a | |||
| conditions. | directory hierarchy. The atomicity requirement holds for all | |||
| directly affected files. See Error Handling in Section 2.2 for | ||||
| details on status codes and possible error conditions. | ||||
| If the request passes through a cache and the Request-URI identifies | If the request passes through a cache and the Request-URI identifies | |||
| one or more currently cached entities, those entries SHOULD be | one or more currently cached entities, those entries SHOULD be | |||
| treated as stale. A response to this method is only cacheable if it | treated as stale. A response to this method is only cacheable if it | |||
| contains explicit freshness information (such as an Expires header or | contains explicit freshness information (such as an Expires header or | |||
| "Cache-Control: max-age" directive) as well as the Content-Location | "Cache-Control: max-age" directive) as well as the Content-Location | |||
| header matching the request-URI, indicating that the PATCH response | header matching the request-URI, indicating that the PATCH response | |||
| body is a resource representation. A cached PATCH response can only | body is a resource representation. A cached PATCH response can only | |||
| be used to respond to subsequent GET and HEAD requests; it MUST NOT | be used to respond to subsequent GET and HEAD requests; it MUST NOT | |||
| be used to respond to other methods (in particular, PATCH). | be used to respond to other methods (in particular, PATCH). | |||
| Collisions from multiple PATCH requests are more dangerous than PUT | ||||
| collisions, because a patch document that is not operating from a | ||||
| known base point may corrupt the resource. Clients wishing to apply | ||||
| a patch document to a known entity can first acquire the strong ETag | ||||
| [RFC2616] of the resource to be modified, and use that Etag in the | ||||
| If-Match header on the PATCH request to verify that the resource is | ||||
| still unchanged. If a strong ETag is not available for a given | ||||
| resource, the client can use If-Unmodified-Since as a less-reliable | ||||
| safeguard. | ||||
| Note that entity-headers contained in the request apply only to the | Note that entity-headers contained in the request apply only to the | |||
| contained patch document and MUST NOT be applied to the resource | contained patch document and MUST NOT be applied to the resource | |||
| being modified. Thus, a Content-Language header could be present on | being modified. Thus, a Content-Language header could be present on | |||
| the request but it would only mean (for whatever that's worth) that | the request but it would only mean (for whatever that's worth) that | |||
| the patch document had a language. Servers SHOULD NOT store such | the patch document had a language. Servers SHOULD NOT store such | |||
| headers except as trace information, and SHOULD NOT use such header | headers except as trace information, and SHOULD NOT use such header | |||
| values the same way they might be used on PUT requests. Therefore, | values the same way they might be used on PUT requests. Therefore, | |||
| this document does not specify a way to modify a document's Content- | this document does not specify a way to modify a document's Content- | |||
| Type or Content-Language value through headers, though a mechanism | Type or Content-Language value through headers, though a mechanism | |||
| could well be designed to achieve this goal through a patch document. | could well be designed to achieve this goal through a patch document. | |||
| skipping to change at page 5, line 26 ¶ | skipping to change at page 5, line 37 ¶ | |||
| Host: www.example.com | Host: www.example.com | |||
| Content-Type: application/example | Content-Type: application/example | |||
| If-Match: "e0023aa4e" | If-Match: "e0023aa4e" | |||
| Content-Length: 100 | Content-Length: 100 | |||
| [description of changes] | [description of changes] | |||
| This example illustrates use of a hypothetical patch document on an | This example illustrates use of a hypothetical patch document on an | |||
| existing resource. The 204 response code is used because the | existing resource. The 204 response code is used because the | |||
| response does not have a body (a response with the 200 code would | response does not have a body (a response with the 200 code would | |||
| have a body) but other success codes MAY be used if appropriate. | have a body) but other success codes can be used if appropriate. | |||
| Successful PATCH response to existing text file | Successful PATCH response to existing text file | |||
| HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
| Content-Location: /file.txt | ||||
| ETag: "e0023aa4f" | ETag: "e0023aa4f" | |||
| 2.2. Error handling | 2.2. Error handling | |||
| There are several known conditions under which a PATCH request can | There are several known conditions under which a PATCH request can | |||
| fail. | fail. | |||
| Malformed patch document: Can be specified using a 400 (Bad Request) | Malformed patch document: When the server determines that the patch | |||
| when the server finds that the patch document provided by the | document provided by the client is not properly formatted, it | |||
| client was not properly formatted. The definition of badly | SHOULD return a 400 (Bad Request) response. The definition of | |||
| formatted depends on the patch document chosen, but generally if | badly formatted depends on the patch document chosen. | |||
| the server finds it cannot handle the patch due to the | ||||
| serialization of the patch document, this response ought to be | ||||
| appropriate. | ||||
| Unsupported patch document: Can be specified using a 415 | Unsupported patch document: Can be specified using a 415 | |||
| (Unsupported Media Type) when the client sends a patch document | (Unsupported Media Type) when the client sends a patch document | |||
| format that the server does not support for the resource | format that the server does not support for the resource | |||
| identified by the Request-URI. Such a response SHOULD include an | identified by the Request-URI. Such a response SHOULD include an | |||
| Accept-Patch response header as described in Section 3.1 to notify | Accept-Patch response header as described in Section 3.1 to notify | |||
| the client what patch document formats are supported. | the client what patch document media types are supported. | |||
| Unprocessable request: Can be specified with a 422 (Unprocessable | Unprocessable request: Can be specified with a 422 (Unprocessable | |||
| Entity) ([RFC4918], Section 11.2) when the server understands the | Entity) ([RFC4918], Section 11.2) when the server understands the | |||
| patch document and the syntax of the patch document appears valid, | patch document and the syntax of the patch document appears valid, | |||
| but the server is incapable of processing the request. This might | but the server is incapable of processing the request. This might | |||
| include attempts to modify a resource in a way that would cause | include attempts to modify a resource in a way that would cause | |||
| the resource to become invalid: for instance, a modification to a | the resource to become invalid: for instance, a modification to a | |||
| well-formed XML document that would cause it to no longer be well- | well-formed XML document that would cause it to no longer be well- | |||
| formed. There may also be more specific errors like "Conflicting | formed. There may also be more specific errors like "Conflicting | |||
| State" that could be signaled with this status code, but the more | State" that could be signaled with this status code, but the more | |||
| specific error would generally be more helpful. | specific error would generally be more helpful. | |||
| Resource Not Found: Can be specified with a 404 (Not Found) status | Resource Not Found: Can be specified with a 404 (Not Found) status | |||
| code, when the client attempted to apply a patch document to a | code, when the client attempted to apply a patch document to a | |||
| non-existent resource, but the patch document chosen cannot be | non-existent resource, but the patch document chosen cannot be | |||
| applied to a non-existent resource. | applied to a non-existent resource. | |||
| Conflicting State: Can be specified with a 409 (Conflict) when the | Conflicting State: Can be specified with a 409 (Conflict) when the | |||
| request cannot be applied given the state of the resource. For | request cannot be applied given the state of the resource. For | |||
| example, if the client attempted to apply a structural | example, if the client attempted to apply a structural | |||
| modification and the structures assumed to exist did not exist | modification and the structures assumed to exist did not exist | |||
| (with XML, a patch might specify changing element 'foo' to element | (with XML, a patch might specify changing element 'foo' to element | |||
| 'bar' but element 'foo' might not exist). | 'bar' but element 'foo' might not exist). | |||
| Conflicting modification: Specified with a 412 (Precondition Failed) | Conflicting modification: When a client uses either the If-Match or | |||
| when a client uses either the If-Match or If-Unmodified-Since | If-Unmodified-Since header to define a precondition, and that | |||
| request headers and attempts to apply a patch document to a | precondition failed, then the 412 (Precondition Failed) error is | |||
| resource whose state has changed since the patch was created. If | most helpful to the client. However, that response makes no sense | |||
| the server detects a possible conflicting modification and neither | if there was no precondition on the request. In cases when the | |||
| the If-Match or If-Unmodified-Since request headers are used, the | server detects a possible conflicting modification and no | |||
| server can return a 409 (Conflict) response. | precondition was defined in the request, the server can return a | |||
| Concurrent modification: When a server receives multiple concurrent | 409 (Conflict) response. | |||
| requests to modify a resource, those requests SHOULD be queued and | Concurrent modification: Some applications of PATCH might require | |||
| processed in the order in which they are received. If a server is | the server to process requests in the order in which they are | |||
| incapable of queuing concurrent requests, all subsequent requests | received. If a server is operating under those restrictions, and | |||
| SHOULD be rejected with a 409 (Conflict) until the first | it receives concurrent requests to modify the same resource, but | |||
| modification request is complete. | is unable to queue those requests, the server can usefully | |||
| indicate this error by using a 409 (Conflict) response. | ||||
| Note that the 409 Conflict response gives reasonably consistent | ||||
| information to clients. Depending on the application and the nature | ||||
| of the patch format, the client might be able to reissue the request | ||||
| as is (e.g. an instruction to append a line to a log file), or it | ||||
| might have to retrieve the resource content to recalculate a patch, | ||||
| or it might have to fail the operation. | ||||
| Other HTTP status codes can also be used under the appropriate | Other HTTP status codes can also be used under the appropriate | |||
| circumstances. | circumstances. | |||
| The entity body of error responses SHOULD contain enough information | The entity body of error responses SHOULD contain enough information | |||
| to communicate the nature of the error to the client. The content- | to communicate the nature of the error to the client. The content- | |||
| type of the response entity can vary across implementations. | type of the response entity can vary across implementations. | |||
| 3. Advertising Support in OPTIONS | 3. Advertising Support in OPTIONS | |||
| skipping to change at page 8, line 21 ¶ | skipping to change at page 8, line 39 ¶ | |||
| security considerations for PUT ([RFC2616], Section 9.6). These | security considerations for PUT ([RFC2616], Section 9.6). These | |||
| include authorizing requests (possibly through access control and/or | include authorizing requests (possibly through access control and/or | |||
| authentication) and ensuring that data is not corrupted through | authentication) and ensuring that data is not corrupted through | |||
| transport errors or through accidental overwrites. Whatever | transport errors or through accidental overwrites. Whatever | |||
| mechanisms are used for PUT can be used for PATCH as well. The | mechanisms are used for PUT can be used for PATCH as well. The | |||
| following considerations apply specially to PATCH. | following considerations apply specially to PATCH. | |||
| A document that is patched might be more likely to be corrupted than | A document that is patched might be more likely to be corrupted than | |||
| a document that is overridden in entirety, but that concern can be | a document that is overridden in entirety, but that concern can be | |||
| addressed through the use of mechanisms such as conditional requests | addressed through the use of mechanisms such as conditional requests | |||
| using ETags and the If-Match request header. | using ETags and the If-Match request header as described in | |||
| Section 2. If a PATCH request fails, the client can issue a GET | ||||
| request to the resource to see what state it is in. In some cases, | ||||
| the client might be able to check the contents of the resource to see | ||||
| if the PATCH request can be resent, but in other cases the attempt | ||||
| will just fail and/or a user will have to verify intent. In the case | ||||
| of a failure of the underlying transport channel, where a PATCH | ||||
| response is not received before the channel fails or some other | ||||
| timeout happens, the client might have to issue a GET request to see | ||||
| whether the request was applied. The client might want to ensure | ||||
| that the GET request bypasses caches using mechanisms described in | ||||
| HTTP specifications (see for example Section 13.1.6 of [RFC2616]). | ||||
| Sometimes an HTTP intermediary might try to detect viruses being sent | Sometimes an HTTP intermediary might try to detect viruses being sent | |||
| via HTTP by checking the body of the PUT/POST request or GET | via HTTP by checking the body of the PUT/POST request or GET | |||
| response. The PATCH method complicates such watch-keeping because | response. The PATCH method complicates such watch-keeping because | |||
| neither the source document nor the patch document might be a virus, | neither the source document nor the patch document might be a virus, | |||
| yet the result could be. This security consideration is not | yet the result could be. This security consideration is not | |||
| materially different from those already introduced by byte-range | materially different from those already introduced by byte-range | |||
| downloads, downloading patch documents, uploading zipped (compressed) | downloads, downloading patch documents, uploading zipped (compressed) | |||
| files and so on. | files and so on. | |||
| skipping to change at page 9, line 23 ¶ | skipping to change at page 10, line 4 ¶ | |||
| Appendix A. Acknowledgements | Appendix A. Acknowledgements | |||
| PATCH is not a new concept, it first appeared in HTTP in drafts of | PATCH is not a new concept, it first appeared in HTTP in drafts of | |||
| version 1.1 written by Roy Fielding and Henrik Frystyk and also | version 1.1 written by Roy Fielding and Henrik Frystyk and also | |||
| appears in Section 19.6.1.1 of RFC 2068. | appears in Section 19.6.1.1 of RFC 2068. | |||
| Thanks to Adam Roach, Chris Sharp, Julian Reschke, Geoff Clemm, Scott | Thanks to Adam Roach, Chris Sharp, Julian Reschke, Geoff Clemm, Scott | |||
| Lawrence, Jeffrey Mogul, Roy Fielding, Greg Stein, Jim Luther, Alex | Lawrence, Jeffrey Mogul, Roy Fielding, Greg Stein, Jim Luther, Alex | |||
| Rousskov, Jamie Lokier, Joe Hildebrand, Mark Nottingham, Michael | Rousskov, Jamie Lokier, Joe Hildebrand, Mark Nottingham, Michael | |||
| Balloni and Cyrus Daboo for review and advice on this document. | Balloni, Cyrus Daboo, Brian Carpenter, John Klensin, Eliot Lear and | |||
| SM for review and advice on this document. | ||||
| Appendix B. Changes | Appendix B. Changes | |||
| B.1. Changes from -00 | B.1. Changes from -00 | |||
| OPTIONS support: removed "Patch" header definition and used Allow and | OPTIONS support: removed "Patch" header definition and used Allow and | |||
| new "Accept-Patch" headers instead. | new "Accept-Patch" headers instead. | |||
| Supported delta encodings: removed vcdiff and diffe as these do not | Supported delta encodings: removed vcdiff and diffe as these do not | |||
| have defined MIME types and did not seem to be strongly desired. | have defined MIME types and did not seem to be strongly desired. | |||
| skipping to change at page 13, line 24 ¶ | skipping to change at page 14, line 7 ¶ | |||
| -- it is not absolutely required | -- it is not absolutely required | |||
| Clarified how server can indicate that a PATCH response body is | Clarified how server can indicate that a PATCH response body is | |||
| cachable as a resource representation. | cachable as a resource representation. | |||
| Removed suggestion that PATCH side-effects might be specified in the | Removed suggestion that PATCH side-effects might be specified in the | |||
| patch document specification -- this implied that side-effects could | patch document specification -- this implied that side-effects could | |||
| exclusively be determined that way, but in fact side-effects are | exclusively be determined that way, but in fact side-effects are | |||
| often determined by the server unilaterally. | often determined by the server unilaterally. | |||
| B.16. Changes from -15 | ||||
| Clarifications on how conflicting PATCH requests can be avoided, and | ||||
| why not all use cases necessarily involve conflict | ||||
| Added Content-Location to example response, so the ETag would be | ||||
| legit | ||||
| Expanded security considerations on avoiding collisions, recovering | ||||
| from possible (unknown) collisions | ||||
| Very slight reordering of paragraphs in section 2, for better flow | ||||
| Clarified that the concurrent-modification status response is | ||||
| optional for servers, and explained what clients can do with that | ||||
| response | ||||
| Updated text describing conflicting modifications: when 412 is used, | ||||
| vs 409 | ||||
| Appendix C. Notes to RFC Editor | Appendix C. Notes to RFC Editor | |||
| The RFC Editor should remove this section and the Changes section. | The RFC Editor should remove this section and the Changes section. | |||
| Authors' Addresses | Authors' Addresses | |||
| Lisa Dusseault | Lisa Dusseault | |||
| Linden Lab | Linden Lab | |||
| 945 Battery Street | 945 Battery Street | |||
| San Francisco, CA 94111 | San Francisco, CA 94111 | |||
| End of changes. 24 change blocks. | ||||
| 81 lines changed or deleted | 133 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/ | ||||