rfc2518.txt | draft-ietf-webdav-rfc2518bis-latest.txt | |||
---|---|---|---|---|
Network Working Group Y. Goland | WebDAV Working Group L. Dusseault, Ed. | |||
Request for Comments: 2518 Microsoft | Internet-Draft CommerceNet | |||
Category: Standards Track E. Whitehead | Obsoletes: 2518 (if approved) February 15, 2007 | |||
UC Irvine | Intended status: Standards Track | |||
A. Faizi | Expires: August 19, 2007 | |||
Netscape | ||||
S. Carter | ||||
D. Jensen | ||||
Novell | ||||
February 1999 | ||||
HTTP Extensions for Distributed Authoring -- WEBDAV | HTTP Extensions for Distributed Authoring - WebDAV | |||
draft-ietf-webdav-rfc2518bis-18 | ||||
Status of this Memo | Status of this Memo | |||
This document specifies an Internet standards track protocol for the | By submitting this Internet-Draft, each author represents that any | |||
Internet community, and requests discussion and suggestions for | applicable patent or other IPR claims of which he or she is aware | |||
improvements. Please refer to the current edition of the "Internet | have been or will be disclosed, and any of which he or she becomes | |||
Official Protocol Standards" (STD 1) for the standardization state | aware will be disclosed, in accordance with Section 6 of BCP 79. | |||
and status of this protocol. Distribution of this memo is unlimited. | ||||
Copyright Notice | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF), its areas, and its working groups. Note that | ||||
other groups may also distribute working documents as Internet- | ||||
Drafts. | ||||
Copyright (C) The Internet Society (1999). All Rights Reserved. | 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." | ||||
The list of current Internet-Drafts can be accessed at | ||||
http://www.ietf.org/ietf/1id-abstracts.txt. | ||||
The list of Internet-Draft Shadow Directories can be accessed at | ||||
http://www.ietf.org/shadow.html. | ||||
This Internet-Draft will expire on August 19, 2007. | ||||
Abstract | Abstract | |||
This document specifies a set of methods, headers, and content-types | WebDAV consists of a set of methods, headers, and content-types | |||
ancillary to HTTP/1.1 for the management of resource properties, | ancillary to HTTP/1.1 for the management of resource properties, | |||
creation and management of resource collections, namespace | creation and management of resource collections, URL namespace | |||
manipulation, and resource locking (collision avoidance). | manipulation, and resource locking (collision avoidance). | |||
Table of Contents | RFC2518 was published in February 1999, and this specification makes | |||
minor revisions mostly due to interoperability experience. | ||||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 6 | Table of Contents | |||
2. Notational Conventions . . . . . . . . . . . . . . . . . . . 7 | ||||
3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 7 | ||||
4. Data Model for Resource Properties . . . . . . . . . . . . . 8 | ||||
4.1. The Resource Property Model . . . . . . . . . . . . . . 8 | ||||
4.2. Existing Metadata Proposals . . . . . . . . . . . . . . 9 | ||||
4.3. Properties and HTTP Headers . . . . . . . . . . . . . . 9 | ||||
4.4. Property Values . . . . . . . . . . . . . . . . . . . . 10 | ||||
4.5. Property Names . . . . . . . . . . . . . . . . . . . . . 10 | ||||
4.6. Media Independent Links . . . . . . . . . . . . . . . . 11 | ||||
5. Collections of Web Resources . . . . . . . . . . . . . . . . 11 | ||||
5.1. HTTP URL Namespace Model . . . . . . . . . . . . . . . . 11 | ||||
5.2. Collection Resources . . . . . . . . . . . . . . . . . . 11 | ||||
5.3. Creation and Retrieval of Collection Resources . . . . . 13 | ||||
5.4. Source Resources and Output Resources . . . . . . . . . 13 | ||||
6. Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 | ||||
6.1. Exclusive Vs. Shared Locks . . . . . . . . . . . . . . . 15 | ||||
6.2. Required Support . . . . . . . . . . . . . . . . . . . . 16 | ||||
6.3. Lock Tokens . . . . . . . . . . . . . . . . . . . . . . 16 | ||||
6.4. opaquelocktoken Lock Token URI Scheme . . . . . . . . . 16 | ||||
6.4.1. Node Field Generation Without the IEEE 802 Address . 17 | ||||
6.5. Lock Capability Discovery . . . . . . . . . . . . . . . 19 | ||||
6.6. Active Lock Discovery . . . . . . . . . . . . . . . . . 19 | ||||
6.7. Usage Considerations . . . . . . . . . . . . . . . . . . 20 | ||||
7. Write Lock . . . . . . . . . . . . . . . . . . . . . . . . . 21 | ||||
7.1. Methods Restricted by Write Locks . . . . . . . . . . . 21 | ||||
7.2. Write Locks and Lock Tokens . . . . . . . . . . . . . . 21 | ||||
7.3. Write Locks and Properties . . . . . . . . . . . . . . . 21 | ||||
7.4. Write Locks and Null Resources . . . . . . . . . . . . . 21 | ||||
7.5. Write Locks and Collections . . . . . . . . . . . . . . 22 | ||||
7.6. Write Locks and the If Request Header . . . . . . . . . 22 | ||||
7.6.1. Example - Write Lock . . . . . . . . . . . . . . . . 23 | ||||
7.7. Write Locks and COPY/MOVE . . . . . . . . . . . . . . . 23 | ||||
7.8. Refreshing Write Locks . . . . . . . . . . . . . . . . . 24 | ||||
8. HTTP Methods for Distributed Authoring . . . . . . . . . . . 24 | ||||
8.1. PROPFIND . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
8.1.1. Example - Retrieving Named Properties . . . . . . . 26 | ||||
8.1.2. Example - Using allprop to Retrieve All Properties . 28 | ||||
8.1.3. Example - Using propname to Retrieve all Property | ||||
Names . . . . . . . . . . . . . . . . . . . . . . . 31 | ||||
8.2. PROPPATCH . . . . . . . . . . . . . . . . . . . . . . . 33 | ||||
8.2.1. Status Codes for use with 207 (Multi-Status) . . . . 33 | ||||
8.2.2. Example - PROPPATCH . . . . . . . . . . . . . . . . 34 | ||||
8.3. MKCOL Method . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
8.3.1. Request . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
8.3.2. Status Codes . . . . . . . . . . . . . . . . . . . . 36 | ||||
8.3.3. Example - MKCOL . . . . . . . . . . . . . . . . . . 36 | ||||
8.4. GET, HEAD for Collections . . . . . . . . . . . . . . . 37 | ||||
8.5. POST for Collections . . . . . . . . . . . . . . . . . . 37 | ||||
8.6. DELETE . . . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
8.6.1. DELETE for Non-Collection Resources . . . . . . . . 37 | ||||
8.6.2. DELETE for Collections . . . . . . . . . . . . . . . 37 | ||||
8.7. PUT . . . . . . . . . . . . . . . . . . . . . . . . . . 39 | ||||
8.7.1. PUT for Non-Collection Resources . . . . . . . . . . 39 | ||||
8.7.2. PUT for Collections . . . . . . . . . . . . . . . . 39 | ||||
8.8. COPY Method . . . . . . . . . . . . . . . . . . . . . . 39 | ||||
8.8.1. COPY for HTTP/1.1 resources . . . . . . . . . . . . 40 | ||||
8.8.2. COPY for Properties . . . . . . . . . . . . . . . . 40 | ||||
8.8.3. COPY for Collections . . . . . . . . . . . . . . . . 40 | ||||
8.8.4. COPY and the Overwrite Header . . . . . . . . . . . 42 | ||||
8.8.5. Status Codes . . . . . . . . . . . . . . . . . . . . 42 | ||||
8.8.6. Example - COPY with Overwrite . . . . . . . . . . . 42 | ||||
8.8.7. Example - COPY with No Overwrite . . . . . . . . . . 43 | ||||
8.8.8. Example - COPY of a Collection . . . . . . . . . . . 43 | ||||
8.9. MOVE Method . . . . . . . . . . . . . . . . . . . . . . 44 | ||||
8.9.1. MOVE for Properties . . . . . . . . . . . . . . . . 45 | ||||
8.9.2. MOVE for Collections . . . . . . . . . . . . . . . . 45 | ||||
8.9.3. MOVE and the Overwrite Header . . . . . . . . . . . 46 | ||||
8.9.4. Status Codes . . . . . . . . . . . . . . . . . . . . 46 | ||||
8.9.5. Example - MOVE of a Non-Collection . . . . . . . . . 46 | ||||
8.9.6. Example - MOVE of a Collection . . . . . . . . . . . 47 | ||||
8.10. LOCK Method . . . . . . . . . . . . . . . . . . . . . . 48 | ||||
8.10.1. Operation . . . . . . . . . . . . . . . . . . . . . 48 | ||||
8.10.2. The Effect of Locks on Properties and Collections . 48 | ||||
8.10.3. Locking Replicated Resources . . . . . . . . . . . . 49 | ||||
8.10.4. Depth and Locking . . . . . . . . . . . . . . . . . 49 | ||||
8.10.5. Interaction with other Methods . . . . . . . . . . . 49 | ||||
8.10.6. Lock Compatibility Table . . . . . . . . . . . . . . 50 | ||||
8.10.7. Status Codes . . . . . . . . . . . . . . . . . . . . 50 | ||||
8.10.8. Example - Simple Lock Request . . . . . . . . . . . 51 | ||||
8.10.9. Example - Refreshing a Write Lock . . . . . . . . . 53 | ||||
8.10.10. Example - Multi-Resource Lock Request . . . . . . . 54 | ||||
8.11. UNLOCK Method . . . . . . . . . . . . . . . . . . . . . 55 | ||||
8.11.1. Example - UNLOCK . . . . . . . . . . . . . . . . . . 55 | ||||
9. HTTP Headers for Distributed Authoring . . . . . . . . . . . 56 | ||||
9.1. DAV Header . . . . . . . . . . . . . . . . . . . . . . . 56 | ||||
9.2. Depth Header . . . . . . . . . . . . . . . . . . . . . . 56 | ||||
9.3. Destination Header . . . . . . . . . . . . . . . . . . . 57 | ||||
9.4. If Header . . . . . . . . . . . . . . . . . . . . . . . 57 | ||||
9.4.1. No-tag-list Production . . . . . . . . . . . . . . . 58 | ||||
9.4.2. Tagged-list Production . . . . . . . . . . . . . . . 58 | ||||
9.4.3. not Production . . . . . . . . . . . . . . . . . . . 59 | ||||
9.4.4. Matching Function . . . . . . . . . . . . . . . . . 60 | ||||
9.4.5. If Header and Non-DAV Compliant Proxies . . . . . . 60 | ||||
9.5. Lock-Token Header . . . . . . . . . . . . . . . . . . . 60 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
9.6. Overwrite Header . . . . . . . . . . . . . . . . . . . . 60 | 2. Notational Conventions . . . . . . . . . . . . . . . . . . . 10 | |||
9.7. Status-URI Response Header . . . . . . . . . . . . . . . 61 | 3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
9.8. Timeout Request Header . . . . . . . . . . . . . . . . . 61 | 4. Data Model for Resource Properties . . . . . . . . . . . . . 13 | |||
10. Status Code Extensions to HTTP/1.1 . . . . . . . . . . . . . 62 | 4.1. The Resource Property Model . . . . . . . . . . . . . . 13 | |||
10.1. 102 Processing . . . . . . . . . . . . . . . . . . . . . 62 | 4.2. Properties and HTTP Headers . . . . . . . . . . . . . . 13 | |||
10.2. 207 Multi-Status . . . . . . . . . . . . . . . . . . . . 63 | 4.3. Property Values . . . . . . . . . . . . . . . . . . . . 13 | |||
10.3. 422 Unprocessable Entity . . . . . . . . . . . . . . . . 63 | 4.3.1. Example - Property with Mixed Content . . . . . . . 15 | |||
10.4. 423 Locked . . . . . . . . . . . . . . . . . . . . . . . 63 | 4.4. Property Names . . . . . . . . . . . . . . . . . . . . . 17 | |||
10.5. 424 Failed Dependency . . . . . . . . . . . . . . . . . 63 | 4.5. Source Resources and Output Resources . . . . . . . . . 17 | |||
10.6. 507 Insufficient Storage . . . . . . . . . . . . . . . . 63 | 5. Collections of Web Resources . . . . . . . . . . . . . . . . 18 | |||
11. Multi-Status Response . . . . . . . . . . . . . . . . . . . . 64 | 5.1. HTTP URL Namespace Model . . . . . . . . . . . . . . . . 18 | |||
12. XML Element Definitions . . . . . . . . . . . . . . . . . . . 64 | 5.2. Collection Resources . . . . . . . . . . . . . . . . . . 18 | |||
12.1. activelock XML Element . . . . . . . . . . . . . . . . . 64 | 6. Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
12.1.1. depth XML Element . . . . . . . . . . . . . . . . . 64 | 6.1. Lock Model . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
12.1.2. locktoken XML Element . . . . . . . . . . . . . . . 65 | 6.2. Exclusive Vs. Shared Locks . . . . . . . . . . . . . . . 22 | |||
12.1.3. timeout XML Element . . . . . . . . . . . . . . . . 65 | 6.3. Required Support . . . . . . . . . . . . . . . . . . . . 23 | |||
12.2. collection XML Element . . . . . . . . . . . . . . . . . 65 | 6.4. Lock Creator and Privileges . . . . . . . . . . . . . . 23 | |||
12.3. href XML Element . . . . . . . . . . . . . . . . . . . . 65 | 6.5. Lock Tokens . . . . . . . . . . . . . . . . . . . . . . 24 | |||
12.4. link XML Element . . . . . . . . . . . . . . . . . . . . 66 | 6.6. Lock Timeout . . . . . . . . . . . . . . . . . . . . . . 25 | |||
12.4.1. dst XML Element . . . . . . . . . . . . . . . . . . 66 | 6.7. Lock Capability Discovery . . . . . . . . . . . . . . . 25 | |||
12.4.2. src XML Element . . . . . . . . . . . . . . . . . . 66 | 6.8. Active Lock Discovery . . . . . . . . . . . . . . . . . 26 | |||
12.5. lockentry XML Element . . . . . . . . . . . . . . . . . 67 | 7. Write Lock . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
12.6. lockinfo XML Element . . . . . . . . . . . . . . . . . . 67 | 7.1. Write Locks and Properties . . . . . . . . . . . . . . . 27 | |||
12.7. lockscope XML Element . . . . . . . . . . . . . . . . . 67 | 7.2. Avoiding Lost Updates . . . . . . . . . . . . . . . . . 28 | |||
12.7.1. exclusive XML Element . . . . . . . . . . . . . . . 68 | 7.3. Write Locks and Unmapped URLs . . . . . . . . . . . . . 29 | |||
12.7.2. shared XML Element . . . . . . . . . . . . . . . . . 68 | 7.4. Write Locks and Collections . . . . . . . . . . . . . . 30 | |||
12.8. locktype XML Element . . . . . . . . . . . . . . . . . . 68 | 7.5. Write Locks and the If Request Header . . . . . . . . . 31 | |||
12.8.1. write XML Element . . . . . . . . . . . . . . . . . 68 | 7.5.1. Example - Write Lock and COPY . . . . . . . . . . . 32 | |||
12.9. multistatus XML Element . . . . . . . . . . . . . . . . 69 | 7.5.2. Example - Deleting a Member of a Locked Collection . 32 | |||
12.9.1. response XML Element . . . . . . . . . . . . . . . . 69 | 7.6. Write Locks and COPY/MOVE . . . . . . . . . . . . . . . 33 | |||
12.9.2. responsedescription XML Element . . . . . . . . . . 70 | 7.7. Refreshing Write Locks . . . . . . . . . . . . . . . . . 34 | |||
12.10. owner XML Element . . . . . . . . . . . . . . . . . . . 70 | 8. General Request and Response Handling . . . . . . . . . . . . 35 | |||
12.11. prop XML element . . . . . . . . . . . . . . . . . . . . 71 | 8.1. Precedence in Error Handling . . . . . . . . . . . . . . 35 | |||
12.12. propertybehavior XML element . . . . . . . . . . . . . . 71 | 8.2. Use of XML . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
12.12.1. keepalive XML element . . . . . . . . . . . . . . . 71 | 8.3. URL Handling . . . . . . . . . . . . . . . . . . . . . . 36 | |||
12.12.2. omit XML element . . . . . . . . . . . . . . . . . . 72 | 8.3.1. Example - Correct URL Handling . . . . . . . . . . . 36 | |||
12.13. propertyupdate XML element . . . . . . . . . . . . . . . 72 | 8.4. Required Bodies in Requests . . . . . . . . . . . . . . 37 | |||
12.13.1. remove XML element . . . . . . . . . . . . . . . . . 73 | 8.5. HTTP Headers for use in WebDAV . . . . . . . . . . . . . 37 | |||
12.13.2. set XML element . . . . . . . . . . . . . . . . . . 73 | 8.6. ETag . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
12.14. propfind XML Element . . . . . . . . . . . . . . . . . . 74 | 8.7. Including Error Response Bodies . . . . . . . . . . . . 38 | |||
12.14.1. allprop XML Element . . . . . . . . . . . . . . . . 74 | 8.8. Impact of Namespace Operations on Cache Validators . . . 38 | |||
12.14.2. propname XML Element . . . . . . . . . . . . . . . . 74 | 9. HTTP Methods for Distributed Authoring . . . . . . . . . . . 40 | |||
13. DAV Properties . . . . . . . . . . . . . . . . . . . . . . . 74 | 9.1. PROPFIND Method . . . . . . . . . . . . . . . . . . . . 40 | |||
13.1. creationdate Property . . . . . . . . . . . . . . . . . 75 | 9.1.1. PROPFIND Status Codes . . . . . . . . . . . . . . . 41 | |||
13.2. displayname Property . . . . . . . . . . . . . . . . . . 75 | 9.1.2. Status Codes for Use in 'propstat' Element . . . . . 42 | |||
13.3. getcontentlanguage Property . . . . . . . . . . . . . . 75 | 9.1.3. Example - Retrieving Named Properties . . . . . . . 42 | |||
13.4. getcontentlength Property . . . . . . . . . . . . . . . 76 | 9.1.4. Example - Using 'propname' to Retrieve All | |||
13.5. getcontenttype Property . . . . . . . . . . . . . . . . 76 | Property Names . . . . . . . . . . . . . . . . . . . 44 | |||
13.6. getetag Property . . . . . . . . . . . . . . . . . . . . 76 | 9.1.5. Example - Using So-called 'allprop' . . . . . . . . 46 | |||
13.7. getlastmodified Property . . . . . . . . . . . . . . . . 77 | 9.1.6. Example - Using 'allprop' with 'include' . . . . . . 49 | |||
13.8. lockdiscovery Property . . . . . . . . . . . . . . . . . 77 | 9.2. PROPPATCH Method . . . . . . . . . . . . . . . . . . . . 49 | |||
13.8.1. Example - Retrieving the lockdiscovery Property . . 78 | 9.2.1. Status Codes for Use in 'propstat' Element . . . . . 50 | |||
13.9. resourcetype Property . . . . . . . . . . . . . . . . . 79 | 9.2.2. Example - PROPPATCH . . . . . . . . . . . . . . . . 51 | |||
13.10. source Property . . . . . . . . . . . . . . . . . . . . 80 | 9.3. MKCOL Method . . . . . . . . . . . . . . . . . . . . . . 52 | |||
13.10.1. Example - A source Property . . . . . . . . . . . . 80 | 9.3.1. MKCOL Status Codes . . . . . . . . . . . . . . . . . 53 | |||
13.11. supportedlock Property . . . . . . . . . . . . . . . . . 81 | 9.3.2. Example - MKCOL . . . . . . . . . . . . . . . . . . 53 | |||
13.11.1. Example - Retrieving the supportedlock Property . . 81 | 9.4. GET, HEAD for Collections . . . . . . . . . . . . . . . 54 | |||
14. Instructions for Processing XML in DAV . . . . . . . . . . . 82 | 9.5. POST for Collections . . . . . . . . . . . . . . . . . . 54 | |||
15. DAV Compliance Classes . . . . . . . . . . . . . . . . . . . 83 | 9.6. DELETE Requirements . . . . . . . . . . . . . . . . . . 54 | |||
15.1. Class 1 . . . . . . . . . . . . . . . . . . . . . . . . 83 | 9.6.1. DELETE for Collections . . . . . . . . . . . . . . . 55 | |||
15.2. Class 2 . . . . . . . . . . . . . . . . . . . . . . . . 83 | 9.6.2. Example - DELETE . . . . . . . . . . . . . . . . . . 55 | |||
16. Internationalization Considerations . . . . . . . . . . . . . 83 | 9.7. PUT Requirements . . . . . . . . . . . . . . . . . . . . 56 | |||
17. Security Considerations . . . . . . . . . . . . . . . . . . . 85 | 9.7.1. PUT for Non-Collection Resources . . . . . . . . . . 56 | |||
17.1. Authentication of Clients . . . . . . . . . . . . . . . 85 | 9.7.2. PUT for Collections . . . . . . . . . . . . . . . . 57 | |||
17.2. Denial of Service . . . . . . . . . . . . . . . . . . . 86 | 9.8. COPY Method . . . . . . . . . . . . . . . . . . . . . . 57 | |||
17.3. Security through Obscurity . . . . . . . . . . . . . . . 86 | 9.8.1. COPY for Non-collection Resources . . . . . . . . . 57 | |||
17.4. Privacy Issues Connected to Locks . . . . . . . . . . . 86 | 9.8.2. COPY for Properties . . . . . . . . . . . . . . . . 58 | |||
17.5. Privacy Issues Connected to Properties . . . . . . . . . 86 | 9.8.3. COPY for Collections . . . . . . . . . . . . . . . . 58 | |||
17.6. Reduction of Security due to Source Link . . . . . . . . 87 | 9.8.4. COPY and Overwriting Destination Resources . . . . . 59 | |||
17.7. Implications of XML External Entities . . . . . . . . . 87 | 9.8.5. Status Codes . . . . . . . . . . . . . . . . . . . . 60 | |||
17.8. Risks Connected with Lock Tokens . . . . . . . . . . . . 88 | 9.8.6. Example - COPY with Overwrite . . . . . . . . . . . 61 | |||
18. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 88 | 9.8.7. Example - COPY with No Overwrite . . . . . . . . . . 61 | |||
19. Intellectual Property . . . . . . . . . . . . . . . . . . . . 89 | 9.8.8. Example - COPY of a Collection . . . . . . . . . . . 62 | |||
20. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 89 | 9.9. MOVE Method . . . . . . . . . . . . . . . . . . . . . . 62 | |||
21. References . . . . . . . . . . . . . . . . . . . . . . . . . 90 | 9.9.1. MOVE for Properties . . . . . . . . . . . . . . . . 63 | |||
21.1. Normative References . . . . . . . . . . . . . . . . . . 90 | 9.9.2. MOVE for Collections . . . . . . . . . . . . . . . . 63 | |||
21.2. Informational References . . . . . . . . . . . . . . . . 91 | 9.9.3. MOVE and the Overwrite Header . . . . . . . . . . . 64 | |||
Appendix A. Appendices . . . . . . . . . . . . . . . . . . . . . 92 | 9.9.4. Status Codes . . . . . . . . . . . . . . . . . . . . 64 | |||
A.1. Appendix 1 - WebDAV Document Type Definition . . . . . . 92 | 9.9.5. Example - MOVE of a Non-Collection . . . . . . . . . 65 | |||
A.2. Appendix 2 - ISO 8601 Date and Time Profile . . . . . . 94 | 9.9.6. Example - MOVE of a Collection . . . . . . . . . . . 66 | |||
A.3. Appendix 3 - Notes on Processing XML Elements . . . . . 94 | 9.10. LOCK Method . . . . . . . . . . . . . . . . . . . . . . 67 | |||
A.3.1. Notes on Empty XML Elements . . . . . . . . . . . . 94 | 9.10.1. Creating a Lock on an Existing Resource . . . . . . 67 | |||
A.3.2. Notes on Illegal XML Processing . . . . . . . . . . 95 | 9.10.2. Refreshing Locks . . . . . . . . . . . . . . . . . . 67 | |||
A.4. Appendix 4 -- XML Namespaces for WebDAV . . . . . . . . 97 | 9.10.3. Depth and Locking . . . . . . . . . . . . . . . . . 68 | |||
A.4.1. Introduction . . . . . . . . . . . . . . . . . . . . 97 | 9.10.4. Locking Unmapped URLs . . . . . . . . . . . . . . . 68 | |||
A.4.2. Meaning of Qualified Names . . . . . . . . . . . . . 97 | 9.10.5. Lock Compatibility Table . . . . . . . . . . . . . . 69 | |||
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 | 9.10.6. LOCK Responses . . . . . . . . . . . . . . . . . . . 69 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 102 | 9.10.7. Example - Simple Lock Request . . . . . . . . . . . 70 | |||
Intellectual Property and Copyright Statements . . . . . . . . . 104 | 9.10.8. Example - Refreshing a Write Lock . . . . . . . . . 72 | |||
9.10.9. Example - Multi-Resource Lock Request . . . . . . . 73 | ||||
9.11. UNLOCK Method . . . . . . . . . . . . . . . . . . . . . 74 | ||||
9.11.1. Status Codes . . . . . . . . . . . . . . . . . . . . 74 | ||||
9.11.2. Example - UNLOCK . . . . . . . . . . . . . . . . . . 75 | ||||
10. HTTP Headers for Distributed Authoring . . . . . . . . . . . 76 | ||||
10.1. DAV Header . . . . . . . . . . . . . . . . . . . . . . . 76 | ||||
10.2. Depth Header . . . . . . . . . . . . . . . . . . . . . . 77 | ||||
10.3. Destination Header . . . . . . . . . . . . . . . . . . . 78 | ||||
10.4. If Header . . . . . . . . . . . . . . . . . . . . . . . 78 | ||||
10.4.1. Purpose . . . . . . . . . . . . . . . . . . . . . . 78 | ||||
10.4.2. Syntax . . . . . . . . . . . . . . . . . . . . . . . 79 | ||||
10.4.3. List Evaluation . . . . . . . . . . . . . . . . . . 80 | ||||
10.4.4. Matching State Tokens and ETags . . . . . . . . . . 80 | ||||
10.4.5. If Header and Non-DAV Aware Proxies . . . . . . . . 81 | ||||
10.4.6. Example - No-tag Production . . . . . . . . . . . . 81 | ||||
10.4.7. Example - using "Not" with No-tag Production . . . . 81 | ||||
10.4.8. Example - causing a Condition to always evaluate | ||||
to True . . . . . . . . . . . . . . . . . . . . . . 82 | ||||
10.4.9. Example - Tagged List If header in COPY . . . . . . 82 | ||||
10.4.10. Example - Matching lock tokens with collection | ||||
locks . . . . . . . . . . . . . . . . . . . . . . . 82 | ||||
10.4.11. Example - Matching ETags on unmapped URLs . . . . . 83 | ||||
10.5. Lock-Token Header . . . . . . . . . . . . . . . . . . . 83 | ||||
10.6. Overwrite Header . . . . . . . . . . . . . . . . . . . . 83 | ||||
10.7. Timeout Request Header . . . . . . . . . . . . . . . . . 84 | ||||
11. Status Code Extensions to HTTP/1.1 . . . . . . . . . . . . . 85 | ||||
11.1. 207 Multi-Status . . . . . . . . . . . . . . . . . . . . 85 | ||||
11.2. 422 Unprocessable Entity . . . . . . . . . . . . . . . . 85 | ||||
11.3. 423 Locked . . . . . . . . . . . . . . . . . . . . . . . 85 | ||||
11.4. 424 Failed Dependency . . . . . . . . . . . . . . . . . 85 | ||||
11.5. 507 Insufficient Storage . . . . . . . . . . . . . . . . 85 | ||||
12. Use of HTTP Status Codes . . . . . . . . . . . . . . . . . . 86 | ||||
12.1. 412 Precondition Failed . . . . . . . . . . . . . . . . 86 | ||||
12.2. 414 Request-URI Too Long . . . . . . . . . . . . . . . . 86 | ||||
13. Multi-Status Response . . . . . . . . . . . . . . . . . . . . 87 | ||||
13.1. Response Headers . . . . . . . . . . . . . . . . . . . . 87 | ||||
13.2. Handling Redirected Child Resources . . . . . . . . . . 88 | ||||
13.3. Internal Status Codes . . . . . . . . . . . . . . . . . 88 | ||||
14. XML Element Definitions . . . . . . . . . . . . . . . . . . . 89 | ||||
14.1. activelock XML Element . . . . . . . . . . . . . . . . . 89 | ||||
14.2. allprop XML Element . . . . . . . . . . . . . . . . . . 89 | ||||
14.3. collection XML Element . . . . . . . . . . . . . . . . . 89 | ||||
14.4. depth XML Element . . . . . . . . . . . . . . . . . . . 89 | ||||
14.5. error XML Element . . . . . . . . . . . . . . . . . . . 90 | ||||
14.6. exclusive XML Element . . . . . . . . . . . . . . . . . 90 | ||||
14.7. href XML Element . . . . . . . . . . . . . . . . . . . . 90 | ||||
14.8. include XML Element . . . . . . . . . . . . . . . . . . 91 | ||||
14.9. location XML Element . . . . . . . . . . . . . . . . . . 91 | ||||
14.10. lockentry XML Element . . . . . . . . . . . . . . . . . 91 | ||||
14.11. lockinfo XML Element . . . . . . . . . . . . . . . . . . 91 | ||||
14.12. lockroot XML Element . . . . . . . . . . . . . . . . . . 92 | ||||
14.13. lockscope XML Element . . . . . . . . . . . . . . . . . 92 | ||||
14.14. locktoken XML Element . . . . . . . . . . . . . . . . . 92 | ||||
14.15. locktype XML Element . . . . . . . . . . . . . . . . . . 92 | ||||
14.16. multistatus XML Element . . . . . . . . . . . . . . . . 93 | ||||
14.17. owner XML Element . . . . . . . . . . . . . . . . . . . 93 | ||||
14.18. prop XML Element . . . . . . . . . . . . . . . . . . . . 93 | ||||
14.19. propertyupdate XML Element . . . . . . . . . . . . . . . 94 | ||||
14.20. propfind XML Element . . . . . . . . . . . . . . . . . . 94 | ||||
14.21. propname XML Element . . . . . . . . . . . . . . . . . . 94 | ||||
14.22. propstat XML Element . . . . . . . . . . . . . . . . . . 94 | ||||
14.23. remove XML Element . . . . . . . . . . . . . . . . . . . 95 | ||||
14.24. response XML Element . . . . . . . . . . . . . . . . . . 95 | ||||
14.25. responsedescription XML Element . . . . . . . . . . . . 96 | ||||
14.26. set XML Element . . . . . . . . . . . . . . . . . . . . 96 | ||||
14.27. shared XML Element . . . . . . . . . . . . . . . . . . . 96 | ||||
14.28. status XML Element . . . . . . . . . . . . . . . . . . . 96 | ||||
14.29. timeout XML Element . . . . . . . . . . . . . . . . . . 97 | ||||
14.30. write XML Element . . . . . . . . . . . . . . . . . . . 97 | ||||
15. DAV Properties . . . . . . . . . . . . . . . . . . . . . . . 98 | ||||
15.1. creationdate Property . . . . . . . . . . . . . . . . . 98 | ||||
15.2. displayname Property . . . . . . . . . . . . . . . . . . 99 | ||||
15.3. getcontentlanguage Property . . . . . . . . . . . . . . 99 | ||||
15.4. getcontentlength Property . . . . . . . . . . . . . . . 100 | ||||
15.5. getcontenttype Property . . . . . . . . . . . . . . . . 100 | ||||
15.6. getetag Property . . . . . . . . . . . . . . . . . . . . 101 | ||||
15.7. getlastmodified Property . . . . . . . . . . . . . . . . 101 | ||||
15.8. lockdiscovery Property . . . . . . . . . . . . . . . . . 102 | ||||
15.8.1. Example - Retrieving DAV:lockdiscovery . . . . . . . 103 | ||||
15.9. resourcetype Property . . . . . . . . . . . . . . . . . 104 | ||||
15.10. supportedlock Property . . . . . . . . . . . . . . . . . 105 | ||||
15.10.1. Example - Retrieving DAV:supportedlock . . . . . . . 106 | ||||
16. Precondition/Postcondition XML Elements . . . . . . . . . . . 107 | ||||
17. XML Extensibility in DAV . . . . . . . . . . . . . . . . . . 111 | ||||
18. DAV Compliance Classes . . . . . . . . . . . . . . . . . . . 113 | ||||
18.1. Class 1 . . . . . . . . . . . . . . . . . . . . . . . . 113 | ||||
18.2. Class 2 . . . . . . . . . . . . . . . . . . . . . . . . 113 | ||||
18.3. Class 3 . . . . . . . . . . . . . . . . . . . . . . . . 113 | ||||
19. Internationalization Considerations . . . . . . . . . . . . . 115 | ||||
20. Security Considerations . . . . . . . . . . . . . . . . . . . 117 | ||||
20.1. Authentication of Clients . . . . . . . . . . . . . . . 117 | ||||
20.2. Denial of Service . . . . . . . . . . . . . . . . . . . 117 | ||||
20.3. Security through Obscurity . . . . . . . . . . . . . . . 118 | ||||
20.4. Privacy Issues Connected to Locks . . . . . . . . . . . 118 | ||||
20.5. Privacy Issues Connected to Properties . . . . . . . . . 118 | ||||
20.6. Implications of XML Entities . . . . . . . . . . . . . . 119 | ||||
20.7. Risks Connected with Lock Tokens . . . . . . . . . . . . 119 | ||||
20.8. Hosting Malicious Content . . . . . . . . . . . . . . . 120 | ||||
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 121 | ||||
21.1. New URI Schemes . . . . . . . . . . . . . . . . . . . . 121 | ||||
21.2. XML Namespaces . . . . . . . . . . . . . . . . . . . . . 121 | ||||
21.3. Message Header Fields . . . . . . . . . . . . . . . . . 121 | ||||
21.3.1. DAV . . . . . . . . . . . . . . . . . . . . . . . . 121 | ||||
21.3.2. Depth . . . . . . . . . . . . . . . . . . . . . . . 121 | ||||
21.3.3. Destination . . . . . . . . . . . . . . . . . . . . 122 | ||||
21.3.4. If . . . . . . . . . . . . . . . . . . . . . . . . . 122 | ||||
21.3.5. Lock-Token . . . . . . . . . . . . . . . . . . . . . 122 | ||||
21.3.6. Overwrite . . . . . . . . . . . . . . . . . . . . . 122 | ||||
21.3.7. Timeout . . . . . . . . . . . . . . . . . . . . . . 123 | ||||
22. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 124 | ||||
23. Contributors to This Specification . . . . . . . . . . . . . 126 | ||||
24. Authors of RFC2518 . . . . . . . . . . . . . . . . . . . . . 127 | ||||
25. References . . . . . . . . . . . . . . . . . . . . . . . . . 128 | ||||
25.1. Normative References . . . . . . . . . . . . . . . . . . 128 | ||||
25.2. Informational References . . . . . . . . . . . . . . . . 129 | ||||
Appendix A. Notes on Processing XML Elements . . . . . . . . . . 130 | ||||
A.1. Notes on Empty XML Elements . . . . . . . . . . . . . . 130 | ||||
A.2. Notes on Illegal XML Processing . . . . . . . . . . . . 130 | ||||
A.3. Example - XML Syntax Error . . . . . . . . . . . . . . . 130 | ||||
A.4. Example - Unexpected XML Element . . . . . . . . . . . . 131 | ||||
Appendix B. Notes on HTTP Client Compatibility . . . . . . . . . 132 | ||||
Appendix C. The 'opaquelocktoken' Scheme and URIs . . . . . . . 133 | ||||
Appendix D. Lock-null Resources . . . . . . . . . . . . . . . . 134 | ||||
D.1. Guidance for Clients Using LOCK to Create Resources . . 134 | ||||
Appendix E. Guidance for Clients Desiring to Authenticate . . . 136 | ||||
Appendix F. Summary of changes from RFC2518 . . . . . . . . . . 138 | ||||
F.1. Changes for both Client and Server Implementations . . . 138 | ||||
F.2. Changes for Server Implementations . . . . . . . . . . . 139 | ||||
F.3. Other Changes . . . . . . . . . . . . . . . . . . . . . 140 | ||||
Appendix G. Change Log (to be removed by RFC Editor before | ||||
publication) . . . . . . . . . . . . . . . . . . . . 142 | ||||
G.1. Changes from -05 to -06 . . . . . . . . . . . . . . . . 142 | ||||
G.2. Changes in -07 . . . . . . . . . . . . . . . . . . . . . 142 | ||||
G.3. Changes in -08 . . . . . . . . . . . . . . . . . . . . . 143 | ||||
G.4. Changes in -09 . . . . . . . . . . . . . . . . . . . . . 144 | ||||
G.5. Changes in -10 . . . . . . . . . . . . . . . . . . . . . 145 | ||||
G.6. Changes in -11 . . . . . . . . . . . . . . . . . . . . . 145 | ||||
G.7. Changes in -12 . . . . . . . . . . . . . . . . . . . . . 145 | ||||
G.8. Changes in -13 . . . . . . . . . . . . . . . . . . . . . 146 | ||||
G.9. Changes in -14 . . . . . . . . . . . . . . . . . . . . . 146 | ||||
G.10. Changes in -15 . . . . . . . . . . . . . . . . . . . . . 146 | ||||
G.11. Changes in -16 . . . . . . . . . . . . . . . . . . . . . 146 | ||||
G.12. Changes in -17 . . . . . . . . . . . . . . . . . . . . . 147 | ||||
G.13. Changes in -18 . . . . . . . . . . . . . . . . . . . . . 147 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 148 | ||||
Intellectual Property and Copyright Statements . . . . . . . . . 149 | ||||
1. Introduction | 1. Introduction | |||
This document describes an extension to the HTTP/1.1 protocol that | This document describes an extension to the HTTP/1.1 protocol that | |||
allows clients to perform remote web content authoring operations. | allows clients to perform remote web content authoring operations. | |||
This extension provides a coherent set of methods, headers, request | This extension provides a coherent set of methods, headers, request | |||
entity body formats, and response entity body formats that provide | entity body formats, and response entity body formats that provide | |||
operations for: | operations for: | |||
Properties: The ability to create, remove, and query information | Properties: The ability to create, remove, and query information | |||
about Web pages, such as their authors, creation dates, etc. Also, | about Web pages, such as their authors, creation dates, etc. | |||
the ability to link pages of any media type to related pages. | ||||
Collections: The ability to create sets of documents and to retrieve | Collections: The ability to create sets of documents and to retrieve | |||
a hierarchical membership listing (like a directory listing in a file | a hierarchical membership listing (like a directory listing in a file | |||
system). | system). | |||
Locking: The ability to keep more than one person from working on a | Locking: The ability to keep more than one person from working on a | |||
document at the same time. This prevents the "lost update problem," | document at the same time. This prevents the "lost update problem", | |||
in which modifications are lost as first one author then another | in which modifications are lost as first one author then another | |||
writes changes without merging the other author's changes. | writes changes without merging the other author's changes. | |||
Namespace Operations: The ability to instruct the server to copy and | Namespace Operations: The ability to instruct the server to copy and | |||
move Web resources. | move Web resources, operations which change the mapping from URLs to | |||
resources. | ||||
Requirements and rationale for these operations are described in a | Requirements and rationale for these operations are described in a | |||
companion document, "Requirements for a Distributed Authoring and | companion document, "Requirements for a Distributed Authoring and | |||
Versioning Protocol for the World Wide Web" [RFC2291]. | Versioning Protocol for the World Wide Web" [RFC2291]. | |||
The sections below provide a detailed introduction to resource | This document does not specify the versioning operations suggested by | |||
properties (Section 4), collections of resources (Section 5), and | [RFC2291]. That work was done in a separate document, "Versioning | |||
locking operations (Section 6). These sections introduce the | Extensions to WebDAV" [RFC3253]. | |||
abstractions manipulated by the WebDAV-specific HTTP methods | ||||
described in Section 8, "HTTP Methods for Distributed Authoring". | ||||
In HTTP/1.1, method parameter information was exclusively encoded in | ||||
HTTP headers. Unlike HTTP/1.1, WebDAV encodes method parameter | ||||
information either in an Extensible Markup Language (XML) [REC-XML] | ||||
request entity body, or in an HTTP header. The use of XML to encode | ||||
method parameters was motivated by the ability to add extra XML | ||||
elements to existing structures, providing extensibility; and by | ||||
XML's ability to encode information in ISO 10646 character sets, | ||||
providing internationalization support. As a rule of thumb, | ||||
parameters are encoded in XML entity bodies when they have unbounded | ||||
length, or when they may be shown to a human user and hence require | ||||
encoding in an ISO 10646 character set. Otherwise, parameters are | ||||
encoded within HTTP headers. Section 9 describes the new HTTP | ||||
headers used with WebDAV methods. | ||||
In addition to encoding method parameters, XML is used in WebDAV to | ||||
encode the responses from methods, providing the extensibility and | ||||
internationalization advantages of XML for method output, as well as | ||||
input. | ||||
XML elements used in this specification are defined in Section 12. | The sections below provide a detailed introduction to various WebDAV | |||
abstractions: resource properties (Section 4), collections of | ||||
resources (Section 5), locks (Section 6) in general and write locks | ||||
(Section 7) specifically. | ||||
The XML namespace extension (Appendix A.4) is also used in this | These abstractions are manipulated by the WebDAV-specific HTTP | |||
specification in order to allow for new XML elements to be added | methods (Section 9) and the extra HTTP headers (Section 10) used with | |||
without fear of colliding with other element names. | WebDAV methods. General considerations for handling HTTP requests | |||
and responses in WebDAV are found in Section 8. | ||||
While the status codes provided by HTTP/1.1 are sufficient to | While the status codes provided by HTTP/1.1 are sufficient to | |||
describe most error conditions encountered by WebDAV methods, there | describe most error conditions encountered by WebDAV methods, there | |||
are some errors that do not fall neatly into the existing categories. | are some errors that do not fall neatly into the existing categories. | |||
New status codes developed for the WebDAV methods are defined in | This specification defines extra status codes developed for WebDAV | |||
Section 10. Since some WebDAV methods may operate over many | methods (Section 11) and describes existing HTTP status codes | |||
resources, the Multi-Status response has been introduced to return | (Section 12) as used in WebDAV. Since some WebDAV methods may | |||
status information for multiple resources. The Multi-Status response | operate over many resources, the Multi-Status response (Section 13) | |||
is described in Section 11. | has been introduced to return status information for multiple | |||
resources. Finally, this version of WebDAV introduces precondition | ||||
and postcondition (Section 16) XML elements in error response bodies. | ||||
WebDAV employs the property mechanism to store information about the | WebDAV uses XML ([REC-XML]) for property names and some values, and | |||
current state of the resource. For example, when a lock is taken out | also uses XML to marshal complicated requests and responses. This | |||
on a resource, a lock information property describes the current | specification contains DTD and text definitions of all all properties | |||
state of the lock. Section 13 defines the properties used within the | (Section 15) and all other XML elements (Section 14) used in | |||
WebDAV specification. | marshalling. WebDAV includes a few special rules on extending | |||
WebDAV XML marshalling in backwards-compatible ways (Section 17). | ||||
Finishing off the specification are sections on what it means to be | Finishing off the specification are sections on what it means for a | |||
compliant with this specification (Section 15), on | resource to be compliant with this specification (Section 18), on | |||
internationalization support (Section 16), and on security | internationalization support (Section 19), and on security | |||
(Section 17). | (Section 20). | |||
2. Notational Conventions | 2. Notational Conventions | |||
Since this document describes a set of extensions to the HTTP/1.1 | Since this document describes a set of extensions to the HTTP/1.1 | |||
protocol, the augmented BNF used herein to describe protocol elements | protocol, the augmented BNF used herein to describe protocol elements | |||
is exactly the same as described in section 2.1 of [RFC2068]. Since | is exactly the same as described in Section 2.1 of [RFC2616], | |||
this augmented BNF uses the basic production rules provided in | including the rules about implied linear white-space. Since this | |||
section 2.2 of [RFC2068], these rules apply to this document as well. | augmented BNF uses the basic production rules provided in Section 2.2 | |||
of [RFC2616], these rules apply to this document as well. | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
Note that in natural language, a property like the "creationdate" | ||||
property in the "DAV:" XML namespace is sometimes referred to as | ||||
"DAV:creationdate" for brevity. | ||||
3. Terminology | 3. Terminology | |||
"URI"/"URL" - A Uniform Resource Identifier and Uniform Resource | URI/URL - A Uniform Resource Identifier and Uniform Resource Locator, | |||
Locator, respectively. These terms (and the distinction between | respectively. These terms (and the distinction between them) are | |||
them) are defined in [RFC2396]. | defined in [RFC3986]. | |||
"Collection" - A resource that contains a set of URIs, termed member | URI/URL Mapping - A relation between an absolute URI and a resource. | |||
URIs, which identify member resources and meets the requirements in | Since a resource can represent items that are not network | |||
Section 5 of this specification. | retrievable, as well as those that are, it is possible for a resource | |||
to have zero, one, or many URI mappings. Mapping a resource to an | ||||
"http" scheme URI makes it possible to submit HTTP protocol requests | ||||
to the resource using the URI. | ||||
"Member URI" - A URI which is a member of the set of URIs contained | Path Segment - Informally, the characters found between slashes ("/") | |||
by a collection. | in a URI. Formally, as defined in Section 3.3 of [RFC3986]. | |||
"Internal Member URI" - A Member URI that is immediately relative to | Collection - Informally, a resource that also acts as a container of | |||
the URI of the collection (the definition of immediately relative is | references to child resources. Formally, a resource that contains a | |||
given in Section 5.2). | set of mappings between path segments and resources and meets the | |||
requirements defined in Section 5. | ||||
"Property" - A name/value pair that contains descriptive information | Internal Member (of a Collection) - Informally, a child resource of a | |||
collection. Formally, a resource referenced by a path segment | ||||
mapping contained in the collection. | ||||
Internal Member URL (of a Collection) - A URL of an internal member, | ||||
consisting of the URL of the collection (including trailing slash) | ||||
plus the path segment identifying the internal member. | ||||
Member (of a Collection) - Informally, a "descendant" of a | ||||
collection. Formally, an internal member of the collection, or, | ||||
recursively, a member of an internal member. | ||||
Member URL (of a Collection) - A URL that is either an internal | ||||
member URL of the collection itself, or is an internal member URL of | ||||
a member of that collection. | ||||
Property - A name/value pair that contains descriptive information | ||||
about a resource. | about a resource. | |||
"Live Property" - A property whose semantics and syntax are enforced | Live Property - A property whose semantics and syntax are enforced by | |||
by the server. For example, the live "getcontentlength" property has | the server. For example, the live property DAV:getcontentlength has | |||
its value, the length of the entity returned by a GET request, | its value, the length of the entity returned by a GET request, | |||
automatically calculated by the server. | automatically calculated by the server. | |||
"Dead Property" - A property whose semantics and syntax are not | Dead Property - A property whose semantics and syntax are not | |||
enforced by the server. The server only records the value of a dead | enforced by the server. The server only records the value of a dead | |||
property; the client is responsible for maintaining the consistency | property; the client is responsible for maintaining the consistency | |||
of the syntax and semantics of a dead property. | of the syntax and semantics of a dead property. | |||
"Null Resource" - A resource which responds with a 404 (Not Found) to | Principal - A "principal" is a distinct human or computational actor | |||
any HTTP/1.1 or DAV method except for PUT, MKCOL, OPTIONS and LOCK. | that initiates access to network resources. | |||
A NULL resource MUST NOT appear as a member of its parent collection. | ||||
State Token - A URI which represents a state of a resource. Lock | ||||
tokens are the only state tokens defined in this specification. | ||||
4. Data Model for Resource Properties | 4. Data Model for Resource Properties | |||
4.1. The Resource Property Model | 4.1. The Resource Property Model | |||
Properties are pieces of data that describe the state of a resource. | Properties are pieces of data that describe the state of a resource. | |||
Properties are data about data. | Properties are data about data. | |||
Properties are used in distributed authoring environments to provide | Properties are used in distributed authoring environments to provide | |||
for efficient discovery and management of resources. For example, a | for efficient discovery and management of resources. For example, a | |||
'subject' property might allow for the indexing of all resources by | 'subject' property might allow for the indexing of all resources by | |||
their subject, and an 'author' property might allow for the discovery | their subject, and an 'author' property might allow for the discovery | |||
of what authors have written which documents. | of what authors have written which documents. | |||
The DAV property model consists of name/value pairs. The name of a | The DAV property model consists of name/value pairs. The name of a | |||
property identifies the property's syntax and semantics, and provides | property identifies the property's syntax and semantics, and provides | |||
an address by which to refer to its syntax and semantics. | an address by which to refer to its syntax and semantics. | |||
There are two categories of properties: "live" and "dead". A live | There are two categories of properties: "live" and "dead". A live | |||
property has its syntax and semantics enforced by the server. Live | property has its syntax and semantics enforced by the server. Live | |||
properties include cases where a) the value of a property is read- | properties include cases where a) the value of a property is | |||
only, maintained by the server, and b) the value of the property is | protected, maintained by the server, and b) the value of the property | |||
maintained by the client, but the server performs syntax checking on | is maintained by the client, but the server performs syntax checking | |||
submitted values. All instances of a given live property MUST comply | on submitted values. All instances of a given live property MUST | |||
with the definition associated with that property name. A dead | comply with the definition associated with that property name. A | |||
property has its syntax and semantics enforced by the client; the | dead property has its syntax and semantics enforced by the client; | |||
server merely records the value of the property verbatim. | the server merely records the value of the property verbatim. | |||
4.2. Existing Metadata Proposals | ||||
Properties have long played an essential role in the maintenance of | ||||
large document repositories, and many current proposals contain some | ||||
notion of a property, or discuss web metadata more generally. These | ||||
include PICS [REC-PICS], PICS-NG, XML, Web Collections, and several | ||||
proposals on representing relationships within HTML. Work on PICS-NG | ||||
and Web Collections has been subsumed by the Resource Description | ||||
Framework (RDF) metadata activity of the World Wide Web Consortium. | ||||
RDF consists of a network-based data model and an XML representation | ||||
of that model. | ||||
Some proposals come from a digital library perspective. These | ||||
include the Dublin Core [RFC2413] metadata set and the Warwick | ||||
Framework [WF], a container architecture for different metadata | ||||
schemas. The literature includes many examples of metadata, | ||||
including MARC [USMARC], a bibliographic metadata format, and a | ||||
technical report bibliographic format employed by the Dienst system | ||||
[RFC1807]. Additionally, the proceedings from the first IEEE | ||||
Metadata conference describe many community-specific metadata sets. | ||||
Participants of the 1996 Metadata II Workshop in Warwick, UK [WF], | ||||
noted that "new metadata sets will develop as the networked | ||||
infrastructure matures" and "different communities will propose, | ||||
design, and be responsible for different types of metadata." These | ||||
observations can be corroborated by noting that many community- | ||||
specific sets of metadata already exist, and there is significant | ||||
motivation for the development of new forms of metadata as many | ||||
communities increasingly make their data available in digital form, | ||||
requiring a metadata format to assist data location and cataloging. | ||||
4.3. Properties and HTTP Headers | 4.2. Properties and HTTP Headers | |||
Properties already exist, in a limited sense, in HTTP message | Properties already exist, in a limited sense, in HTTP message | |||
headers. However, in distributed authoring environments a relatively | headers. However, in distributed authoring environments a relatively | |||
large number of properties are needed to describe the state of a | large number of properties are needed to describe the state of a | |||
resource, and setting/returning them all through HTTP headers is | resource, and setting/returning them all through HTTP headers is | |||
inefficient. Thus a mechanism is needed which allows a principal to | inefficient. Thus a mechanism is needed which allows a principal to | |||
identify a set of properties in which the principal is interested and | identify a set of properties in which the principal is interested and | |||
to set or retrieve just those properties. | to set or retrieve just those properties. | |||
4.4. Property Values | 4.3. Property Values | |||
The value of a property when expressed in XML MUST be well formed. | The value of a property is always a (well-formed) XML fragment. | |||
XML has been chosen because it is a flexible, self-describing, | XML has been chosen because it is a flexible, self-describing, | |||
structured data format that supports rich schema definitions, and | structured data format that supports rich schema definitions, and | |||
because of its support for multiple character sets. XML's self- | because of its support for multiple character sets. XML's self- | |||
describing nature allows any property's value to be extended by | describing nature allows any property's value to be extended by | |||
adding new elements. Older clients will not break when they | adding elements. Clients will not break when they encounter | |||
encounter extensions because they will still have the data specified | extensions because they will still have the data specified in the | |||
in the original schema and will ignore elements they do not | original schema and MUST ignore elements they do not understand. | |||
understand. XML's support for multiple character sets allows any | ||||
human-readable property to be encoded and read in a character set | ||||
familiar to the user. XML's support for multiple human languages, | ||||
using the "xml:lang" attribute, handles cases where the same | ||||
character set is employed by multiple human languages. | ||||
4.5. Property Names | XML's support for multiple character sets allows any human-readable | |||
property to be encoded and read in a character set familiar to the | ||||
user. XML's support for multiple human languages, using the "xml: | ||||
lang" attribute, handles cases where the same character set is | ||||
employed by multiple human languages. Note that xml:lang scope is | ||||
recursive, so an xml:lang attribute on any element containing a | ||||
property name element applies to the property value unless it has | ||||
been overridden by a more locally scoped attribute. Note that a | ||||
property only has one value, in one language (or language MAY be left | ||||
undefined), not multiple values in different languages or a single | ||||
value in multiple languages. | ||||
A property is always represented with an XML element consisting of | ||||
the property name, called the "property name element". The simplest | ||||
example is an empty property, which is different from a property that | ||||
does not exist: | ||||
<R:title xmlns:R="http://www.example.com/ns/"></R:title> | ||||
The value of the property appears inside the property name element. | ||||
The value may be any kind of well-formed XML content, including both | ||||
text-only and mixed content. Servers MUST preserve the following XML | ||||
Information Items (using the terminology from [REC-XML-INFOSET]) in | ||||
storage and transmission of dead properties: | ||||
For the property name Element Information Item itself: | ||||
[namespace name] | ||||
[local name] | ||||
[attributes] named "xml:lang" or any such attribute in scope | ||||
[children] of type element or character | ||||
On all Element Information Items in the property value: | ||||
[namespace name] | ||||
[local name] | ||||
[attributes] | ||||
[children] of type element or character | ||||
On Attribute Information Items in the property value: | ||||
[namespace name] | ||||
[local name] | ||||
[normalized value] | ||||
On Character Information Items in the property value: | ||||
[character code] | ||||
Since prefixes are used in some XML vocabularies (XPath and XML | ||||
Schema, for example), servers SHOULD preserve, for any Information | ||||
Item in the value: | ||||
[prefix] | ||||
XML Infoset attributes not listed above MAY be preserved by the | ||||
server, but clients MUST NOT rely on them being preserved. The above | ||||
rules would also apply by default to live properties, unless defined | ||||
otherwise. | ||||
Servers MUST ignore the XML attribute xml:space if present and never | ||||
use it to change white space handling. White space in property | ||||
values is significant. | ||||
4.3.1. Example - Property with Mixed Content | ||||
Consider a dead property 'author' created by the client as follows: | ||||
<D:prop xml:lang="en" xmlns:D="DAV:"> | ||||
<x:author xmlns:x='http://example.com/ns'> | ||||
<x:name>Jane Doe</x:name> | ||||
<!-- Jane's contact info --> | ||||
<x:uri type='email' | ||||
added='2005-11-26'>mailto:jane.doe@example.com</x:uri> | ||||
<x:uri type='web' | ||||
added='2005-11-27'>http://www.example.com</x:uri> | ||||
<x:notes xmlns:h='http://www.w3.org/1999/xhtml'> | ||||
Jane has been working way <h:em>too</h:em> long on the | ||||
long-awaited revision of <![CDATA[<RFC2518>]]>. | ||||
</x:notes> | ||||
</x:author> | ||||
</D:prop> | ||||
When this property is requested, a server might return: | ||||
<D:prop xmlns:D='DAV:'><author | ||||
xml:lang='en' | ||||
xmlns:x='http://example.com/ns' | ||||
xmlns='http://example.com/ns' | ||||
xmlns:h='http://www.w3.org/1999/xhtml'> | ||||
<x:name>Jane Doe</x:name> | ||||
<x:uri added="2005-11-26" type="email" | ||||
>mailto:jane.doe@example.com</x:uri> | ||||
<x:uri added="2005-11-27" type="web" | ||||
>http://www.example.com</x:uri> | ||||
<x:notes> | ||||
Jane has been working way <h:em>too</h:em> long on the | ||||
long-awaited revision of <RFC2518>. | ||||
</x:notes> | ||||
</author> | ||||
</D:prop> | ||||
Note in this example: | ||||
o The [prefix] for the property name itself was not preserved, being | ||||
non-significant, all other [prefix] values have been preserved, | ||||
o attribute values have been rewritten with double quotes instead of | ||||
single quotes (quoting style is not significant), and attribute | ||||
order has not been preserved, | ||||
o the xml:lang attribute has been returned on the property name | ||||
element itself (it was in scope when the property was set, but the | ||||
exact position in the response is not considered significant as | ||||
long as it is in scope), | ||||
o whitespace between tags has been preserved everywhere (whitespace | ||||
between attributes not so), | ||||
o CDATA encapsulation was replaced with character escaping (the | ||||
reverse would also be legal), | ||||
o the comment item was stripped (as would have been a processing | ||||
instruction item). | ||||
Implementation note: there are cases such as editing scenarios where | ||||
clients may require that XML content is preserved character-by- | ||||
character (such as attribute ordering or quoting style). In this | ||||
case, clients should consider using a text-only property value by | ||||
escaping all characters that have a special meaning in XML parsing. | ||||
4.4. Property Names | ||||
A property name is a universally unique identifier that is associated | A property name is a universally unique identifier that is associated | |||
with a schema that provides information about the syntax and | with a schema that provides information about the syntax and | |||
semantics of the property. | semantics of the property. | |||
Because a property's name is universally unique, clients can depend | Because a property's name is universally unique, clients can depend | |||
upon consistent behavior for a particular property across multiple | upon consistent behavior for a particular property across multiple | |||
resources, on the same and across different servers, so long as that | resources, on the same and across different servers, so long as that | |||
property is "live" on the resources in question, and the | property is "live" on the resources in question, and the | |||
implementation of the live property is faithful to its definition. | implementation of the live property is faithful to its definition. | |||
The XML namespace mechanism, which is based on URIs [RFC2396], is | The XML namespace mechanism, which is based on URIs ([RFC3986]), is | |||
used to name properties because it prevents namespace collisions and | used to name properties because it prevents namespace collisions and | |||
provides for varying degrees of administrative control. | provides for varying degrees of administrative control. | |||
The property namespace is flat; that is, no hierarchy of properties | The property namespace is flat; that is, no hierarchy of properties | |||
is explicitly recognized. Thus, if a property A and a property A/B | is explicitly recognized. Thus, if a property A and a property A/B | |||
exist on a resource, there is no recognition of any relationship | exist on a resource, there is no recognition of any relationship | |||
between the two properties. It is expected that a separate | between the two properties. It is expected that a separate | |||
specification will eventually be produced which will address issues | specification will eventually be produced which will address issues | |||
relating to hierarchical properties. | relating to hierarchical properties. | |||
Finally, it is not possible to define the same property twice on a | Finally, it is not possible to define the same property twice on a | |||
single resource, as this would cause a collision in the resource's | single resource, as this would cause a collision in the resource's | |||
property namespace. | property namespace. | |||
4.6. Media Independent Links | 4.5. Source Resources and Output Resources | |||
Although HTML resources support links to other resources, the Web | Some HTTP resources are dynamically generated by the server. For | |||
needs more general support for links between resources of any media | these resources, there presumably exists source code somewhere | |||
type (media types are also known as MIME types, or content types). | governing how that resource is generated. The relationship of source | |||
WebDAV provides such links. A WebDAV link is a special type of | files to output HTTP resources may be one to one, one to many, many | |||
property value, formally defined in Section 12.4, that allows typed | to one or many to many. There is no mechanism in HTTP to determine | |||
connections to be established between resources of any media type. | whether a resource is even dynamic, let alone where its source files | |||
The property value consists of source and destination Uniform | exist or how to author them. Although this problem would usefully be | |||
Resource Identifiers (URIs); the property name identifies the link | solved, interoperable WebDAV implementations have been widely | |||
type. | deployed without actually solving this problem, by dealing only with | |||
static resources. Thus, the source vs. output problem is not solved | ||||
in this specification and has been deferred to a separate document. | ||||
5. Collections of Web Resources | 5. Collections of Web Resources | |||
This section provides a description of a new type of Web resource, | This section provides a description of a type of Web resource, the | |||
the collection, and discusses its interactions with the HTTP URL | collection, and discusses its interactions with the HTTP URL | |||
namespace. The purpose of a collection resource is to model | namespace and with HTTP methods. The purpose of a collection | |||
collection-like objects (e.g., file system directories) within a | resource is to model collection-like objects (e.g., file system | |||
server's namespace. | directories) within a server's namespace. | |||
All DAV compliant resources MUST support the HTTP URL namespace model | All DAV compliant resources MUST support the HTTP URL namespace model | |||
specified herein. | specified herein. | |||
5.1. HTTP URL Namespace Model | 5.1. HTTP URL Namespace Model | |||
The HTTP URL namespace is a hierarchical namespace where the | The HTTP URL namespace is a hierarchical namespace where the | |||
hierarchy is delimited with the "/" character. | hierarchy is delimited with the "/" character. | |||
An HTTP URL namespace is said to be consistent if it meets the | An HTTP URL namespace is said to be consistent if it meets the | |||
following conditions: for every URL in the HTTP hierarchy there | following conditions: for every URL in the HTTP hierarchy there | |||
exists a collection that contains that URL as an internal member. | exists a collection that contains that URL as an internal member URL. | |||
The root, or top-level collection of the namespace under | The root, or top-level collection of the namespace under | |||
consideration is exempt from the previous rule. | consideration, is exempt from the previous rule. The top-level | |||
collection of the namespace under consideration is not necessarily | ||||
the collection identified by the absolute path '/', it may be | ||||
identified by one or more path segments (e.g. /servlets/webdav/...) | ||||
Neither HTTP/1.1 nor WebDAV require that the entire HTTP URL | Neither HTTP/1.1 nor WebDAV require that the entire HTTP URL | |||
namespace be consistent. However, certain WebDAV methods are | namespace be consistent -- a WebDAV-compatible resource may not have | |||
prohibited from producing results that cause namespace | a parent collection. However, certain WebDAV methods are prohibited | |||
inconsistencies. | from producing results that cause namespace inconsistencies. | |||
Although implicit in [RFC2068] and [RFC2396], any resource, including | As is implicit in [RFC2616] and [RFC3986], any resource, including | |||
collection resources, MAY be identified by more than one URI. For | collection resources, MAY be identified by more than one URI. For | |||
example, a resource could be identified by multiple HTTP URLs. | example, a resource could be identified by multiple HTTP URLs. | |||
5.2. Collection Resources | 5.2. Collection Resources | |||
A collection is a resource whose state consists of at least a list of | Collection resources differ from other resources in that they also | |||
internal member URIs and a set of properties, but which may have | act as containers. Some HTTP methods apply only to a collection, but | |||
additional state such as entity bodies returned by GET. An internal | some apply to some or all of the resources inside the container | |||
member URI MUST be immediately relative to a base URI of the | defined by the collection. When the scope of a method is not clear, | |||
collection. That is, the internal member URI is equal to a | the client can specify what depth to apply. Depth can be either zero | |||
containing collection's URI plus an additional segment for non- | levels in (only the collection), one level (the collection and | |||
collection resources, or additional segment plus trailing slash "/" | directly contained resources) or infinite levels (the collection and | |||
for collection resources, where segment is defined in section 3.3 of | all contained resources recursively). | |||
[RFC2396]. | ||||
Any given internal member URI MUST only belong to the collection | ||||
once, i.e., it is illegal to have multiple instances of the same URI | ||||
in a collection. Properties defined on collections behave exactly as | ||||
do properties on non-collection resources. | ||||
For all WebDAV compliant resources A and B, identified by URIs U and | ||||
V, for which U is immediately relative to V, B MUST be a collection | ||||
that has U as an internal member URI. So, if the resource with URL | ||||
http://foo.com/bar/blah is WebDAV compliant and if the resource with | ||||
URL http://foo.com/bar/ is WebDAV compliant then the resource with | ||||
URL http://foo.com/bar/ must be a collection and must contain URL | ||||
http://foo.com/bar/blah as an internal member. | ||||
Collection resources MAY list the URLs of non-WebDAV compliant | ||||
children in the HTTP URL namespace hierarchy as internal members but | ||||
are not required to do so. For example, if the resource with URL | ||||
http://foo.com/bar/blah is not WebDAV compliant and the URL | ||||
http://foo.com/bar/ identifies a collection then URL | ||||
http://foo.com/bar/blah may or may not be an internal member of the | ||||
collection with URL http://foo.com/bar/. | ||||
If a WebDAV compliant resource has no WebDAV compliant children in | ||||
the HTTP URL namespace hierarchy then the WebDAV compliant resource | ||||
is not required to be a collection. | ||||
There is a standing convention that when a collection is referred to | ||||
by its name without a trailing slash, the trailing slash is | ||||
automatically appended. Due to this, a resource may accept a URI | ||||
without a trailing "/" to point to a collection. In this case it | ||||
SHOULD return a content-location header in the response pointing to | ||||
the URI ending with the "/". For example, if a client invokes a | ||||
method on http://foo.bar/blah (no trailing slash), the resource | ||||
http://foo.bar/blah/ (trailing slash) may respond as if the operation | ||||
were invoked on it, and should return a content-location header with | ||||
http://foo.bar/blah/ in it. In general clients SHOULD use the "/" | ||||
form of collection names. | ||||
A resource MAY be a collection but not be WebDAV compliant. That is, | ||||
the resource may comply with all the rules set out in this | ||||
specification regarding how a collection is to behave without | ||||
necessarily supporting all methods that a WebDAV compliant resource | ||||
is required to support. In such a case the resource may return the | ||||
DAV:resourcetype property with the value DAV:collection but MUST NOT | ||||
return a DAV header containing the value "1" on an OPTIONS response. | ||||
5.3. Creation and Retrieval of Collection Resources | ||||
This document specifies the MKCOL method to create new collection | A collection's state consists of at least a set of mappings between | |||
resources, rather than using the existing HTTP/1.1 PUT or POST | path segments and resources, and a set of properties on the | |||
method, for the following reasons: | collection itself. In this document, a resource B will be said to be | |||
contained in the collection resource A if there is a path segment | ||||
mapping which maps to B and which is contained in A. A collection | ||||
MUST contain at most one mapping for a given path segment, i.e., it | ||||
is illegal to have the same path segment mapped to more than one | ||||
resource. | ||||
In HTTP/1.1, the PUT method is defined to store the request body at | Properties defined on collections behave exactly as do properties on | |||
the location specified by the Request-URI. While a description | non-collection resources. A collection MAY have additional state | |||
format for a collection can readily be constructed for use with PUT, | such as entity bodies returned by GET. | |||
the implications of sending such a description to the server are | ||||
undesirable. For example, if a description of a collection that | ||||
omitted some existing resources were PUT to a server, this might be | ||||
interpreted as a command to remove those members. This would extend | ||||
PUT to perform DELETE functionality, which is undesirable since it | ||||
changes the semantics of PUT, and makes it difficult to control | ||||
DELETE functionality with an access control scheme based on methods. | ||||
While the POST method is sufficiently open-ended that a "create a | For all WebDAV compliant resources A and B, identified by URLs "U" | |||
collection" POST command could be constructed, this is undesirable | and "V" respectively, such that "V" is equal to "U/SEGMENT", A MUST | |||
because it would be difficult to separate access control for | be a collection that contains a mapping from "SEGMENT" to B. So, if | |||
collection creation from other uses of POST. | resource B with URL "http://example.com/bar/blah" is WebDAV compliant | |||
and if resource A with URL "http://example.com/bar/" is WebDAV | ||||
compliant, then resource A must be a collection and must contain | ||||
exactly one mapping from "blah" to B. | ||||
The exact definition of the behavior of GET and PUT on collections is | Although commonly a mapping consists of a single segment and a | |||
defined later in this document. | resource, in general, a mapping consists of a set of segments and a | |||
resource. This allows a server to treat a set of segments as | ||||
equivalent (i.e. either all of the segments are mapped to the same | ||||
resource, or none of the segments are mapped to a resource). For | ||||
example, a server that performs case-folding on segments will treat | ||||
the segments "ab", "Ab", "aB", and "AB" as equivalent. A client can | ||||
then use any of these segments to identify the resource. Note that a | ||||
PROPFIND result will select one of these equivalent segments to | ||||
identify the mapping, so there will be one PROPFIND response element | ||||
per mapping, not one per segment in the mapping. | ||||
5.4. Source Resources and Output Resources | Collection resources MAY have mappings to non-WebDAV compliant | |||
resources in the HTTP URL namespace hierarchy but are not required to | ||||
do so. For example, if resource X with URL | ||||
"http://example.com/bar/blah" is not WebDAV compliant and resource A | ||||
with "URL http://example.com/bar/" identifies a WebDAV collection, | ||||
then A may or may not have a mapping from "blah" to X. | ||||
For many resources, the entity returned by a GET method exactly | If a WebDAV compliant resource has no WebDAV compliant internal | |||
matches the persistent state of the resource, for example, a GIF file | members in the HTTP URL namespace hierarchy then the WebDAV compliant | |||
stored on a disk. For this simple case, the URI at which a resource | resource is not required to be a collection. | |||
is accessed is identical to the URI at which the source (the | ||||
persistent state) of the resource is accessed. This is also the case | ||||
for HTML source files that are not processed by the server prior to | ||||
transmission. | ||||
However, the server can sometimes process HTML resources before they | There is a standing convention that when a collection is referred to | |||
are transmitted as a return entity body. For example, a server-side- | by its name without a trailing slash, the server MAY handle the | |||
include directive within an HTML file might instruct a server to | request as if the trailing slash were present. In this case it | |||
replace the directive with another value, such as the current date. | SHOULD return a Content-Location header in the response, pointing to | |||
In this case, what is returned by GET (HTML plus date) differs from | the URL ending with the "/". For example, if a client invokes a | |||
the persistent state of the resource (HTML plus directive). | method on http://example.com/blah (no trailing slash), the server may | |||
Typically there is no way to access the HTML resource containing the | respond as if the operation were invoked on http://example.com/blah/ | |||
unprocessed directive. | (trailing slash), and should return a Content-Location header with | |||
the value http://example.com/blah/. Wherever a server produces a URL | ||||
referring to a collection, the server SHOULD include the trailing | ||||
slash. In general clients SHOULD use the trailing slash form of | ||||
collection names. If clients do not use the trailing slash form the | ||||
client needs to be prepared to see a redirect response. Clients will | ||||
find the DAV:resourcetype property more reliable than the URL to find | ||||
out if a resource is a collection. | ||||
Sometimes the entity returned by GET is the output of a data- | Clients MUST be able to support the case where WebDAV resources are | |||
producing process that is described by one or more source resources | contained inside non-WebDAV resources. For example, if a OPTIONS | |||
(that may not even have a location in the URI namespace). A single | response from "http://example.com/servlet/dav/collection" indicates | |||
data-producing process may dynamically generate the state of a | WebDAV support, the client cannot assume that | |||
potentially large number of output resources. An example of this is | "http://example.com/servlet/dav/" or its parent necessarily are | |||
a CGI script that describes a "finger" gateway process that maps part | WebDAV collections. | |||
of the namespace of a server into finger requests, such as | ||||
http://www.foo.bar.org/finger_gateway/user@host. | ||||
In the absence of distributed authoring capabilities, it is | A typical scenario in which mapped URLs do not appear as members of | |||
acceptable to have no mapping of source resource(s) to the URI | their parent collection is the case where a server allows links or | |||
namespace. In fact, preventing access to the source resource(s) has | redirects to non-WebDAV resources. For instance, "/col/link" might | |||
desirable security benefits. However, if remote editing of the | not appear as a member of "/col/", although the server would respond | |||
source resource(s) is desired, the source resource(s) should be given | with a 302 status to a GET request to "/col/link", thus the URL | |||
a location in the URI namespace. This source location should not be | "/col/link" would indeed be mapped. Similarly, a dynamically- | |||
one of the locations at which the generated output is retrievable, | generated page might have a URL mapping from "/col/index.html", thus | |||
since in general it is impossible for the server to differentiate | this resource might respond with a 200 OK to a GET request yet not | |||
requests for source resources from requests for process output | appear as a member of "/col/". | |||
resources. There is often a many-to-many relationship between source | ||||
resources and output resources. | ||||
On WebDAV compliant servers the URI of the source resource(s) may be | Some mappings to even WebDAV-compliant resources might not appear in | |||
stored in a link on the output resource with type DAV:source (see | the parent collection. An example for this case are servers that | |||
Section 13.10 for a description of the source link property). | support multiple alias URLs for each WebDAV compliant resource. A | |||
Storing the source URIs in links on the output resources places the | server may implement case-insensitive URLs, thus "/col/a" and | |||
burden of discovering the source on the authoring client. Note that | "/col/A" identify the same resource, yet only either "a" or "A" are | |||
the value of a source link is not guaranteed to point to the correct | reported upon listing the members of "/col". In cases where a server | |||
source. Source links may break or incorrect values may be entered. | treats a set of segments as equivalent, the server MUST expose only | |||
Also note that not all servers will allow the client to set the | one preferred segment per mapping, consistently chosen, in PROPFIND | |||
source link value. For example a server which generates source links | responses. | |||
on the fly for its CGI files will most likely not allow a client to | ||||
set the source link value. | ||||
6. Locking | 6. Locking | |||
The ability to lock a resource provides a mechanism for serializing | The ability to lock a resource provides a mechanism for serializing | |||
access to that resource. Using a lock, an authoring client can | access to that resource. Using a lock, an authoring client can | |||
provide a reasonable guarantee that another principal will not modify | provide a reasonable guarantee that another principal will not modify | |||
a resource while it is being edited. In this way, a client can | a resource while it is being edited. In this way, a client can | |||
prevent the "lost update" problem. | prevent the "lost update" problem. | |||
This specification allows locks to vary over two client-specified | This specification allows locks to vary over two client-specified | |||
parameters, the number of principals involved (exclusive vs. shared) | parameters, the number of principals involved (exclusive vs. shared) | |||
and the type of access to be granted. This document defines locking | and the type of access to be granted. This document defines locking | |||
for only one access type, write. However, the syntax is extensible, | for only one access type, write. However, the syntax is extensible, | |||
and permits the eventual specification of locking for other access | and permits the eventual specification of locking for other access | |||
types. | types. | |||
6.1. Exclusive Vs. Shared Locks | 6.1. Lock Model | |||
The most basic form of lock is an exclusive lock. This is a lock | This section provides a concise model for how locking behaves. Later | |||
where the access right in question is only granted to a single | sections will provide more detail on some of the concepts and refer | |||
principal. The need for this arbitration results from a desire to | back to these model statements. Normative statements related to LOCK | |||
avoid having to merge results. | and UNLOCK method handling can be found in the sections on those | |||
methods, whereas normative statements that cover any method are | ||||
gathered here. | ||||
1. A lock either directly or indirectly locks a resource. | ||||
2. A resource becomes directly locked when a LOCK request to a URL | ||||
of that resource creates a new lock. The "lock-root" of the new | ||||
lock is that URL. If at the time of the request, the URL is not | ||||
mapped to a resource, a new empty resource is created and | ||||
directly locked. | ||||
3. An exclusive lock (Section 6.2) conflicts with any other kind of | ||||
lock on the same resource, whether either lock is direct or | ||||
indirect. A server MUST NOT create conflicting locks on a | ||||
resource. | ||||
4. For a collection that is locked with a depth-infinity lock L, all | ||||
member resources are indirectly locked. Changes in membership of | ||||
a such a collection affect the set of indirectly locked | ||||
resources: | ||||
* If a member resource is added to the collection, the new | ||||
member resource MUST NOT already have a conflicting lock, | ||||
because the new resource MUST become indirectly locked by L. | ||||
* If a member resource stops being a member of the collection, | ||||
then the resource MUST no longer be indirectly locked by L. | ||||
5. Each lock is identified by a single globally unique lock token | ||||
(Section 6.5). | ||||
6. An UNLOCK request deletes the lock with the specified lock token. | ||||
After a lock is deleted, no resource is locked by that lock. | ||||
7. A lock token is "submitted" in a request when it appears in an | ||||
"If" header (the Write Lock (Section 7) section discusses when | ||||
token submission is required for write locks). | ||||
8. If a request causes the lock-root of any lock to become an | ||||
unmapped URL, then the lock MUST also be deleted by that request. | ||||
6.2. Exclusive Vs. Shared Locks | ||||
The most basic form of lock is an exclusive lock. Exclusive locks | ||||
avoid having to deal with content change conflicts, without requiring | ||||
any coordination other than the methods described in this | ||||
specification. | ||||
However, there are times when the goal of a lock is not to exclude | However, there are times when the goal of a lock is not to exclude | |||
others from exercising an access right but rather to provide a | others from exercising an access right but rather to provide a | |||
mechanism for principals to indicate that they intend to exercise | mechanism for principals to indicate that they intend to exercise | |||
their access rights. Shared locks are provided for this case. A | their access rights. Shared locks are provided for this case. A | |||
shared lock allows multiple principals to receive a lock. Hence any | shared lock allows multiple principals to receive a lock. Hence any | |||
principal with appropriate access can get the lock. | principal that has both access privileges and a valid lock can use | |||
the locked resource. | ||||
With shared locks there are two trust sets that affect a resource. | With shared locks there are two trust sets that affect a resource. | |||
The first trust set is created by access permissions. Principals who | The first trust set is created by access permissions. Principals who | |||
are trusted, for example, may have permission to write to the | are trusted, for example, may have permission to write to the | |||
resource. Among those who have access permission to write to the | resource. Among those who have access permission to write to the | |||
resource, the set of principals who have taken out a shared lock also | resource, the set of principals who have taken out a shared lock also | |||
must trust each other, creating a (typically) smaller trust set | must trust each other, creating a (typically) smaller trust set | |||
within the access permission write set. | within the access permission write set. | |||
Starting with every possible principal on the Internet, in most | Starting with every possible principal on the Internet, in most | |||
skipping to change at page 15, line 42 ¶ | skipping to change at page 23, line 7 ¶ | |||
decide they trust their collaborators will not overwrite their work | decide they trust their collaborators will not overwrite their work | |||
(the potential set of collaborators being the set of principals who | (the potential set of collaborators being the set of principals who | |||
have write permission) and use a shared lock, which informs their | have write permission) and use a shared lock, which informs their | |||
collaborators that a principal may be working on the resource. | collaborators that a principal may be working on the resource. | |||
The WebDAV extensions to HTTP do not need to provide all of the | The WebDAV extensions to HTTP do not need to provide all of the | |||
communications paths necessary for principals to coordinate their | communications paths necessary for principals to coordinate their | |||
activities. When using shared locks, principals may use any out of | activities. When using shared locks, principals may use any out of | |||
band communication channel to coordinate their work (e.g., face-to- | band communication channel to coordinate their work (e.g., face-to- | |||
face interaction, written notes, post-it notes on the screen, | face interaction, written notes, post-it notes on the screen, | |||
telephone conversation, Email, etc.) The intent of a shared lock is | telephone conversation, email, etc.) The intent of a shared lock is | |||
to let collaborators know who else may be working on a resource. | to let collaborators know who else may be working on a resource. | |||
Shared locks are included because experience from web distributed | Shared locks are included because experience from web distributed | |||
authoring systems has indicated that exclusive locks are often too | authoring systems has indicated that exclusive locks are often too | |||
rigid. An exclusive lock is used to enforce a particular editing | rigid. An exclusive lock is used to enforce a particular editing | |||
process: take out an exclusive lock, read the resource, perform | process: take out an exclusive lock, read the resource, perform | |||
edits, write the resource, release the lock. This editing process | edits, write the resource, release the lock. This editing process | |||
has the problem that locks are not always properly released, for | has the problem that locks are not always properly released, for | |||
example when a program crashes, or when a lock owner leaves without | example when a program crashes, or when a lock creator leaves without | |||
unlocking a resource. While both timeouts and administrative action | unlocking a resource. While both timeouts (Section 6.6) and | |||
can be used to remove an offending lock, neither mechanism may be | administrative action can be used to remove an offending lock, | |||
available when needed; the timeout may be long or the administrator | neither mechanism may be available when needed; the timeout may be | |||
may not be available. | long or the administrator may not be available. | |||
6.2. Required Support | A successful request for a new shared lock MUST result in the | |||
generation of a unique lock associated with the requesting principal. | ||||
Thus if five principals have taken out shared write locks on the same | ||||
resource there will be five locks and five lock tokens, one for each | ||||
principal. | ||||
A WebDAV compliant server is not required to support locking in any | 6.3. Required Support | |||
form. If the server does support locking it may choose to support | ||||
A WebDAV compliant resource is not required to support locking in any | ||||
form. If the resource does support locking it may choose to support | ||||
any combination of exclusive and shared locks for any access types. | any combination of exclusive and shared locks for any access types. | |||
The reason for this flexibility is that locking policy strikes to the | The reason for this flexibility is that locking policy strikes to the | |||
very heart of the resource management and versioning systems employed | very heart of the resource management and versioning systems employed | |||
by various storage repositories. These repositories require control | by various storage repositories. These repositories require control | |||
over what sort of locking will be made available. For example, some | over what sort of locking will be made available. For example, some | |||
repositories only support shared write locks while others only | repositories only support shared write locks while others only | |||
provide support for exclusive write locks while yet others use no | provide support for exclusive write locks while yet others use no | |||
locking at all. As each system is sufficiently different to merit | locking at all. As each system is sufficiently different to merit | |||
exclusion of certain locking features, this specification leaves | exclusion of certain locking features, this specification leaves | |||
locking as the sole axis of negotiation within WebDAV. | locking as the sole axis of negotiation within WebDAV. | |||
6.3. Lock Tokens | 6.4. Lock Creator and Privileges | |||
A lock token is a type of state token, represented as a URI, which | ||||
identifies a particular lock. A lock token is returned by every | ||||
successful LOCK operation in the lockdiscovery property in the | ||||
response body, and can also be found through lock discovery on a | ||||
resource. | ||||
Lock token URIs MUST be unique across all resources for all time. | ||||
This uniqueness constraint allows lock tokens to be submitted across | ||||
resources and servers without fear of confusion. | ||||
This specification provides a lock token URI scheme called | ||||
opaquelocktoken that meets the uniqueness requirements. However | ||||
resources are free to return any URI scheme so long as it meets the | ||||
uniqueness requirements. | ||||
Having a lock token provides no special access rights. Anyone can | ||||
find out anyone else's lock token by performing lock discovery. | ||||
Locks MUST be enforced based upon whatever authentication mechanism | ||||
is used by the server, not based on the secrecy of the token values. | ||||
6.4. opaquelocktoken Lock Token URI Scheme | ||||
The opaquelocktoken URI scheme is designed to be unique across all | ||||
resources for all time. Due to this uniqueness quality, a client may | ||||
submit an opaque lock token in an If header on a resource other than | ||||
the one that returned it. | ||||
All resources MUST recognize the opaquelocktoken scheme and, at | ||||
minimum, recognize that the lock token does not refer to an | ||||
outstanding lock on the resource. | ||||
In order to guarantee uniqueness across all resources for all time | The creator of a lock has special privileges to use the lock to | |||
the opaquelocktoken requires the use of the Universal Unique | modify the resource. When a locked resource is modified, a server | |||
Identifier (UUID) mechanism, as described in [ISO-11578]. | MUST check that the authenticated principal matches the lock creator | |||
(in addition to checking for valid lock token submission). | ||||
Opaquelocktoken generators, however, have a choice of how they create | The server MAY allow privileged users other than the lock creator to | |||
these tokens. They can either generate a new UUID for every lock | destroy a lock (for example, the resource owner or an administrator). | |||
token they create or they can create a single UUID and then add | The 'unlock' privilege in [RFC3744] was defined to provide that | |||
extension characters. If the second method is selected then the | permission. | |||
program generating the extensions MUST guarantee that the same | ||||
extension will never be used twice with the associated UUID. | ||||
OpaqueLockToken-URI = "opaquelocktoken:" UUID [Extension] ; The UUID | There is no requirement for servers to accept LOCK requests from all | |||
production is the string representation of a UUID, as defined in | users or from anonymous users. | |||
[ISO-11578]. Note that white space (LWS) is not allowed between | ||||
elements of this production. | ||||
Extension = path ; path is defined in section 3.2.1 of RFC 2068 | Note that having a lock does not confer full privilege to modify the | |||
[RFC2068] | locked resource. Write access and other privileges MUST be enforced | |||
through normal privilege or authentication mechanisms, not based on | ||||
the possible obscurity of lock token values. | ||||
6.4.1. Node Field Generation Without the IEEE 802 Address | 6.5. Lock Tokens | |||
UUIDs, as defined in [ISO-11578], contain a "node" field that | A lock token is a type of state token which identifies a particular | |||
contains one of the IEEE 802 addresses for the server machine. As | lock. Each lock has exactly one unique lock token generated by the | |||
noted in Section 17.8, there are several security risks associated | server. Clients MUST NOT attempt to interpret lock tokens in any | |||
with exposing a machine's IEEE 802 address. This section provides an | way. | |||
alternate mechanism for generating the "node" field of a UUID which | ||||
does not employ an IEEE 802 address. WebDAV servers MAY use this | ||||
algorithm for creating the node field when generating UUIDs. The | ||||
text in this section is originally from an Internet-Draft by Paul | ||||
Leach and Rich Salz, who are noted here to properly attribute their | ||||
work. | ||||
The ideal solution is to obtain a 47 bit cryptographic quality random | Lock token URIs MUST be unique across all resources for all time. | |||
number, and use it as the low 47 bits of the node ID, with the most | This uniqueness constraint allows lock tokens to be submitted across | |||
significant bit of the first octet of the node ID set to 1. This bit | resources and servers without fear of confusion. Since lock tokens | |||
is the unicast/multicast bit, which will never be set in IEEE 802 | are unique, a client MAY submit a lock token in an If header on a | |||
addresses obtained from network cards; hence, there can never be a | resource other than the one that returned it. | |||
conflict between UUIDs generated by machines with and without network | ||||
cards. | ||||
If a system does not have a primitive to generate cryptographic | When a LOCK operation creates a new lock, the new lock token is | |||
quality random numbers, then in most systems there are usually a | returned in the Lock-Token response header defined in Section 10.5, | |||
fairly large number of sources of randomness available from which one | and also in the body of the response. | |||
can be generated. Such sources are system specific, but often | ||||
include: | ||||
o the percent of memory in use | Servers MAY make lock tokens publicly readable (e.g. in the DAV: | |||
lockdiscovery property). One use case for making lock tokens | ||||
readable is so that a long-lived lock can be removed by the resource | ||||
owner (the client that obtained the lock might have crashed or | ||||
disconnected before cleaning up the lock). Except for the case of | ||||
using UNLOCK under user guidance, a client SHOULD NOT use a lock | ||||
token created by another client instance. | ||||
o the size of main memory in bytes | This specification encourages servers to create UUIDs for lock | |||
tokens, and to use the URI form defined by "A Universally Unique | ||||
Identifier (UUID) URN Namespace" ([RFC4122]). However servers are | ||||
free to use any URI (e.g. from another scheme) so long as it meets | ||||
the uniqueness requirements. For example, a valid lock token might | ||||
be constructed using the "opaquelocktoken" scheme defined in | ||||
Appendix C. | ||||
o the amount of free main memory in bytes | Example: "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" | |||
o the size of the paging or swap file in bytes | 6.6. Lock Timeout | |||
o free bytes of paging or swap file | A lock MAY have a limited lifetime. The lifetime is suggested by the | |||
client when creating or refreshing the lock, but the server | ||||
ultimately chooses the timeout value. Timeout is measured in seconds | ||||
remaining until lock expiration. | ||||
o the total size of user virtual address space in bytes | The timeout counter MUST be restarted if a refresh lock request is | |||
successful (see Section 9.10.2). The timeout counter SHOULD NOT be | ||||
restarted at any other time. | ||||
o the total available user address space bytes | If the timeout expires then the lock SHOULD be removed. In this case | |||
the server SHOULD act as if an UNLOCK method was executed by the | ||||
server on the resource using the lock token of the timed-out lock, | ||||
performed with its override authority. | ||||
o the size of boot disk drive in bytes | Servers are advised to pay close attention to the values submitted by | |||
clients, as they will be indicative of the type of activity the | ||||
client intends to perform. For example, an applet running in a | ||||
browser may need to lock a resource, but because of the instability | ||||
of the environment within which the applet is running, the applet may | ||||
be turned off without warning. As a result, the applet is likely to | ||||
ask for a relatively small timeout value so that if the applet dies, | ||||
the lock can be quickly harvested. However, a document management | ||||
system is likely to ask for an extremely long timeout because its | ||||
user may be planning on going off-line. | ||||
o the free disk space on boot drive in bytes | A client MUST NOT assume that just because the time-out has expired | |||
the lock has immediately been removed. | ||||
o the current time | Likewise, a client MUST NOT assume that just because the time-out has | |||
not expired, the lock still exists. Clients MUST assume that locks | ||||
can arbitrarily disappear at any time, regardless of the value given | ||||
in the Timeout header. The Timeout header only indicates the | ||||
behavior of the server if extraordinary circumstances do not occur. | ||||
For example, a sufficiently privileged user may remove a lock at any | ||||
time or the system may crash in such a way that it loses the record | ||||
of the lock's existence. | ||||
o the amount of time since the system booted | 6.7. Lock Capability Discovery | |||
o the individual sizes of files in various system directories | Since server lock support is optional, a client trying to lock a | |||
resource on a server can either try the lock and hope for the best, | ||||
or perform some form of discovery to determine what lock capabilities | ||||
the server supports. This is known as lock capability discovery. A | ||||
client can determine what lock types the server supports by | ||||
retrieving the DAV:supportedlock property. | ||||
o the creation, last read, and modification times of files in | Any DAV compliant resource that supports the LOCK method MUST support | |||
various system directories | the DAV:supportedlock property. | |||
o the utilization factors of various system resources (heap, etc.) | 6.8. Active Lock Discovery | |||
o current mouse cursor position | If another principal locks a resource that a principal wishes to | |||
access, it is useful for the second principal to be able to find out | ||||
who the first principal is. For this purpose the DAV:lockdiscovery | ||||
property is provided. This property lists all outstanding locks, | ||||
describes their type, and MAY even provide the lock tokens. | ||||
o current caret position | Any DAV compliant resource that supports the LOCK method MUST support | |||
the DAV:lockdiscovery property. | ||||
o current number of running processes, threads | 7. Write Lock | |||
o handles or IDs of the desktop window and the active window | This section describes the semantics specific to the write lock type. | |||
The write lock is a specific instance of a lock type, and is the only | ||||
lock type described in this specification. | ||||
o the value of stack pointer of the caller | An exclusive write lock protects a resource: it prevents changes by | |||
any principal other than the lock creator and in any case where the | ||||
lock token is not submitted (e.g. by a client process other than the | ||||
one holding the lock). | ||||
o the process and thread ID of caller | Clients MUST submit a lock-token they are authorized to use in any | |||
request which modifies a write-locked resource. The list of | ||||
modifications covered by a write-lock include: | ||||
o various processor architecture specific performance counters | 1. A change to any of the following aspects of any write-locked | |||
(instructions executed, cache misses, TLB misses) | resource: | |||
(Note that it is precisely the above kinds of sources of randomness | * any variant, | |||
that are used to seed cryptographic quality random number generators | ||||
on systems without special hardware for their construction.) | ||||
In addition, items such as the computer's name and the name of the | * any dead property, | |||
operating system, while not strictly speaking random, will help | ||||
differentiate the results from those obtained by other systems. | ||||
The exact algorithm to generate a node ID using these data is system | * any live property which is lockable (a live property is | |||
specific, because both the data available and the functions to obtain | lockable unless otherwise defined.) | |||
them are often very system specific. However, assuming that one can | ||||
concatenate all the values from the randomness sources into a buffer, | ||||
and that a cryptographic hash function such as MD5 is available, then | ||||
any 6 bytes of the MD5 hash of the buffer, with the multicast bit | ||||
(the high bit of the first byte) set will be an appropriately random | ||||
node ID. | ||||
Other hash functions, such as SHA-1, can also be used. The only | 2. For collections, any modification of an internal member URI. An | |||
requirement is that the result be suitably random _ in the sense that | internal member URI of a collection is considered to be modified | |||
the outputs from a set uniformly distributed inputs are themselves | if it is added, removed, or identifies a different resource. | |||
uniformly distributed, and that a single bit change in the input can | More discussion on write locks and collections is found in | |||
be expected to cause half of the output bits to change. | Section 7.4. | |||
6.5. Lock Capability Discovery | 3. A modification of the mapping of the root of the write lock, | |||
either to another resource or to no resource (e.g. DELETE). | ||||
Since server lock support is optional, a client trying to lock a | Of the methods defined in HTTP and WebDAV, PUT, POST, PROPPATCH, | |||
resource on a server can either try the lock and hope for the best, | LOCK, UNLOCK, MOVE, COPY (for the destination resource), DELETE, and | |||
or perform some form of discovery to determine what lock capabilities | MKCOL are affected by write locks. All other HTTP/WebDAV methods | |||
the server supports. This is known as lock capability discovery. | defined so far, GET in particular, function independently of a write | |||
Lock capability discovery differs from discovery of supported access | lock. | |||
control types, since there may be access control types without | ||||
corresponding lock types. A client can determine what lock types the | ||||
server supports by retrieving the supportedlock property. | ||||
Any DAV compliant resource that supports the LOCK method MUST support | The next few sections describe in more specific terms how write locks | |||
the supportedlock property. | interact with various operations. | |||
6.6. Active Lock Discovery | 7.1. Write Locks and Properties | |||
If another principal locks a resource that a principal wishes to | While those without a write lock may not alter a property on a | |||
access, it is useful for the second principal to be able to find out | resource it is still possible for the values of live properties to | |||
who the first principal is. For this purpose the lockdiscovery | change, even while locked, due to the requirements of their schemas. | |||
property is provided. This property lists all outstanding locks, | ||||
describes their type, and where available, provides their lock token. | ||||
Any DAV compliant resource that supports the LOCK method MUST support | Only dead properties and live properties defined as lockable are | |||
the lockdiscovery property. | guaranteed not to change while write locked. | |||
6.7. Usage Considerations | 7.2. Avoiding Lost Updates | |||
Although the locking mechanisms specified here provide some help in | Although the write locks provide some help in preventing lost | |||
preventing lost updates, they cannot guarantee that updates will | updates, they cannot guarantee that updates will never be lost. | |||
never be lost. Consider the following scenario: | Consider the following scenario: | |||
Two clients A and B are interested in editing the resource ' | Two clients A and B are interested in editing the resource | |||
index.html'. Client A is an HTTP client rather than a WebDAV client, | 'index.html'. Client A is an HTTP client rather than a WebDAV | |||
and so does not know how to perform locking. | client, and so does not know how to perform locking. | |||
Client A doesn't lock the document, but does a GET and begins | Client A doesn't lock the document, but does a GET and begins | |||
editing. | editing. | |||
Client B does LOCK, performs a GET and begins editing. | Client B does LOCK, performs a GET and begins editing. | |||
Client B finishes editing, performs a PUT, then an UNLOCK. | Client B finishes editing, performs a PUT, then an UNLOCK. | |||
Client A performs a PUT, overwriting and losing all of B's changes. | Client A performs a PUT, overwriting and losing all of B's changes. | |||
skipping to change at page 21, line 5 ¶ | skipping to change at page 29, line 5 ¶ | |||
they interact with a WebDAV server that supports locking. | they interact with a WebDAV server that supports locking. | |||
HTTP 1.1 clients can be good citizens, avoiding overwriting other | HTTP 1.1 clients can be good citizens, avoiding overwriting other | |||
clients' changes, by using entity tags in If-Match headers with any | clients' changes, by using entity tags in If-Match headers with any | |||
requests that would modify resources. | requests that would modify resources. | |||
Information managers may attempt to prevent overwrites by | Information managers may attempt to prevent overwrites by | |||
implementing client-side procedures requiring locking before | implementing client-side procedures requiring locking before | |||
modifying WebDAV resources. | modifying WebDAV resources. | |||
7. Write Lock | 7.3. Write Locks and Unmapped URLs | |||
This section describes the semantics specific to the write lock type. | WebDAV provides the ability to send a LOCK request to an unmapped URL | |||
The write lock is a specific instance of a lock type, and is the only | in order to reserve the name for use. This is a simple way to avoid | |||
lock type described in this specification. | the lost-update problem on the creation of a new resource (another | |||
way is to use If-None-Match header specified in Section 14.26 of | ||||
[RFC2616]). It has the side benefit of locking the new resource | ||||
immediately for use of the creator. | ||||
7.1. Methods Restricted by Write Locks | Note that the lost-update problem is not an issue for collections | |||
because MKCOL can only be used to create a collection, not to | ||||
overwrite an existing collection. When trying to lock a collection | ||||
upon creation, clients can attempt to increase the likelihood of | ||||
getting the lock by pipelining the MKCOL and LOCK requests together | ||||
(but because this doesn't convert two separate operations into one | ||||
atomic operation there's no guarantee this will work). | ||||
A write lock MUST prevent a principal without the lock from | A successful lock request to an unmapped URL MUST result in the | |||
successfully executing a PUT, POST, PROPPATCH, LOCK, UNLOCK, MOVE, | creation of a locked (non-collection) resource with empty content. | |||
DELETE, or MKCOL on the locked resource. All other current methods, | Subsequently, a successful PUT request (with the correct lock token) | |||
GET in particular, function independently of the lock. | provides the content for the resource. Note that the LOCK request | |||
has no mechanism for the client to provide Content-Type or Content- | ||||
Language, thus the server will use defaults or empty values and rely | ||||
on the subsequent PUT request for correct values. | ||||
Note, however, that as new methods are created it will be necessary | A resource created with a LOCK is empty but otherwise behaves in | |||
to specify how they interact with a write lock. | every way as a normal resource. It behaves the same way as a | |||
resource created by a PUT request with an empty body (and where a | ||||
Content-Type and Content-Language was not specified), followed by a | ||||
LOCK request to the same resource. Following from this model, a | ||||
locked empty resource: | ||||
7.2. Write Locks and Lock Tokens | o Can be read, deleted, moved, copied, and in all ways behave as a | |||
regular non-collection resource. | ||||
A successful request for an exclusive or shared write lock MUST | o Appears as a member of its parent collection. | |||
result in the generation of a unique lock token associated with the | ||||
requesting principal. Thus if five principals have a shared write | ||||
lock on the same resource there will be five lock tokens, one for | ||||
each principal. | ||||
7.3. Write Locks and Properties | o SHOULD NOT disappear when its lock goes away (clients must | |||
therefore be responsible for cleaning up their own mess, as with | ||||
any other operation or any non-empty resource) | ||||
While those without a write lock may not alter a property on a | o MAY NOT have values for properties like DAV:getcontentlanguage | |||
resource it is still possible for the values of live properties to | which haven't been specified yet by the client. | |||
change, even while locked, due to the requirements of their schemas. | ||||
Only dead properties and live properties defined to respect locks are | ||||
guaranteed not to change while write locked. | ||||
7.4. Write Locks and Null Resources | o Can be updated (have content added) with a PUT request. | |||
It is possible to assert a write lock on a null resource in order to | o MUST NOT be converted into a collection. The server MUST fail a | |||
lock the name. | MKCOL request (as it would with a MKCOL request to any existing | |||
non-collection resource). | ||||
A write locked null resource, referred to as a lock-null resource, | o MUST have defined values for DAV:lockdiscovery and DAV: | |||
MUST respond with a 404 (Not Found) or 405 (Method Not Allowed) to | supportedlock properties. | |||
any HTTP/1.1 or DAV methods except for PUT, MKCOL, OPTIONS, PROPFIND, | ||||
LOCK, and UNLOCK. A lock-null resource MUST appear as a member of | ||||
its parent collection. Additionally the lock-null resource MUST have | ||||
defined on it all mandatory DAV properties. Most of these | ||||
properties, such as all the get* properties, will have no value as a | ||||
lock-null resource does not support the GET method. Lock-Null | ||||
resources MUST have defined values for lockdiscovery and | ||||
supportedlock properties. | ||||
Until a method such as PUT or MKCOL is successfully executed on the | o The response MUST indicate that a resource was created, by use of | |||
lock-null resource the resource MUST stay in the lock-null state. | the "201 Created" response code (a LOCK request to an existing | |||
However, once a PUT or MKCOL is successfully executed on a lock-null | resource instead will result in 200 OK). The body must still | |||
resource the resource ceases to be in the lock-null state. | include the DAV:lockdiscovery property, as with a LOCK request to | |||
an existing resource. | ||||
If the resource is unlocked, for any reason, without a PUT, MKCOL, or | The client is expected to update the locked empty resource shortly | |||
similar method having been successfully executed upon it then the | after locking it, using PUT and possibly PROPPATCH. | |||
resource MUST return to the null state. | ||||
7.5. Write Locks and Collections | Alternatively and for backwards compatibility to [RFC2518], servers | |||
MAY implement Lock-Null Resources (LNRs) instead (see definition in | ||||
Appendix D). Clients can easily interoperate both with servers that | ||||
support the old model LNRs and the recommended model of "locked empty | ||||
resources" by only attempting PUT after a LOCK to an unmapped URL, | ||||
not MKCOL or GET, and by not relying on specific properties of LNRs. | ||||
A write lock on a collection, whether created by a "Depth: 0" or | 7.4. Write Locks and Collections | |||
"Depth: infinity" lock request, prevents the addition or removal of | ||||
member URIs of the collection by non-lock owners. As a consequence, | ||||
when a principal issues a PUT or POST request to create a new | ||||
resource under a URI which needs to be an internal member of a write | ||||
locked collection to maintain HTTP namespace consistency, or issues a | ||||
DELETE to remove a resource which has a URI which is an existing | ||||
internal member URI of a write locked collection, this request MUST | ||||
fail if the principal does not have a write lock on the collection. | ||||
However, if a write lock request is issued to a collection containing | There are two kinds of collection write locks. A depth-0 write lock | |||
member URIs identifying resources that are currently locked in a | on a collection protects the collection properties plus the internal | |||
manner which conflicts with the write lock, the request MUST fail | member URLs of that one collection, while not protecting the content | |||
with a 423 (Locked) status code. | or properties of member resources (if the collection itself has any | |||
entity bodies, those are also protected). A depth-infinity write | ||||
lock on a collection provides the same protection on that collection | ||||
and also provides write lock protection on every member resource. | ||||
If a lock owner causes the URI of a resource to be added as an | Expressed otherwise, a write lock protects any request that would | |||
internal member URI of a locked collection then the new resource MUST | create a new resource in a write locked collection, any request that | |||
be automatically added to the lock. This is the only mechanism that | would remove an internal member URL of a write locked collection, and | |||
allows a resource to be added to a write lock. Thus, for example, if | any request that would change the segment name of any internal | |||
the collection /a/b/ is write locked and the resource /c is moved to | member. | |||
/a/b/c then resource /a/b/c will be added to the write lock. | ||||
7.6. Write Locks and the If Request Header | Thus, a collection write lock protects all the following actions: | |||
If a user agent is not required to have knowledge about a lock when | o DELETE a collection's direct internal member, | |||
requesting an operation on a locked resource, the following scenario | ||||
might occur. Program A, run by User A, takes out a write lock on a | o MOVE an internal member out of the collection, | |||
resource. Program B, also run by User A, has no knowledge of the | ||||
lock taken out by Program A, yet performs a PUT to the locked | o MOVE an internal member into the collection, | |||
resource. In this scenario, the PUT succeeds because locks are | ||||
associated with a principal, not a program, and thus program B, | o MOVE to rename an internal member within a collection, | |||
because it is acting with principal A's credential, is allowed to | o COPY an internal member into a collection, and | |||
perform the PUT. However, had program B known about the lock, it | ||||
would not have overwritten the resource, preferring instead to | o PUT or MKCOL request which would create a new internal member. | |||
present a dialog box describing the conflict to the user. Due to | ||||
The collection's lock token is required in addition to the lock token | ||||
on the internal member itself, if it is locked separately. | ||||
In addition, a depth-infinity lock affects all write operations to | ||||
all members of the locked collection. With a depth-infinity lock, | ||||
the resource identified by the root of the lock is directly locked, | ||||
and all its members are indirectly locked. | ||||
o Any new resource added as a descendent of a depth-infinity locked | ||||
collection becomes indirectly locked. | ||||
o Any indirectly locked resource moved out of the locked collection | ||||
into an unlocked collection is thereafter unlocked. | ||||
o Any indirectly locked resource moved out of a locked source | ||||
collection into a depth-infinity locked target collection remains | ||||
indirectly locked but is now protected by the lock on the target | ||||
collection (the target collection's lock token will thereafter be | ||||
required to make further changes). | ||||
If a depth-infinity write LOCK request is issued to a collection | ||||
containing member URLs identifying resources that are currently | ||||
locked in a manner which conflicts with the new lock (see Section 6.1 | ||||
point 3), the request MUST fail with a 423 (Locked) status code, and | ||||
the response SHOULD contain the 'no-conflicting-lock' precondition. | ||||
If a lock request causes the URL of a resource to be added as an | ||||
internal member URL of a depth-infinity locked collection then the | ||||
new resource MUST be automatically protected by the lock. For | ||||
example, if the collection /a/b/ is write locked and the resource /c | ||||
is moved to /a/b/c then resource /a/b/c will be added to the write | ||||
lock. | ||||
7.5. Write Locks and the If Request Header | ||||
A user agent has to demonstrate knowledge of a lock when requesting | ||||
an operation on a locked resource. Otherwise, the following scenario | ||||
might occur. In the scenario, program A, run by User A, takes out a | ||||
write lock on a resource. Program B, also run by User A, has no | ||||
knowledge of the lock taken out by program A, yet performs a PUT to | ||||
the locked resource. In this scenario, the PUT succeeds because | ||||
locks are associated with a principal, not a program, and thus | ||||
program B, because it is acting with principal A's credential, is | ||||
allowed to perform the PUT. However, had program B known about the | ||||
lock, it would not have overwritten the resource, preferring instead | ||||
to present a dialog box describing the conflict to the user. Due to | ||||
this scenario, a mechanism is needed to prevent different programs | this scenario, a mechanism is needed to prevent different programs | |||
from accidentally ignoring locks taken out by other programs with the | from accidentally ignoring locks taken out by other programs with the | |||
same authorization. | same authorization. | |||
In order to prevent these collisions a lock token MUST be submitted | In order to prevent these collisions a lock token MUST be submitted | |||
by an authorized principal in the If header for all locked resources | by an authorized principal for all locked resources that a method may | |||
that a method may interact with or the method MUST fail. For | change or the method MUST fail. A lock token is submitted when it | |||
example, if a resource is to be moved and both the source and | appears in an If header. For example, if a resource is to be moved | |||
destination are locked then two lock tokens must be submitted, one | and both the source and destination are locked then two lock tokens | |||
for the source and the other for the destination. | must be submitted in the If header, one for the source and the other | |||
for the destination. | ||||
7.6.1. Example - Write Lock | 7.5.1. Example - Write Lock and COPY | |||
>>Request | >>Request | |||
COPY /~fielding/index.html HTTP/1.1 | COPY /~fielding/index.html HTTP/1.1 | |||
Host: www.ics.uci.edu | Host: www.example.com | |||
Destination: http://www.ics.uci.edu/users/f/fielding/index.html | Destination: http://www.example.com/users/f/fielding/index.html | |||
If: <http://www.ics.uci.edu/users/f/fielding/index.html> | If: <http://www.example.com/users/f/fielding/index.html> | |||
(<opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>) | (<urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>) | |||
␉ | ||||
>>Response | >>Response | |||
HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
In this example, even though both the source and destination are | In this example, even though both the source and destination are | |||
locked, only one lock token must be submitted, for the lock on the | locked, only one lock token must be submitted, for the lock on the | |||
destination. This is because the source resource is not modified by | destination. This is because the source resource is not modified by | |||
a COPY, and hence unaffected by the write lock. In this example, | a COPY, and hence unaffected by the write lock. In this example, | |||
user agent authentication has previously occurred via a mechanism | user agent authentication has previously occurred via a mechanism | |||
outside the scope of the HTTP protocol, in the underlying transport | outside the scope of the HTTP protocol, in the underlying transport | |||
layer. | layer. | |||
7.7. Write Locks and COPY/MOVE | 7.5.2. Example - Deleting a Member of a Locked Collection | |||
Consider a collection "/locked" with an exclusive, depth-infinity | ||||
write lock, and an attempt to delete an internal member "/locked/ | ||||
member": | ||||
>>Request | ||||
DELETE /locked/member HTTP/1.1 | ||||
Host: example.com | ||||
>>Response | ||||
HTTP/1.1 423 Locked | ||||
Content-Type: application/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | ||||
<D:error xmlns:D="DAV:"> | ||||
<D:lock-token-submitted> | ||||
<D:href>/locked/</D:href> | ||||
</D:lock-token-submitted> | ||||
</D:error> | ||||
Thus the client would need to submit the lock token with the request | ||||
to make it succeed. To do that, various forms of the If header (see | ||||
Section 10.4) could be used. | ||||
"No-Tag-List" format: | ||||
If: (<urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf>) | ||||
"Tagged-List" format, for "http://example.com/locked/": | ||||
If: <http://example.com/locked/> | ||||
(<urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf>) | ||||
"Tagged-List" format, for "http://example.com/locked/member": | ||||
If: <http://example.com/locked/member> | ||||
(<urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf>) | ||||
Note that for the purpose of submitting the lock token the actual | ||||
form doesn't matter; what's relevant is that the lock token appears | ||||
in the If header, and that the If header itself evaluates to true. | ||||
7.6. Write Locks and COPY/MOVE | ||||
A COPY method invocation MUST NOT duplicate any write locks active on | A COPY method invocation MUST NOT duplicate any write locks active on | |||
the source. However, as previously noted, if the COPY copies the | the source. However, as previously noted, if the COPY copies the | |||
resource into a collection that is locked with "Depth: infinity", | resource into a collection that is locked with a depth-infinity lock, | |||
then the resource will be added to the lock. | then the resource will be added to the lock. | |||
A successful MOVE request on a write locked resource MUST NOT move | A successful MOVE request on a write locked resource MUST NOT move | |||
the write lock with the resource. However, the resource is subject | the write lock with the resource. However, if there is an existing | |||
to being added to an existing lock at the destination, as specified | lock at the destination, the server MUST add the moved resource to | |||
in Section 7.5. For example, if the MOVE makes the resource a child | the destination lock scope. For example, if the MOVE makes the | |||
of a collection that is locked with "Depth: infinity", then the | resource a child of a collection that has a depth-infinity lock, then | |||
resource will be added to that collection's lock. Additionally, if a | the resource will be added to that collection's lock. Additionally, | |||
resource locked with "Depth: infinity" is moved to a destination that | if a resource with a depth-infinity lock is moved to a destination | |||
is within the scope of the same lock (e.g., within the namespace tree | that is within the scope of the same lock (e.g., within the URL | |||
covered by the lock), the moved resource will again be a added to the | namespace tree covered by the lock), the moved resource will again be | |||
lock. In both these examples, as specified in Section 7.6, an If | a added to the lock. In both these examples, as specified in | |||
header must be submitted containing a lock token for both the source | Section 7.5, an If header must be submitted containing a lock token | |||
and destination. | for both the source and destination. | |||
7.8. Refreshing Write Locks | 7.7. Refreshing Write Locks | |||
A client MUST NOT submit the same write lock request twice. Note | A client MUST NOT submit the same write lock request twice. Note | |||
that a client is always aware it is resubmitting the same lock | that a client is always aware it is resubmitting the same lock | |||
request because it must include the lock token in the If header in | request because it must include the lock token in the If header in | |||
order to make the request for a resource that is already locked. | order to make the request for a resource that is already locked. | |||
However, a client may submit a LOCK method with an If header but | However, a client may submit a LOCK request with an If header but | |||
without a body. This form of LOCK MUST only be used to "refresh" a | without a body. A server receiving a LOCK request with no body MUST | |||
lock. Meaning, at minimum, that any timers associated with the lock | NOT create a new lock -- this form of the LOCK request is only to be | |||
MUST be re-set. | used to "refresh" an existing lock (meaning, at minimum, that any | |||
timers associated with the lock MUST be re-set). | ||||
A server may return a Timeout header with a lock refresh that is | Clients may submit Timeout headers of arbitrary value with their lock | |||
different than the Timeout header returned when the lock was | refresh requests. Servers, as always, may ignore Timeout headers | |||
originally requested. Additionally clients may submit Timeout | submitted by the client, and a server MAY refresh a lock with a | |||
headers of arbitrary value with their lock refresh requests. | timeout period that is different than the previous timeout period | |||
Servers, as always, may ignore Timeout headers submitted by the | used for the lock, provided it advertises the new value in the LOCK | |||
client. | refresh response. | |||
If an error is received in response to a refresh LOCK request the | If an error is received in response to a refresh LOCK request the | |||
client SHOULD assume that the lock was not refreshed. | client MUST NOT assume that the lock was refreshed. | |||
8. HTTP Methods for Distributed Authoring | 8. General Request and Response Handling | |||
The following new HTTP methods use XML as a request and response | 8.1. Precedence in Error Handling | |||
format. All DAV compliant clients and resources MUST use XML parsers | ||||
that are compliant with [REC-XML]. All XML used in either requests | ||||
or responses MUST be, at minimum, well formed. If a server receives | ||||
ill-formed XML in a request it MUST reject the entire request with a | ||||
400 (Bad Request). If a client receives ill-formed XML in a response | ||||
then it MUST NOT assume anything about the outcome of the executed | ||||
method and SHOULD treat the server as malfunctioning. | ||||
8.1. PROPFIND | Servers MUST return authorization errors in preference to other | |||
errors. This avoids leaking information about protected resources | ||||
(e.g. a client that finds that a hidden resource exists by seeing a | ||||
423 Locked response to an anonymous request to the resource). | ||||
8.2. Use of XML | ||||
In HTTP/1.1, method parameter information was exclusively encoded in | ||||
HTTP headers. Unlike HTTP/1.1, WebDAV encodes method parameter | ||||
information either in an XML ([REC-XML]) request entity body, or in | ||||
an HTTP header. The use of XML to encode method parameters was | ||||
motivated by the ability to add extra XML elements to existing | ||||
structures, providing extensibility; and by XML's ability to encode | ||||
information in ISO 10646 character sets, providing | ||||
internationalization support. | ||||
In addition to encoding method parameters, XML is used in WebDAV to | ||||
encode the responses from methods, providing the extensibility and | ||||
internationalization advantages of XML for method output, as well as | ||||
input. | ||||
When XML is used for a request or response body, the Content-Type | ||||
type SHOULD be application/xml. Implementations MUST accept both | ||||
text/xml and application/xml in request and response bodies. Use of | ||||
text/xml is deprecated. | ||||
All DAV compliant clients and resources MUST use XML parsers that are | ||||
compliant with [REC-XML] and [REC-XML-NAMES]. All XML used in either | ||||
requests or responses MUST be, at minimum, well formed and use | ||||
namespaces correctly. If a server receives XML that is not well- | ||||
formed then the server MUST reject the entire request with a 400 (Bad | ||||
Request). If a client receives XML that is not well-formed in a | ||||
response then the client MUST NOT assume anything about the outcome | ||||
of the executed method and SHOULD treat the server as malfunctioning. | ||||
Note that processing XML submitted by an untrusted source may cause | ||||
risks connected to privacy, security, and service quality (see | ||||
Section 20). Servers MAY reject questionable requests (even though | ||||
they consist of well-formed XML), for instance with a 400 (Bad | ||||
Request) status code and an optional response body explaining the | ||||
problem. | ||||
8.3. URL Handling | ||||
URLs appear in many places in requests and responses. | ||||
Interoperability experience with [RFC2518] showed that many clients | ||||
parsing Multi-Status responses did not fully implement the full | ||||
Reference Resolution defined in Section 5 of [RFC3986]. Thus, | ||||
servers in particular need to be careful in handling URLs in | ||||
responses, to ensure that clients have enough context to be able to | ||||
interpret all the URLs. The rules in this section apply not only to | ||||
resource URLs in the 'href' element in Multi-Status responses, but | ||||
also to the Destination and If header resource URLs. | ||||
The sender has a choice between two approaches: using a relative | ||||
reference, which is resolved against the Request-URI, or a full URI. | ||||
A server MUST ensure that every 'href' value within a Multi-Status | ||||
response uses the same format. | ||||
WebDAV only uses one form of relative reference in its extensions, | ||||
the absolute path. | ||||
Simple-ref = absolute-URI | ( path-absolute [ "?" query ] ) | ||||
The absolute-URI, path-absolute and query productions are defined in | ||||
Section 4.3, 3.3 and 3.4 of [RFC3986]. | ||||
Within Simple-ref productions, senders MUST NOT: | ||||
o use dot-segments ("." or ".."), or | ||||
o have prefixes that do not match the Request-URI (using the | ||||
comparison rules defined in Section 3.2.3 of [RFC2616]). | ||||
Identifiers for collections SHOULD end in a '/' character. | ||||
8.3.1. Example - Correct URL Handling | ||||
Consider the collection http://example.com/sample/ with the internal | ||||
member URL http://example.com/sample/a%20test and the PROPFIND | ||||
request below: | ||||
>>Request: | ||||
PROPFIND /sample/ HTTP/1.1 | ||||
Host: example.com | ||||
Depth: 1 | ||||
In this case, the server should return two 'href' elements containing | ||||
either | ||||
o 'http://example.com/sample/' and | ||||
'http://example.com/sample/a%20test', or | ||||
o '/sample/' and '/sample/a%20test' | ||||
Note that even though the server may be storing the member resource | ||||
internally as 'a test', it has to be percent-encoded when used inside | ||||
a URI reference (see Section 2.1 of [RFC3986]). Also note that a | ||||
legal URI may still contain characters that need to be escaped within | ||||
XML character data, such as the ampersand character. | ||||
8.4. Required Bodies in Requests | ||||
Some of these new methods do not define bodies. Servers MUST examine | ||||
all requests for a body, even when a body was not expected. In cases | ||||
where a request body is present but would be ignored by a server, the | ||||
server MUST reject the request with 415 (Unsupported Media Type). | ||||
This informs the client (which may have been attempting to use an | ||||
extension) that the body could not be processed as the client | ||||
intended. | ||||
8.5. HTTP Headers for use in WebDAV | ||||
HTTP defines many headers that can be used in WebDAV requests and | ||||
responses. Not all of these are appropriate in all situations and | ||||
some interactions may be undefined. Note that HTTP 1.1 requires the | ||||
Date header in all responses if possible (see Section 14.18, | ||||
[RFC2616]). | ||||
The server MUST do authorization checks before checking any HTTP | ||||
conditional header. | ||||
8.6. ETag | ||||
HTTP 1.1 recommends the use of ETags rather than modification dates, | ||||
for cache-control, and there are even stronger reasons to prefer | ||||
ETags for authoring. Correct use of ETags is even more important in | ||||
a distributed authoring environment, because ETags are necessary | ||||
along with locks to avoid the lost-update problem. A client might | ||||
fail to renew a lock, for example when the lock times out and the | ||||
client is accidentally offline or in the middle of a long upload. | ||||
When a client fails to renew the lock, it's quite possible the | ||||
resource can still be relocked and the user can go on editing, as | ||||
long as no changes were made in the meantime. ETags are required for | ||||
the client to be able to distinguish this case. Otherwise, the | ||||
client is forced to ask the user whether to overwrite the resource on | ||||
the server without even being able to tell the user whether it has | ||||
changed. Timestamps do not solve this problem nearly as well as | ||||
ETags. | ||||
Strong ETags are much more useful for authoring use cases than weak | ||||
ETags (see Section 13.3.3 of [RFC2616]). Semantic equivalence can be | ||||
a useful concept but that depends on the document type and the | ||||
application type, and interoperability might require some agreement | ||||
or standard outside the scope of this specification and HTTP. Note | ||||
also that weak ETags have certain restrictions in HTTP, e.g. these | ||||
cannot be used in If-Match headers. | ||||
Note that the meaning of an ETag in a PUT response is not clearly | ||||
defined either in this document or in RFC2616 (i.e., whether the ETag | ||||
means that the resource is octet-for-octet equivalent to the body of | ||||
the PUT request, or whether the server could have made minor changes | ||||
in the formatting or content of the document upon storage). This is | ||||
an HTTP issue, not purely a WebDAV issue. | ||||
Because clients may be forced to prompt users or throw away changed | ||||
content if the ETag changes, a WebDAV server SHOULD NOT change the | ||||
ETag (or the Last-Modified time) for a resource that has an unchanged | ||||
body and location. The ETag represents the state of the body or | ||||
contents of the resource. There is no similar way to tell if | ||||
properties have changed. | ||||
8.7. Including Error Response Bodies | ||||
HTTP and WebDAV did not use the bodies of most error responses for | ||||
machine-parsable information until the specification for Versioning | ||||
Extensions to WebDAV introduced a mechanism to include more specific | ||||
information in the body of an error response (Section 1.6 of | ||||
[RFC3253]). The error body mechanism is appropriate to use with any | ||||
error response that may take a body but does not already have a body | ||||
defined. The mechanism is particularly appropriate when a status | ||||
code can mean many things (for example, 400 Bad Request can mean | ||||
required headers are missing, headers are incorrectly formatted, or | ||||
much more). This error body mechanism is covered in Section 16. | ||||
8.8. Impact of Namespace Operations on Cache Validators | ||||
Note that the HTTP response headers "Etag" and "Last-Modified" (see | ||||
[RFC2616], Sections 14.19 and 14.29) are defined per URL (not per | ||||
resource), and are used by clients for caching. Therefore servers | ||||
must ensure that executing any operation that affects the URL | ||||
namespace (such as COPY, MOVE, DELETE, PUT or MKCOL) does preserve | ||||
their semantics, in particular: | ||||
o For any given URL, the "Last-Modified" value MUST increment every | ||||
time the representation returned upon GET changes (within the | ||||
limits of timestamp resolution). | ||||
o For any given URL, an "ETag" value MUST NOT be re-used for | ||||
different representations returned by GET. | ||||
In practice this means that servers | ||||
o might have to increment "Last-Modified" timestamps for every | ||||
resource inside the destination namespace of a namespace operation | ||||
unless it can do so more selectively, and | ||||
o similarily, might have to re-assign "ETag" values for these | ||||
resources (unless the server allocates entity tags in a way so | ||||
that they are unique across the whole URL namespace managed by the | ||||
server). | ||||
Note that these considerations also apply to specific use cases, such | ||||
as using PUT to create a new resource at a URL that has been mapped | ||||
before, but has been deleted since then. | ||||
Finally, WebDAV properties (such as DAV:getetag and DAV: | ||||
getlastmodified) that inherit their semantics from HTTP headers must | ||||
behave accordingly. | ||||
9. HTTP Methods for Distributed Authoring | ||||
9.1. PROPFIND Method | ||||
The PROPFIND method retrieves properties defined on the resource | The PROPFIND method retrieves properties defined on the resource | |||
identified by the Request-URI, if the resource does not have any | identified by the Request-URI, if the resource does not have any | |||
internal members, or on the resource identified by the Request-URI | internal members, or on the resource identified by the Request-URI | |||
and potentially its member resources, if the resource is a collection | and potentially its member resources, if the resource is a collection | |||
that has internal member URIs. All DAV compliant resources MUST | that has internal member URLs. All DAV compliant resources MUST | |||
support the PROPFIND method and the propfind XML element (section | support the PROPFIND method and the propfind XML element | |||
12.14) along with all XML elements defined for use with that element. | (Section 14.20) along with all XML elements defined for use with that | |||
element. | ||||
A client may submit a Depth header with a value of "0", "1", or | A client MUST submit a Depth header with a value of "0", "1", or | |||
"infinity" with a PROPFIND on a collection resource with internal | "infinity" with a PROPFIND request. Servers MUST support "0" and "1" | |||
member URIs. DAV compliant servers MUST support the "0", "1" and | depth requests on WebDAV-compliant resources and SHOULD support | |||
"infinity" behaviors. By default, the PROPFIND method without a | "infinity" requests. In practice, support for infinite depth | |||
Depth header MUST act as if a "Depth: infinity" header was included. | requests MAY be disabled, due to the performance and security | |||
concerns associated with this behavior. Since clients weren't | ||||
required to include the Depth header in [RFC2518], servers SHOULD | ||||
treat such a request as if a "Depth: infinity" header was included. | ||||
A client may submit a propfind XML element in the body of the request | A client may submit a 'propfind' XML element in the body of the | |||
method describing what information is being requested. It is | request method describing what information is being requested. It is | |||
possible to request particular property values, all property values, | possible to: | |||
or a list of the names of the resource's properties. A client may | ||||
choose not to submit a request body. An empty PROPFIND request body | o Request particular property values, by naming the properties | |||
MUST be treated as a request for the names and values of all | desired within the 'prop' element (the ordering of properties in | |||
properties. | here MAY be ignored by server), | |||
o Request property values for those properties defined in this | ||||
specification (at a minimum) plus dead properties, by using the | ||||
'allprop' element (the 'include' element can be used with | ||||
'allprop' to instruct the server to also include additional live | ||||
properties that may not have been returned otherwise), | ||||
o Request a list of names of all the properties defined on the | ||||
resource, by using the 'propname' element. | ||||
A client may choose not to submit a request body. An empty PROPFIND | ||||
request body MUST be treated as if it were an 'allprop' request. | ||||
Note that 'allprop' does not return values for all live properties. | ||||
WebDAV servers increasingly have expensively-calculated or lengthy | ||||
properties (see [RFC3253] and [RFC3744]) and do not return all | ||||
properties already. Instead, WebDAV clients can use propname | ||||
requests to discover what live properties exist, and request named | ||||
properties when retrieving values. For a live property defined | ||||
elsewhere, that definition can specify whether that live property | ||||
would be returned in 'allprop' requests or not. | ||||
All servers MUST support returning a response of content type text/ | All servers MUST support returning a response of content type text/ | |||
xml or application/xml that contains a multistatus XML element that | xml or application/xml that contains a multistatus XML element that | |||
describes the results of the attempts to retrieve the various | describes the results of the attempts to retrieve the various | |||
properties. | properties. | |||
If there is an error retrieving a property then a proper error result | If there is an error retrieving a property then a proper error result | |||
MUST be included in the response. A request to retrieve the value of | MUST be included in the response. A request to retrieve the value of | |||
a property which does not exist is an error and MUST be noted, if the | a property which does not exist is an error and MUST be noted with a | |||
response uses a multistatus XML element, with a response XML element | 'response' XML element which contains a 404 (Not Found) status value. | |||
which contains a 404 (Not Found) status value. | ||||
Consequently, the multistatus XML element for a collection resource | Consequently, the 'multistatus' XML element for a collection resource | |||
with member URIs MUST include a response XML element for each member | MUST include a 'response' XML element for each member URL of the | |||
URI of the collection, to whatever depth was requested. Each | collection, to whatever depth was requested. It SHOULD NOT include | |||
response XML element MUST contain an href XML element that gives the | any 'response' elements for resources that are not WebDAV-compliant. | |||
URI of the resource on which the properties in the prop XML element | Each 'response' element MUST contain an 'href' element that contains | |||
are defined. Results for a PROPFIND on a collection resource with | the URL of the resource on which the properties in the prop XML | |||
internal member URIs are returned as a flat list whose order of | element are defined. Results for a PROPFIND on a collection resource | |||
entries is not significant. | are returned as a flat list whose order of entries is not | |||
significant. Note that a resource may have only one value for a | ||||
property of a given name, so the property may only show up once in | ||||
PROPFIND responses. | ||||
In the case of allprop and propname, if a principal does not have the | Properties may be subject to access control. In the case of | |||
'allprop' and 'propname' requests, if a principal does not have the | ||||
right to know whether a particular property exists then the property | right to know whether a particular property exists then the property | |||
should be silently excluded from the response. | MAY be silently excluded from the response. | |||
The results of this method SHOULD NOT be cached. | Some PROPFIND results MAY be cached, with care as there is no cache | |||
validation mechanism for most properties. This method is both safe | ||||
and idempotent (see Section 9.1 of [RFC2616]). | ||||
8.1.1. Example - Retrieving Named Properties | 9.1.1. PROPFIND Status Codes | |||
>>Request | This section, as with similar sections for other methods, provides | |||
some guidance on error codes and preconditions or postconditions | ||||
(defined in Section 16) that might be particularly useful with | ||||
PROPFIND. | ||||
PROPFIND /file HTTP/1.1 | 403 Forbidden - A server MAY reject PROPFIND requests on collections | |||
Host: www.foo.bar | with depth header of "Infinity", in which case it SHOULD use this | |||
Content-type: text/xml; charset="utf-8" | error with the precondition code 'propfind-finite-depth' inside the | |||
Content-Length: xxxx | error body. | |||
<?xml version="1.0" encoding="utf-8" ?> | 9.1.2. Status Codes for Use in 'propstat' Element | |||
<D:propfind xmlns:D="DAV:"> | ||||
<D:prop xmlns:R="http://www.foo.bar/boxschema/"> | ||||
<R:bigbox/> | ||||
<R:author/> | ||||
<R:DingALing/> | ||||
<R:Random/> | ||||
</D:prop> | ||||
</D:propfind> | ||||
>>Response | In PROPFIND responses, information about individual properties is | |||
returned inside 'propstat' elements (see Section 14.22), each | ||||
containing an individual 'status' element containing information | ||||
about the properties appearing in it. The list below summarizes the | ||||
most common status codes used inside 'propstat', however clients | ||||
should be prepared to handle other 2/3/4/5xx series status codes as | ||||
well. | ||||
HTTP/1.1 207 Multi-Status | 200 OK - A property exists and/or its value is successfully returned. | |||
Content-Type: text/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | 401 Unauthorized - The property cannot be viewed without appropriate | |||
<D:multistatus xmlns:D="DAV:"> | authorization. | |||
<D:response> | ||||
<D:href>http://www.foo.bar/file</D:href> | ||||
<D:propstat> | ||||
<D:prop xmlns:R="http://www.foo.bar/boxschema/"> | ||||
<R:bigbox> | ||||
<R:BoxType>Box type A</R:BoxType> | ||||
</R:bigbox> | ||||
<R:author> | ||||
<R:Name>J.J. Johnson</R:Name> | ||||
</R:author> | ||||
</D:prop> | ||||
<D:status>HTTP/1.1 200 OK</D:status> | ||||
</D:propstat> | ||||
<D:propstat> | ||||
<D:prop><R:DingALing/><R:Random/></D:prop> | ||||
<D:status>HTTP/1.1 403 Forbidden</D:status> | ||||
<D:responsedescription> The user does not have access to | ||||
the DingALing property. | ||||
</D:responsedescription> | ||||
</D:propstat> | ||||
</D:response> | ||||
<D:responsedescription> There has been an access violation error. | ||||
</D:responsedescription> | ||||
</D:multistatus> | ||||
In this example, PROPFIND is executed on a non-collection resource | 403 Forbidden - The property cannot be viewed regardless of | |||
http://www.foo.bar/file. The propfind XML element specifies the name | authentication. | |||
of four properties whose values are being requested. In this case | ||||
only two properties were returned, since the principal issuing the | ||||
request did not have sufficient access rights to see the third and | ||||
fourth properties. | ||||
8.1.2. Example - Using allprop to Retrieve All Properties | 404 Not Found - The property does not exist. | |||
9.1.3. Example - Retrieving Named Properties | ||||
>>Request | >>Request | |||
PROPFIND /container/ HTTP/1.1 | PROPFIND /file HTTP/1.1 | |||
Host: www.foo.bar | Host: www.example.com | |||
Depth: 1 | Content-type: application/xml; charset="utf-8" | |||
Content-Type: text/xml; charset="utf-8" | Content-Length: xxxx | |||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:allprop/> | <D:prop xmlns:R="http://ns.example.com/boxschema/"> | |||
</D:propfind> | <R:bigbox/> | |||
<R:author/> | ||||
<R:DingALing/> | ||||
<R:Random/> | ||||
</D:prop> | ||||
</D:propfind> | ||||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response xmlns:R="http://ns.example.com/boxschema/"> | |||
<D:href>http://www.foo.bar/container/</D:href> | <D:href>http://www.example.com/file</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop xmlns:R="http://www.foo.bar/boxschema/"> | <D:prop> | |||
<R:bigbox> | <R:bigbox> | |||
<R:BoxType>Box type A</R:BoxType> | <R:BoxType>Box type A</R:BoxType> | |||
</R:bigbox> | </R:bigbox> | |||
<R:author> | <R:author> | |||
<R:Name>Hadrian</R:Name> | <R:Name>J.J. Johnson</R:Name> | |||
</R:author> | </R:author> | |||
<D:creationdate> | </D:prop> | |||
1997-12-01T17:42:21-08:00 | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:creationdate> | </D:propstat> | |||
<D:displayname> | <D:propstat> | |||
Example collection | <D:prop><R:DingALing/><R:Random/></D:prop> | |||
</D:displayname> | <D:status>HTTP/1.1 403 Forbidden</D:status> | |||
<D:resourcetype><D:collection/></D:resourcetype> | <D:responsedescription> The user does not have access to the | |||
<D:supportedlock> | DingALing property. | |||
<D:lockentry> | </D:responsedescription> | |||
<D:lockscope><D:exclusive/></D:lockscope> | </D:propstat> | |||
<D:locktype><D:write/></D:locktype> | </D:response> | |||
</D:lockentry> | <D:responsedescription> There has been an access violation error. | |||
<D:lockentry> | </D:responsedescription> | |||
<D:lockscope><D:shared/></D:lockscope> | </D:multistatus> | |||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | In this example, PROPFIND is executed on a non-collection resource | |||
</D:supportedlock> | http://www.example.com/file. The propfind XML element specifies the | |||
</D:prop> | name of four properties whose values are being requested. In this | |||
<D:status>HTTP/1.1 200 OK</D:status> | case only two properties were returned, since the principal issuing | |||
</D:propstat> | the request did not have sufficient access rights to see the third | |||
</D:response> | and fourth properties. | |||
<D:response> | ||||
<D:href>http://www.foo.bar/container/front.html</D:href> | ||||
<D:propstat> | ||||
<D:prop xmlns:R="http://www.foo.bar/boxschema/"> | ||||
<R:bigbox> | ||||
<R:BoxType>Box type B</R:BoxType> | ||||
</R:bigbox> | ||||
<D:creationdate> | ||||
1997-12-01T18:27:21-08:00 | ||||
</D:creationdate> | ||||
<D:displayname> | ||||
Example HTML resource | ||||
</D:displayname> | ||||
<D:getcontentlength> | ||||
4525 | ||||
</D:getcontentlength> | ||||
<D:getcontenttype> | ||||
text/html | ||||
</D:getcontenttype> | ||||
<D:getetag> | ||||
zzyzx | ||||
</D:getetag> | ||||
<D:getlastmodified> | ||||
Monday, 12-Jan-98 09:25:56 GMT | ||||
</D:getlastmodified> | ||||
<D:resourcetype/> | ||||
<D:supportedlock> | ||||
<D:lockentry> | ||||
<D:lockscope><D:exclusive/></D:lockscope> | ||||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | ||||
<D:lockentry> | ||||
<D:lockscope><D:shared/></D:lockscope> | ||||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | ||||
</D:supportedlock> | ||||
</D:prop> | ||||
<D:status>HTTP/1.1 200 OK</D:status> | ||||
</D:propstat> | ||||
</D:response> | ||||
</D:multistatus> | ||||
In this example, PROPFIND was invoked on the resource | 9.1.4. Example - Using 'propname' to Retrieve All Property Names | |||
http://www.foo.bar/container/ with a Depth header of 1, meaning the | ||||
request applies to the resource and its children, and a propfind XML | ||||
element containing the allprop XML element, meaning the request | ||||
should return the name and value of all properties defined on each | ||||
resource. | ||||
The resource http://www.foo.bar/container/ has six properties defined | >>Request | |||
on it: | ||||
http://www.foo.bar/boxschema/bigbox, | PROPFIND /container/ HTTP/1.1 | |||
http://www.foo.bar/boxschema/author, DAV:creationdate, DAV: | Host: www.example.com | |||
displayname, DAV:resourcetype, and DAV:supportedlock. | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | ||||
The last four properties are WebDAV-specific, defined in Section 13. | <?xml version="1.0" encoding="utf-8" ?> | |||
Since GET is not supported on this resource, the get* properties | <propfind xmlns="DAV:"> | |||
(e.g., getcontentlength) are not defined on this resource. The DAV- | <propname/> | |||
specific properties assert that "container" was created on December | </propfind> | |||
1, 1997, at 5:42:21PM, in a time zone 8 hours west of GMT | ||||
(creationdate), has a name of "Example collection" (displayname), a | ||||
collection resource type (resourcetype), and supports exclusive write | ||||
and shared write locks (supportedlock). | ||||
The resource http://www.foo.bar/container/front.html has nine | >>Response | |||
properties defined on it: | ||||
http://www.foo.bar/boxschema/bigbox (another instance of the "bigbox" | HTTP/1.1 207 Multi-Status | |||
property type), DAV:creationdate, DAV:displayname, DAV: | Content-Type: application/xml; charset="utf-8" | |||
getcontentlength, DAV:getcontenttype, DAV:getetag, DAV: | Content-Length: xxxx | |||
getlastmodified, DAV:resourcetype, and DAV:supportedlock. | ||||
The DAV-specific properties assert that "front.html" was created on | <?xml version="1.0" encoding="utf-8" ?> | |||
December 1, 1997, at 6:27:21PM, in a time zone 8 hours west of GMT | <multistatus xmlns="DAV:"> | |||
(creationdate), has a name of "Example HTML resource" (displayname), | <response> | |||
a content length of 4525 bytes (getcontentlength), a MIME type of | <href>http://www.example.com/container/</href> | |||
"text/html" (getcontenttype), an entity tag of "zzyzx" (getetag), was | <propstat> | |||
last modified on Monday, January 12, 1998, at 09:25:56 GMT | <prop xmlns:R="http://ns.example.com/boxschema/"> | |||
(getlastmodified), has an empty resource type, meaning that it is not | <R:bigbox/> | |||
a collection (resourcetype), and supports both exclusive write and | <R:author/> | |||
shared write locks (supportedlock). | <creationdate/> | |||
<displayname/> | ||||
<resourcetype/> | ||||
<supportedlock/> | ||||
</prop> | ||||
<status>HTTP/1.1 200 OK</status> | ||||
</propstat> | ||||
</response> | ||||
<response> | ||||
<href>http://www.example.com/container/front.html</href> | ||||
<propstat> | ||||
<prop xmlns:R="http://ns.example.com/boxschema/"> | ||||
<R:bigbox/> | ||||
<creationdate/> | ||||
<displayname/> | ||||
<getcontentlength/> | ||||
<getcontenttype/> | ||||
<getetag/> | ||||
<getlastmodified/> | ||||
<resourcetype/> | ||||
<supportedlock/> | ||||
</prop> | ||||
<status>HTTP/1.1 200 OK</status> | ||||
</propstat> | ||||
</response> | ||||
</multistatus> | ||||
8.1.3. Example - Using propname to Retrieve all Property Names | In this example, PROPFIND is invoked on the collection resource | |||
http://www.example.com/container/, with a propfind XML element | ||||
containing the propname XML element, meaning the name of all | ||||
properties should be returned. Since no Depth header is present, it | ||||
assumes its default value of "infinity", meaning the name of the | ||||
properties on the collection and all its descendents should be | ||||
returned. | ||||
Consistent with the previous example, resource | ||||
http://www.example.com/container/ has six properties defined on it: | ||||
bigbox and author in the "http://ns.example.com/boxschema/" | ||||
namespace, and creationdate, displayname, resourcetype, and | ||||
supportedlock in the "DAV:" namespace. | ||||
The resource http://www.example.com/container/index.html, a member of | ||||
the "container" collection, has nine properties defined on it, bigbox | ||||
in the "http://ns.example.com/boxschema/" namespace and, | ||||
creationdate, displayname, getcontentlength, getcontenttype, getetag, | ||||
getlastmodified, resourcetype, and supportedlock in the "DAV:" | ||||
namespace. | ||||
This example also demonstrates the use of XML namespace scoping and | ||||
the default namespace. Since the "xmlns" attribute does not contain | ||||
a prefix, the namespace applies by default to all enclosed elements. | ||||
Hence, all elements which do not explicitly state the namespace to | ||||
which they belong are members of the "DAV:" namespace. | ||||
9.1.5. Example - Using So-called 'allprop' | ||||
Note that 'allprop', despite its name which remains for backward- | ||||
compatibility, does not return every property, but only dead | ||||
properties and the live properties defined in this specification. | ||||
>>Request | >>Request | |||
PROPFIND /container/ HTTP/1.1 | PROPFIND /container/ HTTP/1.1 | |||
Host: www.foo.bar | Host: www.example.com | |||
Content-Type: text/xml; charset="utf-8" | Depth: 1 | |||
Content-Length: xxxx | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<propfind xmlns="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<propname/> | <D:allprop/> | |||
</propfind> | </D:propfind> | |||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<multistatus xmlns="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<response> | <D:response> | |||
<href>http://www.foo.bar/container/</href> | <D:href>/container/</D:href> | |||
<propstat> | <D:propstat> | |||
<prop xmlns:R="http://www.foo.bar/boxschema/"> | <D:prop xmlns:R="http://ns.example.com/boxschema/"> | |||
<R:bigbox/> | <R:bigbox><R:BoxType>Box type A</R:BoxType></R:bigbox> | |||
<R:author/> | <R:author><R:Name>Hadrian</R:Name></R:author> | |||
<creationdate/> | <D:creationdate>1997-12-01T17:42:21-08:00</D:creationdate> | |||
<displayname/> | <D:displayname>Example collection</D:displayname> | |||
<resourcetype/> | <D:resourcetype><D:collection/></D:resourcetype> | |||
<supportedlock/> | <D:supportedlock> | |||
</prop> | <D:lockentry> | |||
<status>HTTP/1.1 200 OK</status> | <D:lockscope><D:exclusive/></D:lockscope> | |||
</propstat> | <D:locktype><D:write/></D:locktype> | |||
</response> | </D:lockentry> | |||
<response> | <D:lockentry> | |||
<href>http://www.foo.bar/container/front.html</href> | <D:lockscope><D:shared/></D:lockscope> | |||
<propstat> | <D:locktype><D:write/></D:locktype> | |||
<prop xmlns:R="http://www.foo.bar/boxschema/"> | </D:lockentry> | |||
<R:bigbox/> | </D:supportedlock> | |||
<creationdate/> | </D:prop> | |||
<displayname/> | <D:status>HTTP/1.1 200 OK</D:status> | |||
<getcontentlength/> | </D:propstat> | |||
<getcontenttype/> | </D:response> | |||
<getetag/> | <D:response> | |||
<getlastmodified/> | <D:href>/container/front.html</D:href> | |||
<resourcetype/> | <D:propstat> | |||
<supportedlock/> | <D:prop xmlns:R="http://ns.example.com/boxschema/"> | |||
</prop> | <R:bigbox><R:BoxType>Box type B</R:BoxType> | |||
<status>HTTP/1.1 200 OK</status> | </R:bigbox> | |||
</propstat> | <D:creationdate>1997-12-01T18:27:21-08:00</D:creationdate> | |||
</response> | <D:displayname>Example HTML resource</D:displayname> | |||
</multistatus> | <D:getcontentlength>4525</D:getcontentlength> | |||
<D:getcontenttype>text/html</D:getcontenttype> | ||||
<D:getetag>"zzyzx"</D:getetag> | ||||
<D:getlastmodified | ||||
>Mon, 12 Jan 1998 09:25:56 GMT</D:getlastmodified> | ||||
<D:resourcetype/> | ||||
<D:supportedlock> | ||||
<D:lockentry> | ||||
<D:lockscope><D:exclusive/></D:lockscope> | ||||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | ||||
<D:lockentry> | ||||
<D:lockscope><D:shared/></D:lockscope> | ||||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | ||||
</D:supportedlock> | ||||
</D:prop> | ||||
<D:status>HTTP/1.1 200 OK</D:status> | ||||
In this example, PROPFIND is invoked on the collection resource | </D:propstat> | |||
http://www.foo.bar/container/, with a propfind XML element containing | </D:response> | |||
the propname XML element, meaning the name of all properties should | </D:multistatus> | |||
be returned. Since no Depth header is present, it assumes its | ||||
default value of "infinity", meaning the name of the properties on | ||||
the collection and all its progeny should be returned. | ||||
Consistent with the previous example, resource | In this example, PROPFIND was invoked on the resource | |||
http://www.foo.bar/container/ has six properties defined on it, | http://www.example.com/container/ with a Depth header of 1, meaning | |||
http://www.foo.bar/boxschema/bigbox, | the request applies to the resource and its children, and a propfind | |||
http://www.foo.bar/boxschema/author, DAV:creationdate, DAV: | XML element containing the allprop XML element, meaning the request | |||
should return the name and value of all the dead properties defined | ||||
on the resources, plus the name and value of all the properties | ||||
defined in this specification. This example illustrates the use of | ||||
relative references in the 'href' elements of the response. | ||||
The resource http://www.example.com/container/ has six properties | ||||
defined on it: 'bigbox' and 'author in the | ||||
"http://ns.example.com/boxschema/" namespace, DAV:creationdate, DAV: | ||||
displayname, DAV:resourcetype, and DAV:supportedlock. | displayname, DAV:resourcetype, and DAV:supportedlock. | |||
The resource http://www.foo.bar/container/index.html, a member of the | The last four properties are WebDAV-specific, defined in Section 15. | |||
"container" collection, has nine properties defined on it, | Since GET is not supported on this resource, the get* properties | |||
http://www.foo.bar/boxschema/bigbox, DAV:creationdate, DAV: | (e.g., DAV:getcontentlength) are not defined on this resource. The | |||
WebDAV-specific properties assert that "container" was created on | ||||
December 1, 1997, at 5:42:21PM, in a time zone 8 hours west of GMT | ||||
(DAV:creationdate), has a name of "Example collection" (DAV: | ||||
displayname), a collection resource type (DAV:resourcetype), and | ||||
supports exclusive write and shared write locks (DAV:supportedlock). | ||||
The resource http://www.example.com/container/front.html has nine | ||||
properties defined on it: | ||||
'bigbox' in the "http://ns.example.com/boxschema/" namespace (another | ||||
instance of the "bigbox" property type), DAV:creationdate, DAV: | ||||
displayname, DAV:getcontentlength, DAV:getcontenttype, DAV:getetag, | displayname, DAV:getcontentlength, DAV:getcontenttype, DAV:getetag, | |||
DAV:getlastmodified, DAV:resourcetype, and DAV:supportedlock. | DAV:getlastmodified, DAV:resourcetype, and DAV:supportedlock. | |||
This example also demonstrates the use of XML namespace scoping, and | The DAV-specific properties assert that "front.html" was created on | |||
the default namespace. Since the "xmlns" attribute does not contain | December 1, 1997, at 6:27:21PM, in a time zone 8 hours west of GMT | |||
an explicit "shorthand name" (prefix) letter, the namespace applies | (DAV:creationdate), has a name of "Example HTML resource" (DAV: | |||
by default to all enclosed elements. Hence, all elements which do | displayname), a content length of 4525 bytes (DAV:getcontentlength), | |||
not explicitly state the namespace to which they belong are members | a MIME type of "text/html" (DAV:getcontenttype), an entity tag of | |||
of the "DAV:" namespace schema. | "zzyzx" (DAV:getetag), was last modified on Monday, January 12, 1998, | |||
at 09:25:56 GMT (DAV:getlastmodified), has an empty resource type, | ||||
meaning that it is not a collection (DAV:resourcetype), and supports | ||||
both exclusive write and shared write locks (DAV:supportedlock). | ||||
8.2. PROPPATCH | 9.1.6. Example - Using 'allprop' with 'include' | |||
>>Request | ||||
PROPFIND /mycol/ HTTP/1.1 | ||||
Host: www.example.com | ||||
Depth: 1 | ||||
Content-Type: application/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | ||||
<D:propfind xmlns:D="DAV:"> | ||||
<D:allprop/> | ||||
<D:include> | ||||
<D:supported-live-property-set/> | ||||
<D:supported-report-set/> | ||||
</D:include> | ||||
</D:propfind> | ||||
In this example, PROPFIND is executed on the resource | ||||
http://www.example.com/mycol/ and its internal member resources. The | ||||
client requests the values of all live properties defined in this | ||||
specification, plus all dead properties, plus two more live | ||||
properties defined in [RFC3253]. The response is not shown. | ||||
9.2. PROPPATCH Method | ||||
The PROPPATCH method processes instructions specified in the request | The PROPPATCH method processes instructions specified in the request | |||
body to set and/or remove properties defined on the resource | body to set and/or remove properties defined on the resource | |||
identified by the Request-URI. | identified by the Request-URI. | |||
All DAV compliant resources MUST support the PROPPATCH method and | All DAV compliant resources MUST support the PROPPATCH method and | |||
MUST process instructions that are specified using the | MUST process instructions that are specified using the | |||
propertyupdate, set, and remove XML elements of the DAV schema. | propertyupdate, set, and remove XML elements. Execution of the | |||
Execution of the directives in this method is, of course, subject to | directives in this method is, of course, subject to access control | |||
access control constraints. DAV compliant resources SHOULD support | constraints. DAV compliant resources SHOULD support the setting of | |||
the setting of arbitrary dead properties. | arbitrary dead properties. | |||
The request message body of a PROPPATCH method MUST contain the | The request message body of a PROPPATCH method MUST contain the | |||
propertyupdate XML element. Instruction processing MUST occur in the | propertyupdate XML element. | |||
order instructions are received (i.e., from top to bottom). | ||||
Servers MUST process PROPPATCH instructions in document order (an | ||||
exception to the normal rule that ordering is irrelevant). | ||||
Instructions MUST either all be executed or none executed. Thus if | Instructions MUST either all be executed or none executed. Thus if | |||
any error occurs during processing all executed instructions MUST be | any error occurs during processing all executed instructions MUST be | |||
undone and a proper error result returned. Instruction processing | undone and a proper error result returned. Instruction processing | |||
details can be found in the definition of the set and remove | details can be found in the definition of the set and remove | |||
instructions in Section 12.13. | instructions in Section 14.23 and Section 14.26. | |||
8.2.1. Status Codes for use with 207 (Multi-Status) | If a server attempts to make any of the property changes in a | |||
PROPPATCH request (i.e. the request is not rejected for high-level | ||||
errors before processing the body), the response MUST be a Multi- | ||||
Status response as described in Section 9.2.1. | ||||
The following are examples of response codes one would expect to be | This method is idempotent, but not safe (see Section 9.1 of | |||
used in a 207 (Multi-Status) response for this method. Note, | [RFC2616]). Responses to this method MUST NOT be cached. | |||
however, that unless explicitly prohibited any 2/3/4/5xx series | ||||
response code may be used in a 207 (Multi-Status) response. | ||||
200 (OK) - The command succeeded. As there can be a mixture of sets | 9.2.1. Status Codes for Use in 'propstat' Element | |||
and removes in a body, a 201 (Created) seems inappropriate. | ||||
In PROPPATCH responses, information about individual properties is | ||||
returned inside 'propstat' elements (see Section 14.22), each | ||||
containing an individual 'status' element containing information | ||||
about the properties appearing in it. The list below summarizes the | ||||
most common status codes used inside 'propstat', however clients | ||||
should be prepared to handle other 2/3/4/5xx series status codes as | ||||
well. | ||||
200 (OK) - The property set or change succeeded. Note that if this | ||||
appears for one property, it appears for every property in the | ||||
response, due to the atomicity of PROPPATCH. | ||||
403 (Forbidden) - The client, for reasons the server chooses not to | 403 (Forbidden) - The client, for reasons the server chooses not to | |||
specify, cannot alter one of the properties. | specify, cannot alter one of the properties. | |||
403 (Forbidden): The client has attempted to set a protected | ||||
property, such as DAV:getetag. If returning this error, the server | ||||
SHOULD use the precondition code 'cannot-modify-protected-property' | ||||
inside the response body. | ||||
409 (Conflict) - The client has provided a value whose semantics are | 409 (Conflict) - The client has provided a value whose semantics are | |||
not appropriate for the property. This includes trying to set read- | not appropriate for the property. | |||
only properties. | ||||
423 (Locked) - The specified resource is locked and the client either | 424 (Failed Dependency) - The property change could not be made | |||
is not a lock owner or the lock type requires a lock token to be | because of another property change that failed. | |||
submitted and the client did not submit it. | ||||
507 (Insufficient Storage) - The server did not have sufficient space | 507 (Insufficient Storage) - The server did not have sufficient space | |||
to record the property. | to record the property. | |||
8.2.2. Example - PROPPATCH | 9.2.2. Example - PROPPATCH | |||
>>Request | >>Request | |||
PROPPATCH /bar.html HTTP/1.1 | PROPPATCH /bar.html HTTP/1.1 | |||
Host: www.foo.com | Host: www.example.com | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propertyupdate xmlns:D="DAV:" | <D:propertyupdate xmlns:D="DAV:" | |||
xmlns:Z="http://www.w3.com/standards/z39.50/"> | xmlns:Z="http://ns.example.com/standards/z39.50/"> | |||
<D:set> | <D:set> | |||
<D:prop> | <D:prop> | |||
<Z:authors> | <Z:Authors> | |||
<Z:Author>Jim Whitehead</Z:Author> | <Z:Author>Jim Whitehead</Z:Author> | |||
<Z:Author>Roy Fielding</Z:Author> | <Z:Author>Roy Fielding</Z:Author> | |||
</Z:authors> | </Z:Authors> | |||
</D:prop> | </D:prop> | |||
</D:set> | </D:set> | |||
<D:remove> | <D:remove> | |||
<D:prop><Z:Copyright-Owner/></D:prop> | <D:prop><Z:Copyright-Owner/></D:prop> | |||
</D:remove> | </D:remove> | |||
</D:propertyupdate> | </D:propertyupdate> | |||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:" | <D:multistatus xmlns:D="DAV:" | |||
xmlns:Z="http://www.w3.com/standards/z39.50"> | xmlns:Z="http://ns.example.com/standards/z39.50/"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.foo.com/bar.html</D:href> | <D:href>http://www.example.com/bar.html</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop><Z:Authors/></D:prop> | <D:prop><Z:Authors/></D:prop> | |||
<D:status>HTTP/1.1 424 Failed Dependency</D:status> | <D:status>HTTP/1.1 424 Failed Dependency</D:status> | |||
</D:propstat> | </D:propstat> | |||
<D:propstat> | <D:propstat> | |||
<D:prop><Z:Copyright-Owner/></D:prop> | <D:prop><Z:Copyright-Owner/></D:prop> | |||
<D:status>HTTP/1.1 409 Conflict</D:status> | <D:status>HTTP/1.1 409 Conflict</D:status> | |||
</D:propstat> | </D:propstat> | |||
<D:responsedescription> Copyright Owner can not be deleted or | <D:responsedescription> Copyright Owner can not be deleted or | |||
altered.</D:responsedescription> | altered.</D:responsedescription> | |||
</D:response> | </D:response> | |||
</D:multistatus> | </D:multistatus> | |||
In this example, the client requests the server to set the value of | In this example, the client requests the server to set the value of | |||
the http://www.w3.com/standards/z39.50/Authors property, and to | the "Authors" property in the | |||
remove the property | "http://ns.example.com/standards/z39.50/" namespace, and to remove | |||
http://www.w3.com/standards/z39.50/Copyright-Owner. Since the | the property "Copyright-Owner" in the same namespace. Since the | |||
Copyright-Owner property could not be removed, no property | Copyright-Owner property could not be removed, no property | |||
modifications occur. The 424 (Failed Dependency) status code for the | modifications occur. The 424 (Failed Dependency) status code for the | |||
Authors property indicates this action would have succeeded if it | Authors property indicates this action would have succeeded if it | |||
were not for the conflict with removing the Copyright-Owner property. | were not for the conflict with removing the Copyright-Owner property. | |||
8.3. MKCOL Method | 9.3. MKCOL Method | |||
The MKCOL method is used to create a new collection. All DAV | ||||
compliant resources MUST support the MKCOL method. | ||||
8.3.1. Request | ||||
MKCOL creates a new collection resource at the location specified by | MKCOL creates a new collection resource at the location specified by | |||
the Request-URI. If the resource identified by the Request-URI is | the Request-URI. If the Request-URI is already mapped to a resource | |||
non-null then the MKCOL MUST fail. During MKCOL processing, a server | then the MKCOL MUST fail. During MKCOL processing, a server MUST | |||
MUST make the Request-URI a member of its parent collection, unless | make the Request-URI an internal member of its parent collection, | |||
the Request-URI is "/". If no such ancestor exists, the method MUST | unless the Request-URI is "/". If no such ancestor exists, the | |||
fail. When the MKCOL operation creates a new collection resource, | method MUST fail. When the MKCOL operation creates a new collection | |||
all ancestors MUST already exist, or the method MUST fail with a 409 | resource, all ancestors MUST already exist, or the method MUST fail | |||
(Conflict) status code. For example, if a request to create | with a 409 (Conflict) status code. For example, if a request to | |||
collection /a/b/c/d/ is made, and neither /a/b/ nor /a/b/c/ exists, | create collection /a/b/c/d/ is made, and /a/b/c/ does not exist, the | |||
the request must fail. | request must fail. | |||
When MKCOL is invoked without a request body, the newly created | When MKCOL is invoked without a request body, the newly created | |||
collection SHOULD have no members. | collection SHOULD have no members. | |||
A MKCOL request message may contain a message body. The behavior of | A MKCOL request message may contain a message body. The precise | |||
a MKCOL request when the body is present is limited to creating | behavior of a MKCOL request when the body is present is undefined, | |||
collections, members of a collection, bodies of members and | but limited to creating collections, members of a collection, bodies | |||
properties on the collections or members. If the server receives a | of members and properties on the collections or members. If the | |||
MKCOL request entity type it does not support or understand it MUST | server receives a MKCOL request entity type it does not support or | |||
respond with a 415 (Unsupported Media Type) status code. The exact | understand it MUST respond with a 415 (Unsupported Media Type) status | |||
behavior of MKCOL for various request media types is undefined in | code. If the server decides to reject the request based on the | |||
this document, and will be specified in separate documents. | presence of an entity or the type of an entity, it should use the 415 | |||
(Unsupported Media Type) status code. | ||||
8.3.2. Status Codes | This method is idempotent, but not safe (see Section 9.1 of | |||
[RFC2616]). Responses to this method MUST NOT be cached. | ||||
Responses from a MKCOL request MUST NOT be cached as MKCOL has non- | 9.3.1. MKCOL Status Codes | |||
idempotent semantics. | ||||
201 (Created) - The collection or structured resource was created in | In addition to the general status codes possible, the following | |||
its entirety. | status codes have specific applicability to MKCOL: | |||
201 (Created) - The collection was created. | ||||
403 (Forbidden) - This indicates at least one of two conditions: 1) | 403 (Forbidden) - This indicates at least one of two conditions: 1) | |||
the server does not allow the creation of collections at the given | the server does not allow the creation of collections at the given | |||
location in its namespace, or 2) the parent collection of the | location in its URL namespace, or 2) the parent collection of the | |||
Request-URI exists but cannot accept members. | Request-URI exists but cannot accept members. | |||
405 (Method Not Allowed) - MKCOL can only be executed on a deleted/ | 405 (Method Not Allowed) - MKCOL can only be executed on an unmapped | |||
non-existent resource. | URL. | |||
409 (Conflict) - A collection cannot be made at the Request-URI until | 409 (Conflict) - A collection cannot be made at the Request-URI until | |||
one or more intermediate collections have been created. | one or more intermediate collections have been created. The server | |||
MUST NOT create those intermediate collections automatically. | ||||
415 (Unsupported Media Type)- The server does not support the request | 415 (Unsupported Media Type) - The server does not support the | |||
type of the body. | request body type (although bodies are legal on MKCOL requests, since | |||
this specification doesn't define any, the server is likely not to | ||||
support any given body type). | ||||
507 (Insufficient Storage) - The resource does not have sufficient | 507 (Insufficient Storage) - The resource does not have sufficient | |||
space to record the state of the resource after the execution of this | space to record the state of the resource after the execution of this | |||
method. | method. | |||
8.3.3. Example - MKCOL | 9.3.2. Example - MKCOL | |||
This example creates a collection called /webdisc/xfiles/ on the | This example creates a collection called /webdisc/xfiles/ on the | |||
server www.server.org. | server www.example.com. | |||
>>Request | >>Request | |||
MKCOL /webdisc/xfiles/ HTTP/1.1 | MKCOL /webdisc/xfiles/ HTTP/1.1 | |||
Host: www.server.org | Host: www.example.com | |||
>>Response | >>Response | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
8.4. GET, HEAD for Collections | 9.4. GET, HEAD for Collections | |||
The semantics of GET are unchanged when applied to a collection, | The semantics of GET are unchanged when applied to a collection, | |||
since GET is defined as, "retrieve whatever information (in the form | since GET is defined as, "retrieve whatever information (in the form | |||
of an entity) is identified by the Request-URI" [RFC2068]. GET when | of an entity) is identified by the Request-URI" [RFC2616]. GET when | |||
applied to a collection may return the contents of an "index.html" | applied to a collection may return the contents of an "index.html" | |||
resource, a human-readable view of the contents of the collection, or | resource, a human-readable view of the contents of the collection, or | |||
something else altogether. Hence it is possible that the result of a | something else altogether. Hence it is possible that the result of a | |||
GET on a collection will bear no correlation to the membership of the | GET on a collection will bear no correlation to the membership of the | |||
collection. | collection. | |||
Similarly, since the definition of HEAD is a GET without a response | Similarly, since the definition of HEAD is a GET without a response | |||
message body, the semantics of HEAD are unmodified when applied to | message body, the semantics of HEAD are unmodified when applied to | |||
collection resources. | collection resources. | |||
8.5. POST for Collections | 9.5. POST for Collections | |||
Since by definition the actual function performed by POST is | Since by definition the actual function performed by POST is | |||
determined by the server and often depends on the particular | determined by the server and often depends on the particular | |||
resource, the behavior of POST when applied to collections cannot be | resource, the behavior of POST when applied to collections cannot be | |||
meaningfully modified because it is largely undefined. Thus the | meaningfully modified because it is largely undefined. Thus the | |||
semantics of POST are unmodified when applied to a collection. | semantics of POST are unmodified when applied to a collection. | |||
8.6. DELETE | 9.6. DELETE Requirements | |||
8.6.1. DELETE for Non-Collection Resources | DELETE is defined in [RFC2616], Section 9.7, to "delete the resource | |||
identified by the Request-URI". However, WebDAV changes some DELETE | ||||
handling requirements. | ||||
If the DELETE method is issued to a non-collection resource whose | A server processing a successful DELETE request: | |||
URIs are an internal member of one or more collections, then during | ||||
DELETE processing a server MUST remove any URI for the resource | ||||
identified by the Request-URI from collections which contain it as a | ||||
member. | ||||
8.6.2. DELETE for Collections | MUST destroy locks rooted on the deleted resource | |||
MUST remove the mapping from the Request-URI to any resource. | ||||
Thus, after a successful DELETE operation (and in the absence of | ||||
other actions) a subsequent GET/HEAD/PROPFIND request to the target | ||||
Request-URI MUST return 404 (Not Found). | ||||
9.6.1. DELETE for Collections | ||||
The DELETE method on a collection MUST act as if a "Depth: infinity" | The DELETE method on a collection MUST act as if a "Depth: infinity" | |||
header was used on it. A client MUST NOT submit a Depth header with | header was used on it. A client MUST NOT submit a Depth header with | |||
a DELETE on a collection with any value but infinity. | a DELETE on a collection with any value but infinity. | |||
DELETE instructs that the collection specified in the Request-URI and | DELETE instructs that the collection specified in the Request-URI and | |||
all resources identified by its internal member URIs are to be | all resources identified by its internal member URLs are to be | |||
deleted. | deleted. | |||
If any resource identified by a member URI cannot be deleted then all | If any resource identified by a member URL cannot be deleted then all | |||
of the member's ancestors MUST NOT be deleted, so as to maintain | of the member's ancestors MUST NOT be deleted, so as to maintain URL | |||
namespace consistency. | namespace consistency. | |||
Any headers included with DELETE MUST be applied in processing every | Any headers included with DELETE MUST be applied in processing every | |||
resource to be deleted. | resource to be deleted. | |||
When the DELETE method has completed processing it MUST result in a | When the DELETE method has completed processing it MUST result in a | |||
consistent namespace. | consistent URL namespace. | |||
If an error occurs with a resource other than the resource identified | If an error occurs deleting a member resource (a resource other than | |||
in the Request-URI then the response MUST be a 207 (Multi-Status). | the resource identified in the Request-URI) then the response can be | |||
424 (Failed Dependency) errors SHOULD NOT be in the 207 (Multi- | a 207 (Multi-Status). Multi-Status is used here to indicate which | |||
Status). They can be safely left out because the client will know | internal resources could NOT be deleted, including an error code | |||
that the ancestors of a resource could not be deleted when the client | which should help the client understand which resources caused the | |||
receives an error for the ancestor's progeny. Additionally 204 (No | failure. For example, the Multi-Status body could include a response | |||
Content) errors SHOULD NOT be returned in the 207 (Multi-Status). | with status 423 (Locked) if an internal resource was locked. | |||
The reason for this prohibition is that 204 (No Content) is the | ||||
default success code. | ||||
8.6.2.1. Example - DELETE | The server MAY return a 4xx status response, rather than a 207, if | |||
the request failed completely. | ||||
424 (Failed Dependency) status codes SHOULD NOT be in the 207 (Multi- | ||||
Status) response for DELETE. They can be safely left out because the | ||||
client will know that the ancestors of a resource could not be | ||||
deleted when the client receives an error for the ancestor's progeny. | ||||
Additionally 204 (No Content) errors SHOULD NOT be returned in the | ||||
207 (Multi-Status). The reason for this prohibition is that 204 (No | ||||
Content) is the default success code. | ||||
9.6.2. Example - DELETE | ||||
>>Request | >>Request | |||
DELETE /container/ HTTP/1.1 | DELETE /container/ HTTP/1.1 | |||
Host: www.foo.bar | Host: www.example.com | |||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<d:multistatus xmlns:d="DAV:"> | <d:multistatus xmlns:d="DAV:"> | |||
<d:response> | <d:response> | |||
<d:href>http://www.foo.bar/container/resource3</d:href> | <d:href>http://www.example.com/container/resource3</d:href> | |||
<d:status>HTTP/1.1 423 Locked</d:status> | <d:status>HTTP/1.1 423 Locked</d:status> | |||
</d:response> | <d:error><d:lock-token-submitted/></d:error> | |||
</d:multistatus> | </d:response> | |||
</d:multistatus> | ||||
In this example the attempt to delete | In this example the attempt to delete | |||
http://www.foo.bar/container/resource3 failed because it is locked, | http://www.example.com/container/resource3 failed because it is | |||
and no lock token was submitted with the request. Consequently, the | locked, and no lock token was submitted with the request. | |||
attempt to delete http://www.foo.bar/container/ also failed. Thus | Consequently, the attempt to delete http://www.example.com/container/ | |||
the client knows that the attempt to delete | also failed. Thus the client knows that the attempt to delete | |||
http://www.foo.bar/container/ must have also failed since the parent | http://www.example.com/container/ must have also failed since the | |||
can not be deleted unless its child has also been deleted. Even | parent can not be deleted unless its child has also been deleted. | |||
though a Depth header has not been included, a depth of infinity is | Even though a Depth header has not been included, a depth of infinity | |||
assumed because the method is on a collection. | is assumed because the method is on a collection. | |||
8.7. PUT | 9.7. PUT Requirements | |||
8.7.1. PUT for Non-Collection Resources | 9.7.1. PUT for Non-Collection Resources | |||
A PUT performed on an existing resource replaces the GET response | A PUT performed on an existing resource replaces the GET response | |||
entity of the resource. Properties defined on the resource may be | entity of the resource. Properties defined on the resource may be | |||
recomputed during PUT processing but are not otherwise affected. For | recomputed during PUT processing but are not otherwise affected. For | |||
example, if a server recognizes the content type of the request body, | example, if a server recognizes the content type of the request body, | |||
it may be able to automatically extract information that could be | it may be able to automatically extract information that could be | |||
profitably exposed as properties. | profitably exposed as properties. | |||
A PUT that would result in the creation of a resource without an | A PUT that would result in the creation of a resource without an | |||
appropriately scoped parent collection MUST fail with a 409 | appropriately scoped parent collection MUST fail with a 409 | |||
(Conflict). | (Conflict). | |||
8.7.2. PUT for Collections | A PUT request allows a client to indicate what media type an entity | |||
body has, and whether it should change if overwritten. Thus, a | ||||
client SHOULD provide a Content-Type for a new resource if any is | ||||
known. If the client does not provide a Content-Type for a new | ||||
resource, the server MAY create a resource with no Content-Type | ||||
assigned, or it MAY attempt to assign a Content-Type. | ||||
As defined in the HTTP/1.1 specification [RFC2068], the "PUT method | Note that although a recipient ought generally to treat metadata | |||
requests that the enclosed entity be stored under the supplied | supplied with an HTTP request as authoritative, in practice there's | |||
Request-URI." Since submission of an entity representing a | no guarantee that a server will accept client-supplied metadata (e.g. | |||
collection would implicitly encode creation and deletion of | any request header beginning with "Content-"). Many servers do not | |||
resources, this specification intentionally does not define a | allow configuring the Content-Type on a per-resource basis in the | |||
transmission format for creating a collection using PUT. Instead, | first place. Thus, clients can't always rely on the ability to | |||
the MKCOL method is defined to create collections. | directly influence the content type by including a Content-Type | |||
request header. | ||||
When the PUT operation creates a new non-collection resource all | 9.7.2. PUT for Collections | |||
ancestors MUST already exist. If all ancestors do not exist, the | ||||
method MUST fail with a 409 (Conflict) status code. For example, if | ||||
resource /a/b/c/d.html is to be created and /a/b/c/ does not exist, | ||||
then the request must fail. | ||||
8.8. COPY Method | This specification does not define the behavior of the PUT method for | |||
existing collections. A PUT request to an existing collection MAY be | ||||
treated as an error (405 Method Not Allowed). | ||||
The COPY method creates a duplicate of the source resource, | The MKCOL method is defined to create collections. | |||
identified by the Request-URI, in the destination resource, | ||||
identified by the URI in the Destination header. The Destination | 9.8. COPY Method | |||
header MUST be present. The exact behavior of the COPY method | ||||
depends on the type of the source resource. | The COPY method creates a duplicate of the source resource identified | |||
by the Request-URI, in the destination resource identified by the URI | ||||
in the Destination header. The Destination header MUST be present. | ||||
The exact behavior of the COPY method depends on the type of the | ||||
source resource. | ||||
All WebDAV compliant resources MUST support the COPY method. | All WebDAV compliant resources MUST support the COPY method. | |||
However, support for the COPY method does not guarantee the ability | However, support for the COPY method does not guarantee the ability | |||
to copy a resource. For example, separate programs may control | to copy a resource. For example, separate programs may control | |||
resources on the same server. As a result, it may not be possible to | resources on the same server. As a result, it may not be possible to | |||
copy a resource to a location that appears to be on the same server. | copy a resource to a location that appears to be on the same server. | |||
8.8.1. COPY for HTTP/1.1 resources | This method is idempotent, but not safe (see Section 9.1 of | |||
[RFC2616]). Responses to this method MUST NOT be cached. | ||||
9.8.1. COPY for Non-collection Resources | ||||
When the source resource is not a collection the result of the COPY | When the source resource is not a collection the result of the COPY | |||
method is the creation of a new resource at the destination whose | method is the creation of a new resource at the destination whose | |||
state and behavior match that of the source resource as closely as | state and behavior match that of the source resource as closely as | |||
possible. After a successful COPY invocation, all properties on the | possible. Since the environment at the destination may be different | |||
source resource MUST be duplicated on the destination resource, | than at the source due to factors outside the scope of control of the | |||
subject to modifying headers and XML elements, following the | server, such as the absence of resources required for correct | |||
definition for copying properties. Since the environment at the | operation, it may not be possible to completely duplicate the | |||
destination may be different than at the source due to factors | behavior of the resource at the destination. Subsequent alterations | |||
outside the scope of control of the server, such as the absence of | to the destination resource will not modify the source resource. | |||
resources required for correct operation, it may not be possible to | Subsequent alterations to the source resource will not modify the | |||
completely duplicate the behavior of the resource at the destination. | destination resource. | |||
Subsequent alterations to the destination resource will not modify | ||||
the source resource. Subsequent alterations to the source resource | ||||
will not modify the destination resource. | ||||
8.8.2. COPY for Properties | ||||
The following section defines how properties on a resource are | 9.8.2. COPY for Properties | |||
handled during a COPY operation. | ||||
Live properties SHOULD be duplicated as identically behaving live | After a successful COPY invocation, all dead properties on the source | |||
properties at the destination resource. If a property cannot be | resource SHOULD be duplicated on the destination resource. Live | |||
copied live, then its value MUST be duplicated, octet-for-octet, in | properties described in this document SHOULD be duplicated as | |||
an identically named, dead property on the destination resource | identically behaving live properties at the destination resource, but | |||
subject to the effects of the propertybehavior XML element. | not necessarily with the same values. Servers SHOULD NOT convert | |||
live properties into dead properties on the destination resource, | ||||
because clients may then draw incorrect conclusions about the state | ||||
or functionality of a resource. Note that some live properties are | ||||
defined such that the absence of the property has a specific meaning | ||||
(e.g. a flag with one meaning if present and the opposite if absent), | ||||
and in these cases, a successful COPY might result in the property | ||||
being reported as "Not Found" in subsequent requests. | ||||
The propertybehavior XML element can specify that properties are | When the destination is an unmapped URL, a COPY operation creates a | |||
copied on best effort, that all live properties must be successfully | new resource much like a PUT operation does. Live properties which | |||
copied or the method must fail, or that a specified list of live | are related to resource creation (such as DAV:creationdate) should | |||
properties must be successfully copied or the method must fail. The | have their values set accordingly. | |||
propertybehavior XML element is defined in Section 12.12. | ||||
8.8.3. COPY for Collections | 9.8.3. COPY for Collections | |||
The COPY method on a collection without a Depth header MUST act as if | The COPY method on a collection without a Depth header MUST act as if | |||
a Depth header with value "infinity" was included. A client may | a Depth header with value "infinity" was included. A client may | |||
submit a Depth header on a COPY on a collection with a value of "0" | submit a Depth header on a COPY on a collection with a value of "0" | |||
or "infinity". DAV compliant servers MUST support the "0" and | or "infinity". Servers MUST support the "0" and "infinity" Depth | |||
"infinity" Depth header behaviors. | header behaviors on WebDAV-compliant resources. | |||
A COPY of depth infinity instructs that the collection resource | An infinite depth COPY instructs that the collection resource | |||
identified by the Request-URI is to be copied to the location | identified by the Request-URI is to be copied to the location | |||
identified by the URI in the Destination header, and all its internal | identified by the URI in the Destination header, and all its internal | |||
member resources are to be copied to a location relative to it, | member resources are to be copied to a location relative to it, | |||
recursively through all levels of the collection hierarchy. | recursively through all levels of the collection hierarchy. Note | |||
that an infinite depth COPY of /A/ into /A/B/ could lead to infinite | ||||
recursion if not handled correctly. | ||||
A COPY of "Depth: 0" only instructs that the collection and its | A COPY of "Depth: 0" only instructs that the collection and its | |||
properties but not resources identified by its internal member URIs, | properties but not resources identified by its internal member URLs, | |||
are to be copied. | are to be copied. | |||
Any headers included with a COPY MUST be applied in processing every | Any headers included with a COPY MUST be applied in processing every | |||
resource to be copied with the exception of the Destination header. | resource to be copied with the exception of the Destination header. | |||
The Destination header only specifies the destination URI for the | The Destination header only specifies the destination URI for the | |||
Request-URI. When applied to members of the collection identified by | Request-URI. When applied to members of the collection identified by | |||
the Request-URI the value of Destination is to be modified to reflect | the Request-URI the value of Destination is to be modified to reflect | |||
the current location in the hierarchy. So, if the Request- URI is | the current location in the hierarchy. So, if the Request-URI is /a/ | |||
/a/ with Host header value http://fun.com/ and the Destination is | with Host header value http://example.com/ and the Destination is | |||
http://fun.com/b/ then when http://fun.com/a/c/d is processed it must | http://example.com/b/ then when http://example.com/a/c/d is processed | |||
use a Destination of http://fun.com/b/c/d. | it must use a Destination of http://example.com/b/c/d. | |||
When the COPY method has completed processing it MUST have created a | When the COPY method has completed processing it MUST have created a | |||
consistent namespace at the destination (see Section 5.1 for the | consistent URL namespace at the destination (see Section 5.1 for the | |||
definition of namespace consistency). However, if an error occurs | definition of namespace consistency). However, if an error occurs | |||
while copying an internal collection, the server MUST NOT copy any | while copying an internal collection, the server MUST NOT copy any | |||
resources identified by members of this collection (i.e., the server | resources identified by members of this collection (i.e., the server | |||
must skip this subtree), as this would create an inconsistent | must skip this subtree), as this would create an inconsistent | |||
namespace. After detecting an error, the COPY operation SHOULD try | namespace. After detecting an error, the COPY operation SHOULD try | |||
to finish as much of the original copy operation as possible (i.e., | to finish as much of the original copy operation as possible (i.e., | |||
the server should still attempt to copy other subtrees and their | the server should still attempt to copy other subtrees and their | |||
members, that are not descendents of an error-causing collection). | members, that are not descendents of an error-causing collection). | |||
So, for example, if an infinite depth copy operation is performed on | So, for example, if an infinite depth copy operation is performed on | |||
collection /a/, which contains collections /a/b/ and /a/c/, and an | collection /a/, which contains collections /a/b/ and /a/c/, and an | |||
error occurs copying /a/b/, an attempt should still be made to copy | error occurs copying /a/b/, an attempt should still be made to copy | |||
/a/c/. Similarly, after encountering an error copying a non- | /a/c/. Similarly, after encountering an error copying a non- | |||
collection resource as part of an infinite depth copy, the server | collection resource as part of an infinite depth copy, the server | |||
SHOULD try to finish as much of the original copy operation as | SHOULD try to finish as much of the original copy operation as | |||
possible. | possible. | |||
If an error in executing the COPY method occurs with a resource other | If an error in executing the COPY method occurs with a resource other | |||
than the resource identified in the Request-URI then the response | than the resource identified in the Request-URI then the response | |||
MUST be a 207 (Multi-Status). | MUST be a 207 (Multi-Status), and the URL of the resource causing the | |||
failure MUST appear with the specific error. | ||||
The 424 (Failed Dependency) status code SHOULD NOT be returned in the | The 424 (Failed Dependency) status code SHOULD NOT be returned in the | |||
207 (Multi-Status) response from a COPY method. These responses can | 207 (Multi-Status) response from a COPY method. These responses can | |||
be safely omitted because the client will know that the progeny of a | be safely omitted because the client will know that the progeny of a | |||
resource could not be copied when the client receives an error for | resource could not be copied when the client receives an error for | |||
the parent. Additionally 201 (Created)/204 (No Content) status codes | the parent. Additionally 201 (Created)/204 (No Content) status codes | |||
SHOULD NOT be returned as values in 207 (Multi-Status) responses from | SHOULD NOT be returned as values in 207 (Multi-Status) responses from | |||
COPY methods. They, too, can be safely omitted because they are the | COPY methods. They, too, can be safely omitted because they are the | |||
default success codes. | default success codes. | |||
8.8.4. COPY and the Overwrite Header | 9.8.4. COPY and Overwriting Destination Resources | |||
If a resource exists at the destination and the Overwrite header is | If a COPY request has an Overwrite header with a value of "F", and a | |||
"T" then prior to performing the copy the server MUST perform a | resource exists at the Destination URL, the server MUST fail the | |||
DELETE with "Depth: infinity" on the destination resource. If the | request. | |||
Overwrite header is set to "F" then the operation will fail. | ||||
8.8.5. Status Codes | When a server executes a COPY request and overwrites a destination | |||
resource, the exact behavior MAY depend on many factors, including | ||||
WebDAV extension capabilities (see particularly [RFC3253]). For | ||||
example, when an ordinary resource is overwritten, the server could | ||||
delete the target resource before doing the copy, or could do an in- | ||||
place overwrite to preserve live properties. | ||||
When a collection is overwritten, the membership of the destination | ||||
collection after the successful COPY request MUST be the same | ||||
membership as the source collection immediately before the COPY. | ||||
Thus, merging the membership of the source and destination | ||||
collections together in the destination is not a compliant behavior. | ||||
In general, if clients require the state of the destination URL to be | ||||
wiped out prior to a COPY (e.g. to force live properties to be | ||||
reset), then the client could send a DELETE to the destination before | ||||
the COPY request to ensure this reset. | ||||
9.8.5. Status Codes | ||||
In addition to the general status codes possible, the following | ||||
status codes have specific applicability to COPY: | ||||
201 (Created) - The source resource was successfully copied. The | 201 (Created) - The source resource was successfully copied. The | |||
copy operation resulted in the creation of a new resource. | COPY operation resulted in the creation of a new resource. | |||
204 (No Content) - The source resource was successfully copied to a | 204 (No Content) - The source resource was successfully copied to a | |||
pre-existing destination resource. | pre-existing destination resource. | |||
403 (Forbidden) - The source and destination URIs are the same. | 207 (Multi-Status) - Multiple resources were to be affected by the | |||
COPY, but errors on some of them prevented the operation from taking | ||||
place. Specific error messages, together with the most appropriate | ||||
of the source and destination URLs, appear in the body of the multi- | ||||
status response. E.g. if a destination resource was locked and could | ||||
not be overwritten, then the destination resource URL appears with | ||||
the 423 (Locked) status. | ||||
403 (Forbidden) - The operation is forbidden. A special case for | ||||
COPY could be that the source and destination resources are the same | ||||
resource. | ||||
409 (Conflict) - A resource cannot be created at the destination | 409 (Conflict) - A resource cannot be created at the destination | |||
until one or more intermediate collections have been created. | until one or more intermediate collections have been created. The | |||
server MUST NOT create those intermediate collections automatically. | ||||
412 (Precondition Failed) - The server was unable to maintain the | 412 (Precondition Failed) - A precondition header check failed, e.g. | |||
liveness of the properties listed in the propertybehavior XML element | the Overwrite header is "F" and the destination URL is already mapped | |||
or the Overwrite header is "F" and the state of the destination | to a resource. | |||
resource is non-null. | ||||
423 (Locked) - The destination resource was locked. | 423 (Locked) - The destination resource, or resource within the | |||
destination collection, was locked. This response SHOULD contain the | ||||
'lock-token-submitted' precondition element. | ||||
502 (Bad Gateway) - This may occur when the destination is on another | 502 (Bad Gateway) - This may occur when the destination is on another | |||
server and the destination server refuses to accept the resource. | server, repository or URL namespace. Either the source namespace | |||
does not support copying to the destination namespace, or the | ||||
destination namespace refuses to accept the resource. The client may | ||||
wish to try GET/PUT and PROPFIND/PROPPATCH instead. | ||||
507 (Insufficient Storage) - The destination resource does not have | 507 (Insufficient Storage) - The destination resource does not have | |||
sufficient space to record the state of the resource after the | sufficient space to record the state of the resource after the | |||
execution of this method. | execution of this method. | |||
8.8.6. Example - COPY with Overwrite | 9.8.6. Example - COPY with Overwrite | |||
This example shows resource | This example shows resource | |||
http://www.ics.uci.edu/~fielding/index.html being copied to the | http://www.example.com/~fielding/index.html being copied to the | |||
location http://www.ics.uci.edu/users/f/fielding/index.html. The 204 | location http://www.example.com/users/f/fielding/index.html. The 204 | |||
(No Content) status code indicates the existing resource at the | (No Content) status code indicates the existing resource at the | |||
destination was overwritten. | destination was overwritten. | |||
>>Request | >>Request | |||
COPY /~fielding/index.html HTTP/1.1 | COPY /~fielding/index.html HTTP/1.1 | |||
Host: www.ics.uci.edu | Host: www.example.com | |||
Destination: http://www.ics.uci.edu/users/f/fielding/index.html | Destination: http://www.example.com/users/f/fielding/index.html | |||
>>Response | >>Response | |||
HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
8.8.7. Example - COPY with No Overwrite | 9.8.7. Example - COPY with No Overwrite | |||
The following example shows the same copy operation being performed, | The following example shows the same copy operation being performed, | |||
but with the Overwrite header set to "F." A response of 412 | but with the Overwrite header set to "F." A response of 412 | |||
(Precondition Failed) is returned because the destination resource | (Precondition Failed) is returned because the destination URL is | |||
has a non-null state. | already mapped to a resource. | |||
>>Request | >>Request | |||
COPY /~fielding/index.html HTTP/1.1 | COPY /~fielding/index.html HTTP/1.1 | |||
Host: www.ics.uci.edu | Host: www.example.com | |||
Destination: http://www.ics.uci.edu/users/f/fielding/index.html | Destination: http://www.example.com/users/f/fielding/index.html | |||
Overwrite: F | Overwrite: F | |||
>>Response | >>Response | |||
HTTP/1.1 412 Precondition Failed | HTTP/1.1 412 Precondition Failed | |||
8.8.8. Example - COPY of a Collection | 9.8.8. Example - COPY of a Collection | |||
>>Request | >>Request | |||
COPY /container/ HTTP/1.1 | COPY /container/ HTTP/1.1 | |||
Host: www.foo.bar | Host: www.example.com | |||
Destination: http://www.foo.bar/othercontainer/ | Destination: http://www.example.com/othercontainer/ | |||
Depth: infinity | Depth: infinity | |||
Content-Type: text/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | ||||
<d:propertybehavior xmlns:d="DAV:"> | ||||
<d:keepalive>*</d:keepalive> | ||||
</d:propertybehavior> | ||||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<d:multistatus xmlns:d="DAV:"> | ||||
<d:response> | <d:multistatus xmlns:d="DAV:"> | |||
<d:href>http://www.foo.bar/othercontainer/R2/</d:href> | <d:response> | |||
<d:status>HTTP/1.1 412 Precondition Failed</d:status> | <d:href>http://www.example.com/othercontainer/R2/</d:href> | |||
</d:response> | <d:status>HTTP/1.1 423 Locked</d:status> | |||
</d:multistatus> | <d:error><d:lock-token-submitted/></d:error> | |||
</d:response> | ||||
</d:multistatus> | ||||
The Depth header is unnecessary as the default behavior of COPY on a | The Depth header is unnecessary as the default behavior of COPY on a | |||
collection is to act as if a "Depth: infinity" header had been | collection is to act as if a "Depth: infinity" header had been | |||
submitted. In this example most of the resources, along with the | submitted. In this example most of the resources, along with the | |||
collection, were copied successfully. However the collection R2 | collection, were copied successfully. However the collection R2 | |||
failed, most likely due to a problem with maintaining the liveness of | failed because the destination R2 is locked. Because there was an | |||
properties (this is specified by the propertybehavior XML element). | error copying R2, none of R2's members were copied. However no | |||
Because there was an error copying R2, none of R2's members were | errors were listed for those members due to the error minimization | |||
copied. However no errors were listed for those members due to the | rules. | |||
error minimization rules given in Section 8.8.3. | ||||
8.9. MOVE Method | 9.9. MOVE Method | |||
The MOVE operation on a non-collection resource is the logical | The MOVE operation on a non-collection resource is the logical | |||
equivalent of a copy (COPY), followed by consistency maintenance | equivalent of a copy (COPY), followed by consistency maintenance | |||
processing, followed by a delete of the source, where all three | processing, followed by a delete of the source, where all three | |||
actions are performed atomically. The consistency maintenance step | actions are performed in a single operation. The consistency | |||
allows the server to perform updates caused by the move, such as | maintenance step allows the server to perform updates caused by the | |||
updating all URIs other than the Request-URI which identify the | move, such as updating all URLs other than the Request-URI which | |||
source resource, to point to the new destination resource. | identify the source resource, to point to the new destination | |||
Consequently, the Destination header MUST be present on all MOVE | resource. | |||
methods and MUST follow all COPY requirements for the COPY part of | ||||
the MOVE method. All DAV compliant resources MUST support the MOVE | ||||
method. However, support for the MOVE method does not guarantee the | ||||
ability to move a resource to a particular destination. | ||||
For example, separate programs may actually control different sets of | The Destination header MUST be present on all MOVE methods and MUST | |||
resources on the same server. Therefore, it may not be possible to | follow all COPY requirements for the COPY part of the MOVE method. | |||
move a resource within a namespace that appears to belong to the same | All WebDAV compliant resources MUST support the MOVE method. | |||
server. | ||||
Support for the MOVE method does not guarantee the ability to move a | ||||
resource to a particular destination. For example, separate programs | ||||
may actually control different sets of resources on the same server. | ||||
Therefore, it may not be possible to move a resource within a | ||||
namespace that appears to belong to the same server. | ||||
If a resource exists at the destination, the destination resource | If a resource exists at the destination, the destination resource | |||
will be DELETEd as a side-effect of the MOVE operation, subject to | will be deleted as a side-effect of the MOVE operation, subject to | |||
the restrictions of the Overwrite header. | the restrictions of the Overwrite header. | |||
8.9.1. MOVE for Properties | This method is idempotent, but not safe (see Section 9.1 of | |||
[RFC2616]). Responses to this method MUST NOT be cached. | ||||
The behavior of properties on a MOVE, including the effects of the | 9.9.1. MOVE for Properties | |||
propertybehavior XML element, MUST be the same as specified in | ||||
Section 8.8.2. | ||||
8.9.2. MOVE for Collections | Live properties described in this document SHOULD be moved along with | |||
the resource, such that the resource has identically behaving live | ||||
properties at the destination resource, but not necessarily with the | ||||
same values. Note that some live properties are defined such that | ||||
the absence of the property has a specific meaning (e.g. a flag with | ||||
one meaning if present and the opposite if absent), and in these | ||||
cases, a successful MOVE might result in the property being reported | ||||
as "Not Found" in subsequent requests. If the live properties will | ||||
not work the same way at the destination, the server MAY fail the | ||||
request. | ||||
MOVE is frequently used by clients to rename a file without changing | ||||
its parent collection, so it's not appropriate to reset all live | ||||
properties which are set at resource creation. For example, the DAV: | ||||
creationdate property value SHOULD remain the same after a MOVE. | ||||
Dead properties MUST be moved along with the resource. | ||||
9.9.2. MOVE for Collections | ||||
A MOVE with "Depth: infinity" instructs that the collection | A MOVE with "Depth: infinity" instructs that the collection | |||
identified by the Request-URI be moved to the URI specified in the | identified by the Request-URI be moved to the address specified in | |||
Destination header, and all resources identified by its internal | the Destination header, and all resources identified by its internal | |||
member URIs are to be moved to locations relative to it, recursively | member URLs are to be moved to locations relative to it, recursively | |||
through all levels of the collection hierarchy. | through all levels of the collection hierarchy. | |||
The MOVE method on a collection MUST act as if a "Depth: infinity" | The MOVE method on a collection MUST act as if a "Depth: infinity" | |||
header was used on it. A client MUST NOT submit a Depth header on a | header was used on it. A client MUST NOT submit a Depth header on a | |||
MOVE on a collection with any value but "infinity". | MOVE on a collection with any value but "infinity". | |||
Any headers included with MOVE MUST be applied in processing every | Any headers included with MOVE MUST be applied in processing every | |||
resource to be moved with the exception of the Destination header. | resource to be moved with the exception of the Destination header. | |||
The behavior of the Destination header is the same as given for COPY | The behavior of the Destination header is the same as given for COPY | |||
on collections. | on collections. | |||
When the MOVE method has completed processing it MUST have created a | When the MOVE method has completed processing it MUST have created a | |||
consistent namespace at both the source and destination (see section | consistent URL namespace at both the source and destination (see | |||
5.1 for the definition of namespace consistency). However, if an | section 5.1 for the definition of namespace consistency). However, | |||
error occurs while moving an internal collection, the server MUST NOT | if an error occurs while moving an internal collection, the server | |||
move any resources identified by members of the failed collection | MUST NOT move any resources identified by members of the failed | |||
(i.e., the server must skip the error-causing subtree), as this would | collection (i.e., the server must skip the error-causing subtree), as | |||
create an inconsistent namespace. In this case, after detecting the | this would create an inconsistent namespace. In this case, after | |||
error, the move operation SHOULD try to finish as much of the | detecting the error, the move operation SHOULD try to finish as much | |||
original move as possible (i.e., the server should still attempt to | of the original move as possible (i.e., the server should still | |||
move other subtrees and the resources identified by their members, | attempt to move other subtrees and the resources identified by their | |||
that are not descendents of an error-causing collection). So, for | members, that are not descendents of an error-causing collection). | |||
example, if an infinite depth move is performed on collection /a/, | So, for example, if an infinite depth move is performed on collection | |||
which contains collections /a/b/ and /a/c/, and an error occurs | /a/, which contains collections /a/b/ and /a/c/, and an error occurs | |||
moving /a/b/, an attempt should still be made to try moving /a/c/. | moving /a/b/, an attempt should still be made to try moving /a/c/. | |||
Similarly, after encountering an error moving a non-collection | Similarly, after encountering an error moving a non-collection | |||
resource as part of an infinite depth move, the server SHOULD try to | resource as part of an infinite depth move, the server SHOULD try to | |||
finish as much of the original move operation as possible. | finish as much of the original move operation as possible. | |||
If an error occurs with a resource other than the resource identified | If an error occurs with a resource other than the resource identified | |||
in the Request-URI then the response MUST be a 207 (Multi-Status). | in the Request-URI then the response MUST be a 207 (Multi-Status), | |||
and the errored resource's URL MUST appear with the specific error. | ||||
The 424 (Failed Dependency) status code SHOULD NOT be returned in the | The 424 (Failed Dependency) status code SHOULD NOT be returned in the | |||
207 (Multi-Status) response from a MOVE method. These errors can be | 207 (Multi-Status) response from a MOVE method. These errors can be | |||
safely omitted because the client will know that the progeny of a | safely omitted because the client will know that the progeny of a | |||
resource could not be moved when the client receives an error for the | resource could not be moved when the client receives an error for the | |||
parent. Additionally 201 (Created)/204 (No Content) responses SHOULD | parent. Additionally 201 (Created)/204 (No Content) responses SHOULD | |||
NOT be returned as values in 207 (Multi-Status) responses from a | NOT be returned as values in 207 (Multi-Status) responses from a | |||
MOVE. These responses can be safely omitted because they are the | MOVE. These responses can be safely omitted because they are the | |||
default success codes. | default success codes. | |||
8.9.3. MOVE and the Overwrite Header | 9.9.3. MOVE and the Overwrite Header | |||
If a resource exists at the destination and the Overwrite header is | If a resource exists at the destination and the Overwrite header is | |||
"T" then prior to performing the move the server MUST perform a | "T" then prior to performing the move the server MUST perform a | |||
DELETE with "Depth: infinity" on the destination resource. If the | DELETE with "Depth: infinity" on the destination resource. If the | |||
Overwrite header is set to "F" then the operation will fail. | Overwrite header is set to "F" then the operation will fail. | |||
8.9.4. Status Codes | 9.9.4. Status Codes | |||
In addition to the general status codes possible, the following | ||||
status codes have specific applicability to MOVE: | ||||
201 (Created) - The source resource was successfully moved, and a new | 201 (Created) - The source resource was successfully moved, and a new | |||
resource was created at the destination. | URL mapping was created at the destination. | |||
204 (No Content) - The source resource was successfully moved to a | 204 (No Content) - The source resource was successfully moved to a | |||
pre-existing destination resource. | URL that was already mapped. | |||
403 (Forbidden) - The source and destination URIs are the same. | 207 (Multi-Status) - Multiple resources were to be affected by the | |||
MOVE, but errors on some of them prevented the operation from taking | ||||
place. Specific error messages, together with the most appropriate | ||||
of the source and destination URLs, appear in the body of the multi- | ||||
status response. E.g. if a source resource was locked and could not | ||||
be moved, then the source resource URL appears with the 423 (Locked) | ||||
status. | ||||
403 (Forbidden) - Among many possible reasons for forbidding a MOVE | ||||
operation, this status code is recommended for use when the source | ||||
and destination resources are the same. | ||||
409 (Conflict) - A resource cannot be created at the destination | 409 (Conflict) - A resource cannot be created at the destination | |||
until one or more intermediate collections have been created. | until one or more intermediate collections have been created. The | |||
server MUST NOT create those intermediate collections automatically. | ||||
Or, the server was unable to preserve the behavior of the live | ||||
properties and still move the resource to the destination (see | ||||
'preserved-live-properties' postcondition). | ||||
412 (Precondition Failed) - The server was unable to maintain the | 412 (Precondition Failed) - A condition header failed. Specific to | |||
liveness of the properties listed in the propertybehavior XML element | MOVE, this could mean that the Overwrite header is "F" and the | |||
or the Overwrite header is "F" and the state of the destination | destination URL is already mapped to a resource. | |||
resource is non-null. | ||||
423 (Locked) - The source or the destination resource was locked. | 423 (Locked) - The source or the destination resource, the source or | |||
destination resource parent, or some resource within the source or | ||||
destination collection, was locked. This response SHOULD contain the | ||||
'lock-token-submitted' precondition element. | ||||
502 (Bad Gateway) - This may occur when the destination is on another | 502 (Bad Gateway) - This may occur when the destination is on another | |||
server and the destination server refuses to accept the resource. | server and the destination server refuses to accept the resource. | |||
This could also occur when the destination is on another sub-section | ||||
of the same server namespace. | ||||
8.9.5. Example - MOVE of a Non-Collection | 9.9.5. Example - MOVE of a Non-Collection | |||
This example shows resource | This example shows resource | |||
http://www.ics.uci.edu/~fielding/index.html being moved to the | http://www.example.com/~fielding/index.html being moved to the | |||
location http://www.ics.uci.edu/users/f/fielding/index.html. The | location http://www.example.com/users/f/fielding/index.html. The | |||
contents of the destination resource would have been overwritten if | contents of the destination resource would have been overwritten if | |||
the destination resource had been non-null. In this case, since | the destination URL was already mapped to a resource. In this case, | |||
there was nothing at the destination resource, the response code is | since there was nothing at the destination resource, the response | |||
201 (Created). | code is 201 (Created). | |||
>>Request | >>Request | |||
MOVE /~fielding/index.html HTTP/1.1 | MOVE /~fielding/index.html HTTP/1.1 | |||
Host: www.ics.uci.edu | Host: www.example.com | |||
Destination: http://www.ics.uci.edu/users/f/fielding/index.html | Destination: http://www.example/users/f/fielding/index.html | |||
>>Response | >>Response | |||
HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
Location: http://www.ics.uci.edu/users/f/fielding/index.html | Location: http://www.example.com/users/f/fielding/index.html | |||
8.9.6. Example - MOVE of a Collection | 9.9.6. Example - MOVE of a Collection | |||
>>Request | >>Request | |||
MOVE /container/ HTTP/1.1 | MOVE /container/ HTTP/1.1 | |||
Host: www.foo.bar | Host: www.example.com | |||
Destination: http://www.foo.bar/othercontainer/ | Destination: http://www.example.com/othercontainer/ | |||
Overwrite: F | Overwrite: F | |||
If: (<opaquelocktoken:fe184f2e-6eec-41d0-c765-01adc56e6bb4>) | If: (<urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4>) | |||
(<opaquelocktoken:e454f3f3-acdc-452a-56c7-00a5c91e4b77>) | (<urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77>) | |||
Content-Type: text/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | ||||
<d:propertybehavior xmlns:d='DAV:'> | ||||
<d:keepalive>*</d:keepalive> | ||||
</d:propertybehavior> | ||||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<d:multistatus xmlns:d='DAV:'> | <d:multistatus xmlns:d='DAV:'> | |||
<d:response> | <d:response> | |||
<d:href>http://www.foo.bar/othercontainer/C2/</d:href> | <d:href>http://www.example.com/othercontainer/C2/</d:href> | |||
<d:status>HTTP/1.1 423 Locked</d:status> | <d:status>HTTP/1.1 423 Locked</d:status> | |||
</d:response> | <d:error><d:lock-token-submitted/></d:error> | |||
</d:multistatus> | </d:response> | |||
</d:multistatus> | ||||
In this example the client has submitted a number of lock tokens with | In this example the client has submitted a number of lock tokens with | |||
the request. A lock token will need to be submitted for every | the request. A lock token will need to be submitted for every | |||
resource, both source and destination, anywhere in the scope of the | resource, both source and destination, anywhere in the scope of the | |||
method, that is locked. In this case the proper lock token was not | method, that is locked. In this case the proper lock token was not | |||
submitted for the destination http://www.foo.bar/othercontainer/C2/. | submitted for the destination | |||
http://www.example.com/othercontainer/C2/. This means that the | ||||
This means that the resource /container/C2/ could not be moved. | resource /container/C2/ could not be moved. Because there was an | |||
Because there was an error copying /container/C2/, none of | error moving /container/C2/, none of /container/C2's members were | |||
/container/C2's members were copied. However no errors were listed | moved. However no errors were listed for those members due to the | |||
for those members due to the error minimization rules given in | error minimization rules. User agent authentication has previously | |||
Section 8.8.3. User agent authentication has previously occurred via | occurred via a mechanism outside the scope of the HTTP protocol, in | |||
a mechanism outside the scope of the HTTP protocol, in an underlying | an underlying transport layer. | |||
transport layer. | ||||
8.10. LOCK Method | 9.10. LOCK Method | |||
The following sections describe the LOCK method, which is used to | The following sections describe the LOCK method, which is used to | |||
take out a lock of any access type. These sections on the LOCK | take out a lock of any access type and to refresh an existing lock. | |||
method describe only those semantics that are specific to the LOCK | These sections on the LOCK method describe only those semantics that | |||
method and are independent of the access type of the lock being | are specific to the LOCK method and are independent of the access | |||
requested. | type of the lock being requested. | |||
Any resource which supports the LOCK method MUST, at minimum, support | Any resource which supports the LOCK method MUST, at minimum, support | |||
the XML request and response formats defined herein. | the XML request and response formats defined herein. | |||
8.10.1. Operation | This method is neither idempotent nor safe (see Section 9.1 of | |||
[RFC2616]). Responses to this method MUST NOT be cached. | ||||
A LOCK method invocation creates the lock specified by the lockinfo | 9.10.1. Creating a Lock on an Existing Resource | |||
XML element on the Request-URI. Lock method requests SHOULD have a | ||||
XML request body which contains an owner XML element for this lock | ||||
request, unless this is a refresh request. The LOCK request may have | ||||
a Timeout header. | ||||
Clients MUST assume that locks may arbitrarily disappear at any time, | A LOCK request to an existing resource will create a lock on the | |||
regardless of the value given in the Timeout header. The Timeout | resource identified by the Request-URI, provided the resource is not | |||
header only indicates the behavior of the server if "extraordinary" | already locked with a conflicting lock. The resource identified in | |||
circumstances do not occur. For example, an administrator may remove | the Request-URI becomes the root of the lock. Lock method requests | |||
a lock at any time or the system may crash in such a way that it | to create a new lock MUST have an XML request body. The server MUST | |||
loses the record of the lock's existence. The response MUST contain | preserve the information provided by the client in the 'owner' field | |||
the value of the lockdiscovery property in a prop XML element. | in the request body when the lock information is requested. The LOCK | |||
request MAY have a Timeout header. | ||||
In order to indicate the lock token associated with a newly created | When a new lock is created, the LOCK response: | |||
lock, a Lock-Token response header MUST be included in the response | ||||
for every successful LOCK request for a new lock. Note that the | ||||
Lock-Token header would not be returned in the response for a | ||||
successful refresh LOCK request because a new lock was not created. | ||||
8.10.2. The Effect of Locks on Properties and Collections | o MUST contain a body with the value of the DAV:lockdiscovery | |||
property in a prop XML element. This MUST contain the full | ||||
information about the lock just granted, while information about | ||||
other (shared) locks is OPTIONAL. | ||||
The scope of a lock is the entire state of the resource, including | o MUST include the Lock-Token response header with the token | |||
its body and associated properties. As a result, a lock on a | associated with the new lock. | |||
resource MUST also lock the resource's properties. | ||||
For collections, a lock also affects the ability to add or remove | 9.10.2. Refreshing Locks | |||
members. The nature of the effect depends upon the type of access | ||||
control involved. | ||||
8.10.3. Locking Replicated Resources | A lock is refreshed by sending a LOCK request to the URL of a | |||
resource within the scope of the lock. This request MUST NOT have a | ||||
body and it MUST specify which lock to refresh by using the 'If' | ||||
header with a single lock token (only one lock may be refreshed at a | ||||
time). The request MAY contain a Timeout header, which a server MAY | ||||
accept to change the duration remaining on the lock to the new value. | ||||
A server MUST ignore the Depth header on a LOCK refresh. | ||||
A resource may be made available through more than one URI. However | If the resource has other (shared) locks, those locks are unaffected | |||
locks apply to resources, not URIs. Therefore a LOCK request on a | by a lock refresh. Additionally, those locks do not prevent the | |||
resource MUST NOT succeed if can not be honored by all the URIs | named lock from being refreshed. | |||
through which the resource is addressable. | ||||
8.10.4. Depth and Locking | The Lock-Token header is not returned in the response for a | |||
successful refresh LOCK request, but the LOCK response body MUST | ||||
contain the new value for the DAV:lockdiscovery property. | ||||
9.10.3. Depth and Locking | ||||
The Depth header may be used with the LOCK method. Values other than | The Depth header may be used with the LOCK method. Values other than | |||
0 or infinity MUST NOT be used with the Depth header on a LOCK | 0 or infinity MUST NOT be used with the Depth header on a LOCK | |||
method. All resources that support the LOCK method MUST support the | method. All resources that support the LOCK method MUST support the | |||
Depth header. | Depth header. | |||
A Depth header of value 0 means to just lock the resource specified | A Depth header of value 0 means to just lock the resource specified | |||
by the Request-URI. | by the Request-URI. | |||
If the Depth header is set to infinity then the resource specified in | If the Depth header is set to infinity then the resource specified in | |||
the Request-URI along with all its internal members, all the way down | the Request-URI along with all its members, all the way down the | |||
the hierarchy, are to be locked. A successful result MUST return a | hierarchy, are to be locked. A successful result MUST return a | |||
single lock token which represents all the resources that have been | single lock token. Similarly, if an UNLOCK is successfully executed | |||
locked. If an UNLOCK is successfully executed on this token, all | on this token, all associated resources are unlocked. Hence, partial | |||
associated resources are unlocked. If the lock cannot be granted to | success is not an option for LOCK or UNLOCK. Either the entire | |||
all resources, a 409 (Conflict) status code MUST be returned with a | hierarchy is locked or no resources are locked. | |||
response entity body containing a multistatus XML element describing | ||||
which resource(s) prevented the lock from being granted. Hence, | If the lock cannot be granted to all resources, the server MUST | |||
partial success is not an option. Either the entire hierarchy is | return a Multi-Status response with a 'response' element for at least | |||
locked or no resources are locked. | one resource which prevented the lock from being granted, along with | |||
a suitable status code for that failure (e.g. 403 (Forbidden) or 423 | ||||
(Locked)). Additionally, if the resource causing the failure was not | ||||
the resource requested, then the server SHOULD include a 'response' | ||||
element for the Request-URI as well, with a 'status' element | ||||
containing 424 Failed Dependency. | ||||
If no Depth header is submitted on a LOCK request then the request | If no Depth header is submitted on a LOCK request then the request | |||
MUST act as if a "Depth:infinity" had been submitted. | MUST act as if a "Depth:infinity" had been submitted. | |||
8.10.5. Interaction with other Methods | 9.10.4. Locking Unmapped URLs | |||
The interaction of a LOCK with various methods is dependent upon the | A successful LOCK method MUST result in the creation of an empty | |||
lock type. However, independent of lock type, a successful DELETE of | resource which is locked (and which is not a collection), when a | |||
a resource MUST cause all of its locks to be removed. | resource did not previously exist at that URL. Later on, the lock | |||
may go away but the empty resource remains. Empty resources MUST | ||||
then appear in PROPFIND responses including that URL in the response | ||||
scope. A server MUST respond successfully to a GET request to an | ||||
empty resource, either by using a 204 No Content response, or by | ||||
using 200 OK with a Content-Length header indicating zero length | ||||
8.10.6. Lock Compatibility Table | 9.10.5. Lock Compatibility Table | |||
The table below describes the behavior that occurs when a lock | The table below describes the behavior that occurs when a lock | |||
request is made on a resource. | request is made on a resource. | |||
+-----------------------------------+-------------+----------------+ | +--------------------------+----------------+-------------------+ | |||
| Current lock state / Lock request | Shared Lock | Exclusive Lock | | | Current State | Shared Lock OK | Exclusive Lock OK | | |||
+-----------------------------------+-------------+----------------+ | +--------------------------+----------------+-------------------+ | |||
| None | True | True | | | None | True | True | | |||
| Shared Lock | True | False | | | | | | | |||
| Exclusive Lock | False | False* | | | Shared Lock | True | False | | |||
+-----------------------------------+-------------+----------------+ | | | | | | |||
| Exclusive Lock | False | False* | | ||||
+--------------------------+----------------+-------------------+ | ||||
Legend: True = lock may be granted. False = lock MUST NOT be | Legend: True = lock may be granted. False = lock MUST NOT be | |||
granted. *=It is illegal for a principal to request the same lock | granted. *=It is illegal for a principal to request the same lock | |||
twice. | twice. | |||
The current lock state of a resource is given in the leftmost column, | The current lock state of a resource is given in the leftmost column, | |||
and lock requests are listed in the first row. The intersection of a | and lock requests are listed in the first row. The intersection of a | |||
row and column gives the result of a lock request. For example, if a | row and column gives the result of a lock request. For example, if a | |||
shared lock is held on a resource, and an exclusive lock is | shared lock is held on a resource, and an exclusive lock is | |||
requested, the table entry is "false", indicating the lock must not | requested, the table entry is "false", indicating the lock must not | |||
be granted. | be granted. | |||
8.10.7. Status Codes | 9.10.6. LOCK Responses | |||
200 (OK) - The lock request succeeded and the value of the | In addition to the general status codes possible, the following | |||
lockdiscovery property is included in the body. | status codes have specific applicability to LOCK: | |||
412 (Precondition Failed) - The included lock token was not | 200 (OK) - The LOCK request succeeded and the value of the DAV: | |||
enforceable on this resource or the server could not satisfy the | lockdiscovery property is included in the response body. | |||
request in the lockinfo XML element. | ||||
423 (Locked) - The resource is locked, so the method has been | 201 (Created) - The LOCK request was to an unmapped URL, the request | |||
rejected. | succeeded and resulted in the creation of a new resource, and the | |||
value of the DAV:lockdiscovery property is included in the response | ||||
body. | ||||
8.10.8. Example - Simple Lock Request | 409 (Conflict) - A resource cannot be created at the destination | |||
until one or more intermediate collections have been created. The | ||||
server MUST NOT create those intermediate collections automatically. | ||||
423 (Locked), potentially with 'no-conflicting-lock' precondition | ||||
code - There is already a lock on the resource which is not | ||||
compatible with the requested lock (see lock compatibility table | ||||
above). | ||||
412 (Precondition Failed), with 'lock-token-matches-request-uri' | ||||
precondition code - The LOCK request was made with a If header, | ||||
indicating that the client wishes to refresh the given lock. | ||||
However, the Request-URI did not fall within the scope of the lock | ||||
identified by the token. The lock may have a scope that does not | ||||
include the Request-URI, or the lock could have disappeared, or the | ||||
token may be invalid. | ||||
9.10.7. Example - Simple Lock Request | ||||
>>Request | >>Request | |||
LOCK /workspace/webdav/proposal.doc HTTP/1.1 | LOCK /workspace/webdav/proposal.doc HTTP/1.1 | |||
Host: webdav.sb.aol.com | Host: example.com | |||
Timeout: Infinite, Second-4100000000 | Timeout: Infinite, Second-4100000000 | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Authorization: Digest username="ejw", | Authorization: Digest username="ejw", | |||
realm="ejw@webdav.sb.aol.com", nonce="...", | realm="ejw@example.com", nonce="...", | |||
uri="/workspace/webdav/proposal.doc", | uri="/workspace/webdav/proposal.doc", | |||
response="...", opaque="..." | response="...", opaque="..." | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:lockinfo xmlns:D='DAV:'> | <D:lockinfo xmlns:D='DAV:'> | |||
<D:lockscope><D:exclusive/></D:lockscope> | <D:lockscope><D:exclusive/></D:lockscope> | |||
<D:locktype><D:write/></D:locktype> | <D:locktype><D:write/></D:locktype> | |||
<D:owner> | <D:owner> | |||
<D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href> | <D:href>http://example.org/~ejw/contact.html</D:href> | |||
</D:owner> | </D:owner> | |||
</D:lockinfo> | </D:lockinfo> | |||
>>Response | >>Response | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: text/xml; charset="utf-8" | Lock-Token: <urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4> | |||
Content-Length: xxxx | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:prop xmlns:D="DAV:"> | <D:prop xmlns:D="DAV:"> | |||
<D:lockdiscovery> | <D:lockdiscovery> | |||
<D:activelock> | <D:activelock> | |||
<D:locktype><D:write/></D:locktype> | <D:locktype><D:write/></D:locktype> | |||
<D:lockscope><D:exclusive/></D:lockscope> | <D:lockscope><D:exclusive/></D:lockscope> | |||
<D:depth>Infinity</D:depth> | <D:depth>infinity</D:depth> | |||
<D:owner> | <D:owner> | |||
<D:href> | <D:href>http://example.org/~ejw/contact.html</D:href> | |||
http://www.ics.uci.edu/~ejw/contact.html | </D:owner> | |||
</D:href> | <D:timeout>Second-604800</D:timeout> | |||
</D:owner> | <D:locktoken> | |||
<D:timeout>Second-604800</D:timeout> | <D:href | |||
<D:locktoken> | >urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4</D:href> | |||
<D:href> | </D:locktoken> | |||
opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4 | <D:lockroot> | |||
</D:href> | <D:href | |||
</D:locktoken> | >http://example.com/workspace/webdav/proposal.doc</D:href> | |||
</D:activelock> | </D:lockroot> | |||
</D:lockdiscovery> | </D:activelock> | |||
</D:prop> | </D:lockdiscovery> | |||
</D:prop> | ||||
This example shows the successful creation of an exclusive write lock | This example shows the successful creation of an exclusive write lock | |||
on resource http://webdav.sb.aol.com/workspace/webdav/proposal.doc. | on resource http://example.com/workspace/webdav/proposal.doc. The | |||
The resource http://www.ics.uci.edu/~ejw/contact.html contains | resource http://example.org/~ejw/contact.html contains contact | |||
contact information for the owner of the lock. The server has an | information for the creator of the lock. The server has an activity- | |||
activity-based timeout policy in place on this resource, which causes | based timeout policy in place on this resource, which causes the lock | |||
the lock to automatically be removed after 1 week (604800 seconds). | to automatically be removed after 1 week (604800 seconds). Note that | |||
Note that the nonce, response, and opaque fields have not been | the nonce, response, and opaque fields have not been calculated in | |||
calculated in the Authorization request header. | the Authorization request header. | |||
8.10.9. Example - Refreshing a Write Lock | 9.10.8. Example - Refreshing a Write Lock | |||
>>Request | >>Request | |||
LOCK /workspace/webdav/proposal.doc HTTP/1.1 | LOCK /workspace/webdav/proposal.doc HTTP/1.1 | |||
Host: webdav.sb.aol.com | Host: example.com | |||
Timeout: Infinite, Second-4100000000 | Timeout: Infinite, Second-4100000000 | |||
If: (<opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>) | If: (<urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>) | |||
Authorization: Digest username="ejw", | Authorization: Digest username="ejw", | |||
realm="ejw@webdav.sb.aol.com", nonce="...", | realm="ejw@example.com", nonce="...", | |||
uri="/workspace/webdav/proposal.doc", | uri="/workspace/webdav/proposal.doc", | |||
response="...", opaque="..." | response="...", opaque="..." | |||
>>Response | >>Response | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:prop xmlns:D="DAV:"> | <D:prop xmlns:D="DAV:"> | |||
<D:lockdiscovery> | <D:lockdiscovery> | |||
<D:activelock> | <D:activelock> | |||
<D:locktype><D:write/></D:locktype> | <D:locktype><D:write/></D:locktype> | |||
<D:lockscope><D:exclusive/></D:lockscope> | <D:lockscope><D:exclusive/></D:lockscope> | |||
<D:depth>Infinity</D:depth> | <D:depth>infinity</D:depth> | |||
<D:owner> | <D:owner> | |||
<D:href> | <D:href>http://example.org/~ejw/contact.html</D:href> | |||
http://www.ics.uci.edu/~ejw/contact.html | </D:owner> | |||
</D:href> | <D:timeout>Second-604800</D:timeout> | |||
</D:owner> | <D:locktoken> | |||
<D:timeout>Second-604800</D:timeout> | <D:href | |||
<D:locktoken> | >urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4</D:href> | |||
<D:href> | </D:locktoken> | |||
opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4 | <D:lockroot> | |||
</D:href> | <D:href | |||
</D:locktoken> | >http://example.com/workspace/webdav/proposal.doc</D:href> | |||
</D:activelock> | </D:lockroot> | |||
</D:lockdiscovery> | </D:activelock> | |||
</D:prop> | </D:lockdiscovery> | |||
</D:prop> | ||||
This request would refresh the lock, resetting any time outs. Notice | This request would refresh the lock, attempting to reset the timeout | |||
that the client asked for an infinite time out but the server choose | to the new value specified in the timeout header. Notice that the | |||
to ignore the request. In this example, the nonce, response, and | client asked for an infinite time out but the server choose to ignore | |||
opaque fields have not been calculated in the Authorization request | the request. In this example, the nonce, response, and opaque fields | |||
header. | have not been calculated in the Authorization request header. | |||
8.10.10. Example - Multi-Resource Lock Request | 9.10.9. Example - Multi-Resource Lock Request | |||
>>Request | >>Request | |||
LOCK /webdav/ HTTP/1.1 | LOCK /webdav/ HTTP/1.1 | |||
Host: webdav.sb.aol.com | Host: example.com | |||
Timeout: Infinite, Second-4100000000 | Timeout: Infinite, Second-4100000000 | |||
Depth: infinity | Depth: infinity | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Authorization: Digest username="ejw", | Authorization: Digest username="ejw", | |||
realm="ejw@webdav.sb.aol.com", nonce="...", | realm="ejw@example.com", nonce="...", | |||
uri="/workspace/webdav/proposal.doc", | uri="/workspace/webdav/proposal.doc", | |||
response="...", opaque="..." | response="...", opaque="..." | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:lockinfo xmlns:D="DAV:"> | <D:lockinfo xmlns:D="DAV:"> | |||
<D:locktype><D:write/></D:locktype> | <D:locktype><D:write/></D:locktype> | |||
<D:lockscope><D:exclusive/></D:lockscope> | <D:lockscope><D:exclusive/></D:lockscope> | |||
<D:owner> | <D:owner> | |||
<D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href> | <D:href>http://example.org/~ejw/contact.html</D:href> | |||
</D:owner> | </D:owner> | |||
</D:lockinfo> | </D:lockinfo> | |||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D="DAV:"> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://webdav.sb.aol.com/webdav/secret</D:href> | <D:href>http://example.com/webdav/secret</D:href> | |||
<D:status>HTTP/1.1 403 Forbidden</D:status> | <D:status>HTTP/1.1 403 Forbidden</D:status> | |||
</D:response> | </D:response> | |||
<D:response> | <D:response> | |||
<D:href>http://webdav.sb.aol.com/webdav/</D:href> | <D:href>http://example.com/webdav/</D:href> | |||
<D:propstat> | <D:status>HTTP/1.1 424 Failed Dependency</D:status> | |||
<D:prop><D:lockdiscovery/></D:prop> | </D:response> | |||
<D:status>HTTP/1.1 424 Failed Dependency</D:status> | </D:multistatus> | |||
</D:propstat> | ||||
</D:response> | ||||
</D:multistatus> | ||||
This example shows a request for an exclusive write lock on a | This example shows a request for an exclusive write lock on a | |||
collection and all its children. In this request, the client has | collection and all its children. In this request, the client has | |||
specified that it desires an infinite length lock, if available, | specified that it desires an infinite length lock, if available, | |||
otherwise a timeout of 4.1 billion seconds, if available. The | otherwise a timeout of 4.1 billion seconds, if available. The | |||
request entity body contains the contact information for the | request entity body contains the contact information for the | |||
principal taking out the lock, in this case a web page URL. | principal taking out the lock, in this case a web page URL. | |||
The error is a 403 (Forbidden) response on the resource | The error is a 403 (Forbidden) response on the resource | |||
http://webdav.sb.aol.com/webdav/secret. Because this resource could | http://example.com/webdav/secret. Because this resource could not be | |||
not be locked, none of the resources were locked. Note also that the | locked, none of the resources were locked. Note also that the a | |||
lockdiscovery property for the Request-URI has been included as | 'response' element for the Request-URI itself has been included as | |||
required. In this example the lockdiscovery property is empty which | required. | |||
means that there are no outstanding locks on the resource. | ||||
In this example, the nonce, response, and opaque fields have not been | In this example, the nonce, response, and opaque fields have not been | |||
calculated in the Authorization request header. | calculated in the Authorization request header. | |||
8.11. UNLOCK Method | 9.11. UNLOCK Method | |||
The UNLOCK method removes the lock identified by the lock token in | The UNLOCK method removes the lock identified by the lock token in | |||
the Lock-Token request header from the Request-URI, and all other | the Lock-Token request header. The Request-URI MUST identify a | |||
resources included in the lock. If all resources which have been | resource within the scope of the lock. | |||
locked under the submitted lock token can not be unlocked then the | ||||
UNLOCK request MUST fail. | Note that use of Lock-Token header to provide the lock token is not | |||
consistent with other state-changing methods which all require an If | ||||
header with the lock token. Thus, the If header is not needed to | ||||
provide the lock token. Naturally when the If header is present it | ||||
has its normal meaning as a conditional header. | ||||
For a successful response to this method, the server MUST delete the | ||||
lock entirely. | ||||
If all resources which have been locked under the submitted lock | ||||
token can not be unlocked then the UNLOCK request MUST fail. | ||||
A successful response to an UNLOCK method does not mean that the | ||||
resource is necessarily unlocked. It means that the specific lock | ||||
corresponding to the specified token no longer exists. | ||||
Any DAV compliant resource which supports the LOCK method MUST | Any DAV compliant resource which supports the LOCK method MUST | |||
support the UNLOCK method. | support the UNLOCK method. | |||
8.11.1. Example - UNLOCK | This method is idempotent, but not safe (see Section 9.1 of | |||
[RFC2616]). Responses to this method MUST NOT be cached. | ||||
9.11.1. Status Codes | ||||
In addition to the general status codes possible, the following | ||||
status codes have specific applicability to UNLOCK: | ||||
204 (No Content) - Normal success response (rather than 200 OK, since | ||||
200 OK would imply a response body, and an UNLOCK success response | ||||
does not normally contain a body) | ||||
400 (Bad Request) - No lock token was provided. | ||||
403 (Forbidden) - The currently authenticated principal does not have | ||||
permission to remove the lock. | ||||
409 (Conflict), with 'lock-token-matches-request-uri' precondition - | ||||
The resource was not locked, or the request was made to a Request-URI | ||||
that was not within the scope of the lock. | ||||
9.11.2. Example - UNLOCK | ||||
>>Request | >>Request | |||
UNLOCK /workspace/webdav/info.doc HTTP/1.1 | UNLOCK /workspace/webdav/info.doc HTTP/1.1 | |||
Host: webdav.sb.aol.com | Host: example.com | |||
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7> | Lock-Token: <urn:uuid:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7> | |||
Authorization: Digest username="ejw", | Authorization: Digest username="ejw" | |||
realm="ejw@webdav.sb.aol.com", nonce="...", | realm="ejw@example.com", nonce="...", | |||
uri="/workspace/webdav/proposal.doc", | uri="/workspace/webdav/proposal.doc", | |||
response="...", opaque="..." | response="...", opaque="..." | |||
>>Response | >>Response | |||
HTTP/1.1 204 No Content | HTTP/1.1 204 No Content | |||
In this example, the lock identified by the lock token | In this example, the lock identified by the lock token | |||
"opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7" is | "urn:uuid:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7" is successfully | |||
successfully removed from the resource | removed from the resource | |||
http://webdav.sb.aol.com/workspace/webdav/info.doc. If this lock | http://example.com/workspace/webdav/info.doc. If this lock included | |||
included more than just one resource, the lock is removed from all | more than just one resource, the lock is removed from all resources | |||
resources included in the lock. The 204 (No Content) status code is | included in the lock. | |||
used instead of 200 (OK) because there is no response entity body. | ||||
In this example, the nonce, response, and opaque fields have not been | In this example, the nonce, response, and opaque fields have not been | |||
calculated in the Authorization request header. | calculated in the Authorization request header. | |||
9. HTTP Headers for Distributed Authoring | 10. HTTP Headers for Distributed Authoring | |||
9.1. DAV Header | All DAV headers follow the same basic formatting rules as HTTP | |||
headers. This includes rules like line continuation and how to | ||||
combine (or separate) multiple instances of the same header using | ||||
commas. | ||||
DAV = "DAV" ":" "1" ["," "2"] ["," 1#extend] | WebDAV adds two new conditional headers to the set defined in HTTP: | |||
the If and Overwrite headers. | ||||
This header indicates that the resource supports the DAV schema and | 10.1. DAV Header | |||
protocol as specified. All DAV compliant resources MUST return the | ||||
DAV header on all OPTIONS responses. | ||||
The value is a list of all compliance classes that the resource | DAV = "DAV" ":" #( compliance-class ) | |||
supports. Note that above a comma has already been added to the 2. | compliance-class = ( "1" | "2" | "3" | extend ) | |||
This is because a resource can not be level 2 compliant unless it is | extend = Coded-URL | token | |||
also level 1 compliant. Please refer to Section 15 for more details. | Coded-URL = "<" absolute-URI ">" | |||
In general, however, support for one compliance class does not entail | ; No linear white space (LWS) allowed in Coded-URL | |||
support for any other. | ; absolute-URI is defined in RFC3986 | |||
9.2. Depth Header | This general-header appearing in the response indicates that the | |||
resource supports the DAV schema and protocol as specified. All DAV | ||||
compliant resources MUST return the DAV header with compliance-class | ||||
"1" on all OPTIONS responses. In cases where WebDAV is only | ||||
supported in part of the server namespace, an OPTIONS request to non- | ||||
WebDAV resources (including "/") SHOULD NOT advertise WebDAV support. | ||||
The value is a comma-separated list of all compliance class | ||||
identifiers that the resource supports. Class identifiers may be | ||||
Coded-URLs or tokens (as defined by [RFC2616]). Identifiers can | ||||
appear in any order. Identifiers that are standardized through the | ||||
IETF RFC process are tokens, but other identifiers SHOULD be Coded- | ||||
URLs to encourage uniqueness. | ||||
A resource must show class 1 compliance if it shows class 2 or 3 | ||||
compliance. In general, support for one compliance class does not | ||||
entail support for any other, and in particular, support for | ||||
compliance class 3 does not require support for compliance class 2. | ||||
Please refer to Section 18 for more details on compliance classes | ||||
defined in this specification. | ||||
Note that many WebDAV servers do not advertise WebDAV support in | ||||
response to "OPTIONS *". | ||||
As a request header, this header allows the client to advertise | ||||
compliance with named features when the server needs that | ||||
information. Clients SHOULD NOT send this header unless a standards | ||||
track specification requires it. Any extension that makes use of | ||||
this as a request header will need to carefully consider caching | ||||
implications. | ||||
10.2. Depth Header | ||||
Depth = "Depth" ":" ("0" | "1" | "infinity") | Depth = "Depth" ":" ("0" | "1" | "infinity") | |||
The Depth header is used with methods executed on resources which | The Depth request header is used with methods executed on resources | |||
could potentially have internal members to indicate whether the | which could potentially have internal members to indicate whether the | |||
method is to be applied only to the resource ("Depth: 0"), to the | method is to be applied only to the resource ("Depth: 0"), to the | |||
resource and its immediate children, ("Depth: 1"), or the resource | resource and its internal members only, ("Depth: 1"), or the resource | |||
and all its progeny ("Depth: infinity"). | and all its members ("Depth: infinity"). | |||
The Depth header is only supported if a method's definition | The Depth header is only supported if a method's definition | |||
explicitly provides for such support. | explicitly provides for such support. | |||
The following rules are the default behavior for any method that | The following rules are the default behavior for any method that | |||
supports the Depth header. A method may override these defaults by | supports the Depth header. A method may override these defaults by | |||
defining different behavior in its definition. | defining different behavior in its definition. | |||
Methods which support the Depth header may choose not to support all | Methods which support the Depth header may choose not to support all | |||
of the header's values and may define, on a case by case basis, the | of the header's values and may define, on a case by case basis, the | |||
skipping to change at page 57, line 12 ¶ | skipping to change at page 77, line 41 ¶ | |||
hierarchies in any particular order or on the execution being atomic | hierarchies in any particular order or on the execution being atomic | |||
unless the particular method explicitly provides such guarantees. | unless the particular method explicitly provides such guarantees. | |||
Upon execution, a method with a Depth header will perform as much of | Upon execution, a method with a Depth header will perform as much of | |||
its assigned task as possible and then return a response specifying | its assigned task as possible and then return a response specifying | |||
what it was able to accomplish and what it failed to do. | what it was able to accomplish and what it failed to do. | |||
So, for example, an attempt to COPY a hierarchy may result in some of | So, for example, an attempt to COPY a hierarchy may result in some of | |||
the members being copied and some not. | the members being copied and some not. | |||
Any headers on a method that has a defined interaction with the Depth | By default, the Depth header does not interact with other headers. | |||
header MUST be applied to all resources in the scope of the method | That is, each header on a request with a Depth header MUST be applied | |||
except where alternative behavior is explicitly defined. For | only to the Request-URI if it applies to any resource, unless | |||
example, an If-Match header will have its value applied against every | specific Depth behavior is defined for that header. | |||
resource in the method's scope and will cause the method to fail if | ||||
the header fails to match. | ||||
If a resource, source or destination, within the scope of the method | If a resource, source or destination, within the scope of the method | |||
with a Depth header is locked in such a way as to prevent the | with a Depth header is locked in such a way as to prevent the | |||
successful execution of the method, then the lock token for that | successful execution of the method, then the lock token for that | |||
resource MUST be submitted with the request in the If request header. | resource MUST be submitted with the request in the If request header. | |||
The Depth header only specifies the behavior of the method with | The Depth header only specifies the behavior of the method with | |||
regards to internal children. If a resource does not have internal | regards to internal members. If a resource does not have internal | |||
children then the Depth header MUST be ignored. | members then the Depth header MUST be ignored. | |||
Please note, however, that it is always an error to submit a value | 10.3. Destination Header | |||
for the Depth header that is not allowed by the method's definition. | ||||
Thus submitting a "Depth: 1" on a COPY, even if the resource does not | ||||
have internal members, will result in a 400 (Bad Request). The | ||||
method should fail not because the resource doesn't have internal | ||||
members, but because of the illegal value in the header. | ||||
9.3. Destination Header | The Destination request header specifies the URI which identifies a | |||
destination resource for methods such as COPY and MOVE, which take | ||||
two URIs as parameters. | ||||
Destination = "Destination" ":" absoluteURI | Destination = "Destination" ":" Simple-ref | |||
The Destination header specifies the URI which identifies a | If the Destination value is an absolute-URI (Section 4.3 of | |||
destination resource for methods such as COPY and MOVE, which take | [RFC3986]), it may name a different server (or different port or | |||
two URIs as parameters. Note that the absoluteURI production is | scheme). If the source server cannot attempt a copy to the remote | |||
defined in [RFC2396]. | server, it MUST fail the request. Note that copying and moving | |||
resources to remote servers is not fully defined in this | ||||
specification (e.g. specific error conditions). | ||||
9.4. If Header | If the Destination value is too long or otherwise unacceptable, the | |||
server SHOULD return 400 (Bad Request), ideally with helpful | ||||
information in an error body. | ||||
If = "If" ":" ( 1*No-tag-list | 1*Tagged-list) | 10.4. If Header | |||
No-tag-list = List | ||||
Tagged-list = Resource 1*List | ||||
Resource = Coded-URL | ||||
List = "(" 1*(["Not"](State-token | "[" entity-tag "]")) ")" | ||||
State-token = Coded-URL | ||||
Coded-URL = "<" absoluteURI ">" | ||||
The If header is intended to have similar functionality to the If- | The If request header is intended to have similar functionality to | |||
Match header defined in section 14.25 of [RFC2068]. However the If | the If-Match header defined in Section 14.24 of [RFC2616]. However | |||
header is intended for use with any URI which represents state | the If header handles any state token as well as ETags. A typical | |||
information, referred to as a state token, about a resource as well | example of a state token is a lock token, and lock tokens are the | |||
as ETags. A typical example of a state token is a lock token, and | only state tokens defined in this specification. | |||
lock tokens are the only state tokens defined in this specification. | ||||
All DAV compliant resources MUST honor the If header. | 10.4.1. Purpose | |||
The If header's purpose is to describe a series of state lists. If | The If header has two distinct purposes: | |||
the state of the resource to which the header is applied does not | ||||
match any of the specified state lists then the request MUST fail | ||||
with a 412 (Precondition Failed). If one of the described state | ||||
lists matches the state of the resource then the request may succeed. | ||||
Note that the absoluteURI production is defined in [RFC2396]. | o The first purpose is to make a request conditional by supplying a | |||
series of state lists with conditions that match tokens and ETags | ||||
to specific resource. If this header is evaluated and all state | ||||
lists fail, then the request MUST fail with a 412 (Precondition | ||||
Failed) status. On the other hand, the request can succeed only | ||||
if one of the described state lists succeeds. The success | ||||
criteria for state lists and matching functions are defined in | ||||
Section 10.4.3 and Section 10.4.4. | ||||
9.4.1. No-tag-list Production | o Additionally, the mere fact that a state token appears in an If | |||
header means that it has been "submitted" with the request. In | ||||
general, this is used to indicate that the client has knowledge of | ||||
that state token. The semantics for submitting a state token | ||||
depend on its type (for lock tokens, please refer to Section 6). | ||||
The No-tag-list production describes a series of state tokens and | Note that these two purposes need to be treated distinctly: a state | |||
ETags. If multiple No-tag-list productions are used then one only | token counts as being submitted independently of whether the server | |||
needs to match the state of the resource for the method to be allowed | actually has evaluated the state list it appears in, and also | |||
to continue. | independently of whether the condition it expressed was found to be | |||
true or not. | ||||
If a method, due to the presence of a Depth or Destination header, is | 10.4.2. Syntax | |||
applied to multiple resources then the No-tag-list production MUST be | ||||
applied to each resource the method is applied to. | ||||
9.4.1.1. Example - No-tag-list If Header | If = "If" ":" ( 1*No-tag-list | 1*Tagged-list ) | |||
If: (<locktoken:a-write-lock-token> ["I am an ETag"]) (["I am another | No-tag-list = List | |||
ETag"]) | Tagged-list = Resource-Tag 1*List | |||
The previous header would require that any resources within the scope | List = "(" 1*Condition ")" | |||
of the method must either be locked with the specified lock token and | Condition = ["Not"] (State-token | "[" entity-tag "]") | |||
in the state identified by the "I am an ETag" ETag or in the state | ; entity-tag: see Section 3.11 of [RFC2616] | |||
identified by the second ETag "I am another ETag". To put the matter | ; No LWS allowed between "[", entity-tag and "]" | |||
more plainly one can think of the previous If header as being in the | ||||
form (or (and <locktoken:a-write-lock-token> ["I am an ETag"]) (and | ||||
["I am another ETag"])). | ||||
9.4.2. Tagged-list Production | State-token = Coded-URL | |||
The tagged-list production scopes a list production. That is, it | Resource-Tag = "<" Simple-ref ">" | |||
specifies that the lists following the resource specification only | ; Simple-ref: see Section 8.3 | |||
apply to the specified resource. The scope of the resource | ; No LWS allowed in Resource-Tag | |||
production begins with the list production immediately following the | ||||
resource production and ends with the next resource production, if | ||||
any. | ||||
When the If header is applied to a particular resource, the Tagged- | The syntax distinguishes between untagged lists ("No-tag-list") and | |||
list productions MUST be searched to determine if any of the listed | tagged lists ("Tagged-list"). Untagged lists apply to the resource | |||
resources match the operand resource(s) for the current method. If | identified by the Request-URI, while tagged lists apply to the | |||
none of the resource productions match the current resource then the | resource identified by the preceding Resource-Tag. | |||
header MUST be ignored. If one of the resource productions does | ||||
match the name of the resource under consideration then the list | ||||
productions following the resource production MUST be applied to the | ||||
resource in the manner specified in the previous section. | ||||
The same URI MUST NOT appear more than once in a resource production | A Resource-Tag applies to all subsequent Lists, up to the next | |||
in an If header. | Resource-Tag. | |||
9.4.2.1. Example - Tagged List If header | Note that the two list types cannot be mixed within an If header. | |||
This is not a functional restriction because the No-tag-list syntax | ||||
is just a shorthand notation for a Tagged-list production with a | ||||
Resource-Tag referring to the Request-URI. | ||||
COPY /resource1 HTTP/1.1 | Each List consists of one or more Conditions. Each Condition is | |||
Host: www.foo.bar | defined in terms of an entity-tag or state-token, potentially negated | |||
Destination: http://www.foo.bar/resource2 | by the prefix "Not". | |||
If: <http://www.foo.bar/resource1> (<locktoken:a-write-lock-token> | ||||
[W/"A weak ETag"]) (["strong ETag"]) | ||||
<http://www.bar.bar/random>(["another strong ETag"]) | ||||
In this example http://www.foo.bar/resource1 is being copied to | Note that the If header syntax does not allow multiple instances of | |||
http://www.foo.bar/resource2. When the method is first applied to | If headers in a single request. However, the HTTP header syntax | |||
http://www.foo.bar/resource1, resource1 must be in the state | allows extending single header values across multiple lines, by | |||
specified by "(<locktoken:a-write-lock-token> [W/"A weak ETag"]) | inserting a line break followed by whitespace (see [RFC2616], Section | |||
(["strong ETag"])", that is, it either must be locked with a lock | 4.2). | |||
token of "locktoken:a-write-lock-token" and have a weak entity tag | ||||
W/"A weak ETag" or it must have a strong entity tag "strong ETag". | ||||
That is the only success condition since the resource | 10.4.3. List Evaluation | |||
http://www.bar.bar/random never has the method applied to it (the | ||||
only other resource listed in the If header) and | ||||
http://www.foo.bar/resource2 is not listed in the If header. | ||||
9.4.3. not Production | A Condition that consists of a single entity-tag or state-token | |||
evaluates to true if the resource matches the described state (where | ||||
the individual matching functions are defined below in | ||||
Section 10.4.4). Prefixing it with "Not" reverses the result of the | ||||
evaluation (thus, the "Not" applies only to the subsequent entity-tag | ||||
or state-token). | ||||
Every state token or ETag is either current, and hence describes the | Each List production describes a series of conditions. The whole | |||
state of a resource, or is not current, and does not describe the | list evaluates to true if and only if each condition evaluates to | |||
state of a resource. The boolean operation of matching a state token | true (that is, the list represents a logical conjunction of | |||
or ETag to the current state of a resource thus resolves to a true or | Conditions). | |||
false value. The not production is used to reverse that value. The | ||||
scope of the not production is the state-token or entity-tag | ||||
immediately following it. | ||||
If: (Not <locktoken:write1> <locktoken:write2>) | Each No-tag-list and Tagged-list production may contain one or more | |||
Lists. They evaluate to true if and only if any of the contained | ||||
lists evaluates to true (that is, if there's more than one List, that | ||||
List sequence represents a logical disjunction of the Lists). | ||||
When submitted with a request, this If header requires that all | Finally, the whole If header evaluates to true if and only if at | |||
operand resources must not be locked with locktoken:write1 and must | least one of the No-tag-list or Tagged-list productions evaluates to | |||
be locked with locktoken:write2. | true. If the header evaluates to false, the server MUST reject the | |||
request with a 412 (Precondition Failed) status. Otherwise, | ||||
execution of the request can proceed as if the header wasn't present. | ||||
9.4.4. Matching Function | 10.4.4. Matching State Tokens and ETags | |||
When performing If header processing, the definition of a matching | When performing If header processing, the definition of a matching | |||
state token or entity tag is as follows. | state token or entity tag is as follows: | |||
Identifying a resource: The resource is identified by the URI along | ||||
with the token, in tagged list production, or by the Request-URI in | ||||
untagged list production. | ||||
Matching entity tag: Where the entity tag matches an entity tag | Matching entity tag: Where the entity tag matches an entity tag | |||
associated with that resource. | associated with the identified resource. Servers MUST use either the | |||
weak or the strong comparison function defined in Section 13.3.3 of | ||||
[RFC2616]. | ||||
Matching state token: Where there is an exact match between the state | Matching state token: Where there is an exact match between the state | |||
token in the If header and any state token on the resource. | token in the If header and any state token on the identified | |||
resource. A lock state token is considered to match if the resource | ||||
is anywhere in the scope of the lock. | ||||
9.4.5. If Header and Non-DAV Compliant Proxies | Handling unmapped URLs: for both ETags and state tokens, treat as if | |||
the URL identified a resource that exists but does not have the | ||||
specified state. | ||||
Non-DAV compliant proxies will not honor the If header, since they | 10.4.5. If Header and Non-DAV Aware Proxies | |||
will not understand the If header, and HTTP requires non-understood | ||||
Non-DAV aware proxies will not honor the If header, since they will | ||||
not understand the If header, and HTTP requires non-understood | ||||
headers to be ignored. When communicating with HTTP/1.1 proxies, the | headers to be ignored. When communicating with HTTP/1.1 proxies, the | |||
"Cache-Control: no-cache" request header MUST be used so as to | client MUST use the "Cache-Control: no-cache" request header so as to | |||
prevent the proxy from improperly trying to service the request from | prevent the proxy from improperly trying to service the request from | |||
its cache. When dealing with HTTP/1.0 proxies the "Pragma: no-cache" | its cache. When dealing with HTTP/1.0 proxies the "Pragma: no-cache" | |||
request header MUST be used for the same reason. | request header MUST be used for the same reason. | |||
9.5. Lock-Token Header | As in general clients may not be able to reliably detect non-DAV | |||
aware intermediates, they are advised to always prevent caching using | ||||
the request directives mentioned above. | ||||
10.4.6. Example - No-tag Production | ||||
If: (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> | ||||
["I am an ETag"]) | ||||
(["I am another ETag"]) | ||||
The previous header would require that the resource identified in the | ||||
Request-URI be locked with the specified lock token and be in the | ||||
state identified by the "I am an ETag" ETag or in the state | ||||
identified by the second ETag "I am another ETag". | ||||
To put the matter more plainly one can think of the previous If | ||||
header as expressing the condition below: | ||||
( | ||||
is-locked-with(urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2) AND | ||||
matches-etag("I am an ETag") | ||||
) | ||||
OR | ||||
( | ||||
matches-etag("I am another ETag") | ||||
) | ||||
10.4.7. Example - using "Not" with No-tag Production | ||||
If: (Not <urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> | ||||
<urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092>) | ||||
This If header requires that the resource must not be locked with a | ||||
lock having the lock token | ||||
urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2 and must be locked by a | ||||
lock with the lock token | ||||
urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092. | ||||
10.4.8. Example - causing a Condition to always evaluate to True | ||||
There may be cases where a client wishes to submit state tokens, but | ||||
doesn't want the request to fail just because the state token isn't | ||||
current anymore. One simple way to do this is to include a Condition | ||||
that is known to always evaluate to true, such as in: | ||||
If: (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>) | ||||
(Not <DAV:no-lock>) | ||||
"DAV:no-lock" is known to never represent a current lock token, as | ||||
lock tokens are assigned by the server, following the uniqueness | ||||
requirements described in Section 6.5, therefore in particular | ||||
exclude URIs in the "DAV:" scheme. Thus, by applying "Not" to a | ||||
known not to be current state token, the Condition always evaluates | ||||
to true. Consequently, the whole If header will always evaluate to | ||||
true, and the lock token | ||||
urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2 will be submitted in | ||||
any case. | ||||
10.4.9. Example - Tagged List If header in COPY | ||||
>>Request | ||||
COPY /resource1 HTTP/1.1 | ||||
Host: www.example.com | ||||
Destination: /resource2 | ||||
If: </resource1> | ||||
(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> | ||||
[W/"A weak ETag"]) (["strong ETag"]) | ||||
In this example http://www.example.com/resource1 is being copied to | ||||
http://www.example.com/resource2. When the method is first applied | ||||
to http://www.example.com/resource1, resource1 must be in the state | ||||
specified by "(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> [W/"A | ||||
weak ETag"]) (["strong ETag"])", that is, it either must be locked | ||||
with a lock token of "urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2" | ||||
and have a weak entity tag W/"A weak ETag" or it must have a strong | ||||
entity tag "strong ETag". | ||||
10.4.10. Example - Matching lock tokens with collection locks | ||||
DELETE /specs/rfc2518.txt HTTP/1.1 | ||||
Host: www.example.com | ||||
If: <http://www.example.com/specs/> | ||||
(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>) | ||||
For this example, the lock token must be compared to the identified | ||||
resource, which is the 'specs' collection identified by the URL in | ||||
the tagged list production. If the 'specs' collection is not locked | ||||
by a lock with the specified lock token, the request MUST fail. | ||||
Otherwise, this request could succeed, because the If header | ||||
evaluates to true, and because the lock token for the lock affecting | ||||
the affected resource has been submitted. | ||||
10.4.11. Example - Matching ETags on unmapped URLs | ||||
Consider a collection "/specs" that does not contain the member | ||||
"/specs/rfc2518.doc". In this case, the If header | ||||
If: </specs/rfc2518.doc> (["4217"]) | ||||
will evaluate to false (the URI isn't mapped, thus the resource | ||||
identified by the URI doesn't have an entity matching the ETag | ||||
"4217"). | ||||
On the other hand, an If header of | ||||
If: </specs/rfc2518.doc> (Not ["4217"]) | ||||
will consequently evaluate to true. | ||||
Note that as defined above in Section 10.4.4, the same considerations | ||||
apply to matching state tokens. | ||||
10.5. Lock-Token Header | ||||
Lock-Token = "Lock-Token" ":" Coded-URL | Lock-Token = "Lock-Token" ":" Coded-URL | |||
The Lock-Token request header is used with the UNLOCK method to | The Lock-Token request header is used with the UNLOCK method to | |||
identify the lock to be removed. The lock token in the Lock-Token | identify the lock to be removed. The lock token in the Lock-Token | |||
request header MUST identify a lock that contains the resource | request header MUST identify a lock that contains the resource | |||
identified by Request-URI as a member. | identified by Request-URI as a member. | |||
The Lock-Token response header is used with the LOCK method to | The Lock-Token response header is used with the LOCK method to | |||
indicate the lock token created as a result of a successful LOCK | indicate the lock token created as a result of a successful LOCK | |||
request to create a new lock. | request to create a new lock. | |||
9.6. Overwrite Header | 10.6. Overwrite Header | |||
Overwrite = "Overwrite" ":" ("T" | "F") | Overwrite = "Overwrite" ":" ("T" | "F") | |||
The Overwrite header specifies whether the server should overwrite | The Overwrite request header specifies whether the server should | |||
the state of a non-null destination resource during a COPY or MOVE. | overwrite a resource mapped to the destination URL during a COPY or | |||
A value of "F" states that the server must not perform the COPY or | MOVE. A value of "F" states that the server must not perform the | |||
MOVE operation if the state of the destination resource is non-null. | COPY or MOVE operation if the destination URL does map to a resource. | |||
If the overwrite header is not included in a COPY or MOVE request | If the overwrite header is not included in a COPY or MOVE request | |||
then the resource MUST treat the request as if it has an overwrite | then the resource MUST treat the request as if it has an overwrite | |||
header of value "T". While the Overwrite header appears to duplicate | header of value "T". While the Overwrite header appears to duplicate | |||
the functionality of the If-Match: * header of HTTP/1.1, If-Match | the functionality of using a "If-Match: *" header (see [RFC2616]), | |||
applies only to the Request-URI, and not to the Destination of a COPY | If-Match applies only to the Request-URI, and not to the Destination | |||
or MOVE. | of a COPY or MOVE. | |||
If a COPY or MOVE is not performed due to the value of the Overwrite | If a COPY or MOVE is not performed due to the value of the Overwrite | |||
header, the method MUST fail with a 412 (Precondition Failed) status | header, the method MUST fail with a 412 (Precondition Failed) status | |||
code. | code. The server MUST do authorization checks before checking this | |||
or any conditional header. | ||||
All DAV compliant resources MUST support the Overwrite header. | All DAV compliant resources MUST support the Overwrite header. | |||
9.7. Status-URI Response Header | 10.7. Timeout Request Header | |||
The Status-URI response header may be used with the 102 (Processing) | ||||
status code to inform the client as to the status of a method. | ||||
Status-URI = "Status-URI" ":" *(Status-Code Coded-URL) ; Status-Code | ||||
is defined in Section 6.1.1 of [RFC2068] | ||||
The URIs listed in the header are source resources which have been | ||||
affected by the outstanding method. The status code indicates the | ||||
resolution of the method on the identified resource. So, for | ||||
example, if a MOVE method on a collection is outstanding and a 102 | ||||
(Processing) response with a Status-URI response header is returned, | ||||
the included URIs will indicate resources that have had move | ||||
attempted on them and what the result was. | ||||
9.8. Timeout Request Header | ||||
TimeOut = "Timeout" ":" 1#TimeType | TimeOut = "Timeout" ":" 1#TimeType | |||
TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other) | TimeType = ("Second-" DAVTimeOutVal | "Infinite") | |||
DAVTimeOutVal = 1*digit | ; No LWS allowed within TimeType | |||
Other = "Extend" field-value ; See section 4.2 of [RFC2068] | DAVTimeOutVal = 1*DIGIT | |||
Clients may include Timeout headers in their LOCK requests. However, | ||||
the server is not required to honor or even consider these requests. | ||||
Clients MUST NOT submit a Timeout request header with any method | ||||
other than a LOCK method. | ||||
A Timeout request header MUST contain at least one TimeType and may | ||||
contain multiple TimeType entries. The purpose of listing multiple | ||||
TimeType entries is to indicate multiple different values and value | ||||
types that are acceptable to the client. The client lists the | ||||
TimeType entries in order of preference. | ||||
Timeout response values MUST use a Second value, Infinite, or a | Clients MAY include Timeout request headers in their LOCK requests. | |||
TimeType the client has indicated familiarity with. The server may | However, the server is not required to honor or even consider these | |||
assume a client is familiar with any TimeType submitted in a Timeout | requests. Clients MUST NOT submit a Timeout request header with any | |||
header. | method other than a LOCK method. | |||
The "Second" TimeType specifies the number of seconds that will | The "Second" TimeType specifies the number of seconds that will | |||
elapse between granting of the lock at the server, and the automatic | elapse between granting of the lock at the server, and the automatic | |||
removal of the lock. The timeout value for TimeType "Second" MUST | removal of the lock. The timeout value for TimeType "Second" MUST | |||
NOT be greater than 2^32-1. | NOT be greater than 2^32-1. | |||
The timeout counter SHOULD be restarted any time an owner of the lock | See Section 6.6 for a description of lock timeout behavior. | |||
sends a method to any member of the lock, including unsupported | ||||
methods, or methods which are unsuccessful. However the lock MUST be | ||||
refreshed if a refresh LOCK method is successfully received. | ||||
If the timeout expires then the lock may be lost. Specifically, if | ||||
the server wishes to harvest the lock upon time-out, the server | ||||
SHOULD act as if an UNLOCK method was executed by the server on the | ||||
resource using the lock token of the timed-out lock, performed with | ||||
its override authority. Thus logs should be updated with the | ||||
disposition of the lock, notifications should be sent, etc., just as | ||||
they would be for an UNLOCK request. | ||||
Servers are advised to pay close attention to the values submitted by | ||||
clients, as they will be indicative of the type of activity the | ||||
client intends to perform. For example, an applet running in a | ||||
browser may need to lock a resource, but because of the instability | ||||
of the environment within which the applet is running, the applet may | ||||
be turned off without warning. As a result, the applet is likely to | ||||
ask for a relatively small timeout value so that if the applet dies, | ||||
the lock can be quickly harvested. However, a document management | ||||
system is likely to ask for an extremely long timeout because its | ||||
user may be planning on going off-line. | ||||
A client MUST NOT assume that just because the time-out has expired | ||||
the lock has been lost. | ||||
10. Status Code Extensions to HTTP/1.1 | 11. Status Code Extensions to HTTP/1.1 | |||
The following status codes are added to those defined in HTTP/1.1 | The following status codes are added to those defined in HTTP/1.1 | |||
[RFC2068]. | [RFC2616]. | |||
10.1. 102 Processing | ||||
The 102 (Processing) status code is an interim response used to | ||||
inform the client that the server has accepted the complete request, | ||||
but has not yet completed it. This status code SHOULD only be sent | ||||
when the server has a reasonable expectation that the request will | ||||
take significant time to complete. As guidance, if a method is | ||||
taking longer than 20 seconds (a reasonable, but arbitrary value) to | ||||
process the server SHOULD return a 102 (Processing) response. The | ||||
server MUST send a final response after the request has been | ||||
completed. | ||||
Methods can potentially take a long period of time to process, | ||||
especially methods that support the Depth header. In such cases the | ||||
client may time-out the connection while waiting for a response. To | ||||
prevent this the server may return a 102 (Processing) status code to | ||||
indicate to the client that the server is still processing the | ||||
method. | ||||
10.2. 207 Multi-Status | 11.1. 207 Multi-Status | |||
The 207 (Multi-Status) status code provides status for multiple | The 207 (Multi-Status) status code provides status for multiple | |||
independent operations (see Section 11 for more information). | independent operations (see Section 13 for more information). | |||
10.3. 422 Unprocessable Entity | 11.2. 422 Unprocessable Entity | |||
The 422 (Unprocessable Entity) status code means the server | The 422 (Unprocessable Entity) status code means the server | |||
understands the content type of the request entity (hence a | understands the content type of the request entity (hence a | |||
415(Unsupported Media Type) status code is inappropriate), and the | 415(Unsupported Media Type) status code is inappropriate), and the | |||
syntax of the request entity is correct (thus a 400 (Bad Request) | syntax of the request entity is correct (thus a 400 (Bad Request) | |||
status code is inappropriate) but was unable to process the contained | status code is inappropriate) but was unable to process the contained | |||
instructions. For example, this error condition may occur if an XML | instructions. For example, this error condition may occur if an XML | |||
request body contains well-formed (i.e., syntactically correct), but | request body contains well-formed (i.e., syntactically correct), but | |||
semantically erroneous XML instructions. | semantically erroneous XML instructions. | |||
10.4. 423 Locked | 11.3. 423 Locked | |||
The 423 (Locked) status code means the source or destination resource | The 423 (Locked) status code means the source or destination resource | |||
of a method is locked. | of a method is locked. This response SHOULD contain an appropriate | |||
precondition or postcondition code, such as 'lock-token-submitted' or | ||||
'no-conflicting-lock". | ||||
10.5. 424 Failed Dependency | 11.4. 424 Failed Dependency | |||
The 424 (Failed Dependency) status code means that the method could | The 424 (Failed Dependency) status code means that the method could | |||
not be performed on the resource because the requested action | not be performed on the resource because the requested action | |||
depended on another action and that action failed. For example, if a | depended on another action and that action failed. For example, if a | |||
command in a PROPPATCH method fails then, at minimum, the rest of the | command in a PROPPATCH method fails then, at minimum, the rest of the | |||
commands will also fail with 424 (Failed Dependency). | commands will also fail with 424 (Failed Dependency). | |||
10.6. 507 Insufficient Storage | 11.5. 507 Insufficient Storage | |||
The 507 (Insufficient Storage) status code means the method could not | The 507 (Insufficient Storage) status code means the method could not | |||
be performed on the resource because the server is unable to store | be performed on the resource because the server is unable to store | |||
the representation needed to successfully complete the request. This | the representation needed to successfully complete the request. This | |||
condition is considered to be temporary. If the request which | condition is considered to be temporary. If the request which | |||
received this status code was the result of a user action, the | received this status code was the result of a user action, the | |||
request MUST NOT be repeated until it is requested by a separate user | request MUST NOT be repeated until it is requested by a separate user | |||
action. | action. | |||
11. Multi-Status Response | 12. Use of HTTP Status Codes | |||
The default 207 (Multi-Status) response body is a text/xml or | These HTTP codes are not redefined, but their use is somewhat | |||
application/xml HTTP entity that contains a single XML element called | extended by WebDAV methods and requirements. In general, many HTTP | |||
multistatus, which contains a set of XML elements called response | status codes can be used in response to any request, not just in | |||
which contain 200, 300, 400, and 500 series status codes generated | cases described in this document. Note also that WebDAV servers are | |||
during the method invocation. 100 series status codes SHOULD NOT be | known to use 300-level redirect responses (and early interoperability | |||
recorded in a response XML element. | tests found clients unprepared to see those responses). A 300-level | |||
response MUST NOT be used when the server has created a new resource | ||||
in response to the request. | ||||
12. XML Element Definitions | 12.1. 412 Precondition Failed | |||
In the section below, the final line of each section gives the | Any request can contain a conditional header defined in HTTP (If- | |||
element type declaration using the format defined in [REC-XML]. The | Match, If-Modified-Since, etc.) or the "If" or "Overwrite" | |||
"Value" field, where present, specifies further restrictions on the | conditional headers defined in this specification. If the server | |||
allowable contents of the XML element using BNF (i.e., to further | evaluates a conditional header, and if that condition fails to hold, | |||
restrict the values of a PCDATA element). | then this error code MUST be returned. On the other hand, if the | |||
client did not include a conditional header in the request, then the | ||||
server MUST NOT use this status code. | ||||
12.1. activelock XML Element | 12.2. 414 Request-URI Too Long | |||
Name: activelock | This status code is used in HTTP 1.1 only for Request-URIs, not URIs | |||
in other locations. | ||||
Namespace: DAV: | 13. Multi-Status Response | |||
Purpose: Describes a lock on a resource. | A Multi-Status response conveys information about multiple resources | |||
in situations where multiple status codes might be appropriate. The | ||||
default Multi-Status response body is a text/xml or application/xml | ||||
HTTP entity with a 'multistatus' root element. Further elements | ||||
contain 200, 300, 400, and 500 series status codes generated during | ||||
the method invocation. 100 series status codes SHOULD NOT be recorded | ||||
in a 'response' XML element. | ||||
<!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?, | Although '207' is used as the overall response status code, the | |||
locktoken?) > | recipient needs to consult the contents of the multistatus response | |||
body for further information about the success or failure of the | ||||
method execution. The response MAY be used in success, partial | ||||
success and also in failure situations. | ||||
12.1.1. depth XML Element | The 'multistatus' root element holds zero or more 'response' elements | |||
in any order, each with information about an individual resource. | ||||
Each 'response' element MUST have an 'href' element to identify the | ||||
resource. | ||||
Name: depth | A Multi-Status response uses one out of two distinct formats for | |||
representing the status: | ||||
Namespace: DAV: | 1. A 'status' element as child of the 'response' element indicates | |||
the status of the message execution for the identified resource | ||||
as a whole (for instance, see Section 9.6.2). Some method | ||||
definitions provide information about specific status codes | ||||
clients should be prepared to see in a response. However, | ||||
clients MUST be able to handle other status codes, using the | ||||
generic rules defined in Section 10 of [RFC2616]. | ||||
Purpose: The value of the Depth header. | 2. For PROPFIND and PROPPATCH, the format has been extended using | |||
the 'propstat' element instead of 'status', providing information | ||||
about individual properties of a resource. This format is | ||||
specific to PROPFIND and PROPPATCH, and is described in detail in | ||||
Section 9.1 and Section 9.2. | ||||
Value: "0" | "1" | "infinity" | 13.1. Response Headers | |||
<!ELEMENT depth (#PCDATA) > | HTTP defines the Location header to indicate a preferred URL for the | |||
resource that was addressed in the Request-URI (e.g. in response to | ||||
successful PUT requests or in redirect responses). However, use of | ||||
this header creates ambiguity when there are URLs in the body of the | ||||
response, as with Multi-Status. Thus, use of the Location header | ||||
with the Multi-Status response is intentionally undefined. | ||||
12.1.2. locktoken XML Element | 13.2. Handling Redirected Child Resources | |||
Name: locktoken | Redirect responses (300-303, 305 and 307) defined in HTTP 1.1 | |||
normally take a Location header to indicate the new URI for the | ||||
single resource redirected from the Request-URI. Multi-Status | ||||
responses contain many resource addresses, but the original | ||||
definition in [RFC2518] did not have any place for the server to | ||||
provide the new URI for redirected resources. This specification | ||||
does define a 'location' element for this information (see | ||||
Section 14.9). Servers MUST use this new element with redirect | ||||
responses in Multi-Status. | ||||
Namespace: DAV: | Clients encountering redirected resources in Multi-Status MUST NOT | |||
rely on the 'location' element being present with a new URI. If the | ||||
element is not present, the client MAY reissue the request to the | ||||
individual redirected resource, because the response to that request | ||||
can be redirected with a Location header containing the new URI. | ||||
Purpose: The lock token associated with a lock. | 13.3. Internal Status Codes | |||
Description: The href contains one or more opaque lock token URIs | Section 9.2.1, Section 9.1.2, Section 9.6.1, Section 9.8.3 and | |||
which all refer to the same lock (i.e., the OpaqueLockToken-URI | Section 9.9.2 define various status codes used in Multi-Status | |||
production in Section 6.4). | responses. This specification does not define the meaning of other | |||
status codes that could appear in these responses. | ||||
<!ELEMENT locktoken (href+) > | 14. XML Element Definitions | |||
12.1.3. timeout XML Element | In this section, the final line of each section gives the element | |||
type declaration using the format defined in [REC-XML]. The "Value" | ||||
field, where present, specifies further restrictions on the allowable | ||||
contents of the XML element using BNF (i.e., to further restrict the | ||||
values of a PCDATA element). Note that all of the elements defined | ||||
here may be extended according to the rules defined in Section 17. | ||||
All elements defined here are in the "DAV:" namespace. | ||||
Name: timeout | 14.1. activelock XML Element | |||
Namespace: DAV: | Name: activelock | |||
Purpose: The timeout associated with a lock | Purpose: Describes a lock on a resource. | |||
Value: TimeType ;Defined in Section 9.8 | <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?, | |||
locktoken?, lockroot)> | ||||
<!ELEMENT timeout (#PCDATA) > | 14.2. allprop XML Element | |||
12.2. collection XML Element | Name: allprop | |||
Name: collection | Purpose: Specifies that all names and values of dead properties and | |||
the live properties defined by this document existing on the | ||||
resource are to be returned. | ||||
Namespace: DAV: | <!ELEMENT allprop EMPTY > | |||
Purpose: Identifies the associated resource as a collection. The | 14.3. collection XML Element | |||
resourcetype property of a collection resource MUST have this | ||||
value. | ||||
<!ELEMENT collection EMPTY > | Name: collection | |||
12.3. href XML Element | Purpose: Identifies the associated resource as a collection. The | |||
DAV:resourcetype property of a collection resource MUST contain | ||||
this element. It is normally empty but extensions may add sub- | ||||
elements. | ||||
Name: href | <!ELEMENT collection EMPTY > | |||
Namespace: DAV: | ||||
Purpose: Identifies the content of the element as a URI. | 14.4. depth XML Element | |||
Value: URI ; See section 3.2.1 of [RFC2068] | Name: depth | |||
Purpose: Used for representing depth values in XML content (e.g. in | ||||
lock information). | ||||
<!ELEMENT href (#PCDATA)> | Value: "0" | "1" | "infinity" | |||
12.4. link XML Element | <!ELEMENT depth (#PCDATA) > | |||
Name: link | 14.5. error XML Element | |||
Namespace: DAV: | Name: error | |||
Purpose: Identifies the property as a link and contains the source | Purpose: Error responses, particularly 403 Forbidden and 409 | |||
and destination of that link. | Conflict, sometimes need more information to indicate what went | |||
wrong. In these cases, servers MAY return an XML response body | ||||
with a document element of 'error', containing child elements | ||||
identifying particular condition codes. | ||||
Description: The link XML element is used to provide the sources and | Description: Contains at least one XML element, and MUST NOT | |||
destinations of a link. The name of the property containing the | contain text or mixed content. Any element that is a child of the | |||
link XML element provides the type of the link. Link is a multi- | 'error' element is considered to be a precondition or | |||
valued element, so multiple links may be used together to indicate | postcondition code. Unrecognized elements MUST be ignored. | |||
multiple links with the same type. The values in the href XML | ||||
elements inside the src and dst XML elements of the link XML | ||||
element MUST NOT be rejected if they point to resources which do | ||||
not exist. | ||||
<!ELEMENT link (src+, dst+) > | <!ELEMENT error ANY > | |||
12.4.1. dst XML Element | 14.6. exclusive XML Element | |||
Name: dst | Name: exclusive | |||
Namespace: DAV: | Purpose: Specifies an exclusive lock. | |||
Purpose: Indicates the destination of a link | <!ELEMENT exclusive EMPTY > | |||
Value: URI | 14.7. href XML Element | |||
<!ELEMENT dst (#PCDATA) > | Name: href | |||
12.4.2. src XML Element | Purpose: MUST contain a URI or a relative reference. | |||
Name: src | ||||
Namespace: DAV: | Description: There may be limits on the value of 'href' depending | |||
on the context of its use. Refer to the specification text where | ||||
'href' is used to see what limitations apply in each case. | ||||
Purpose: Indicates the source of a link. | Value: Simple-ref | |||
Value: URI | <!ELEMENT href (#PCDATA)> | |||
<!ELEMENT src (#PCDATA) > | 14.8. include XML Element | |||
12.5. lockentry XML Element | Name: include | |||
Name: lockentry | Purpose: Any child element represents the name of a property to be | |||
included in the PROPFIND response. All elements inside an | ||||
'include' XML element MUST define properties related to the | ||||
resource, although possible property names are in no way limited | ||||
to those property names defined in this document or other | ||||
standards. This element MUST NOT contain text or mixed content. | ||||
Namespace: DAV: | <!ELEMENT include ANY > | |||
Purpose: Defines the types of locks that can be used with the | 14.9. location XML Element | |||
resource. | ||||
<!ELEMENT lockentry (lockscope, locktype) > | Name: location | |||
12.6. lockinfo XML Element | Purpose: HTTP defines the "Location" header (see [RFC2616], Section | |||
14.30) for use with some status codes (such as 201 and the 300 | ||||
series codes). When these codes are used inside a 'multistatus' | ||||
element, the 'location' element can be used to provide the | ||||
accompanying Location header value. | ||||
Name: lockinfo | Description: Contains a single href element with the same value | |||
that would be used in a Location header. | ||||
Namespace: DAV: | <!ELEMENT location (href)> | |||
Purpose: The lockinfo XML element is used with a LOCK method to | 14.10. lockentry XML Element | |||
Name: lockentry | ||||
Purpose: Defines the types of locks that can be used with the | ||||
resource. | ||||
<!ELEMENT lockentry (lockscope, locktype) > | ||||
14.11. lockinfo XML Element | ||||
Name: lockinfo | ||||
Purpose: The 'lockinfo' XML element is used with a LOCK method to | ||||
specify the type of lock the client wishes to have created. | specify the type of lock the client wishes to have created. | |||
<!ELEMENT lockinfo (lockscope, locktype, owner?) > | <!ELEMENT lockinfo (lockscope, locktype, owner?) > | |||
12.7. lockscope XML Element | 14.12. lockroot XML Element | |||
Name: lockscope | Name: lockroot | |||
Namespace: DAV: | Purpose: Contains the root URL of the lock, which is the URL | |||
through which the resource was addressed in the LOCK request. | ||||
Purpose: Specifies whether a lock is an exclusive lock, or a shared | Description: The href element contains the root of the lock. The | |||
server SHOULD include this in all DAV:lockdiscovery property | ||||
values and the response to LOCK requests. | ||||
<!ELEMENT lockroot (href) > | ||||
14.13. lockscope XML Element | ||||
Name: lockscope | ||||
Purpose: Specifies whether a lock is an exclusive lock, or a shared | ||||
lock. | lock. | |||
<!ELEMENT lockscope (exclusive | shared) > | <!ELEMENT lockscope (exclusive | shared) > | |||
12.7.1. exclusive XML Element | 14.14. locktoken XML Element | |||
Name: exclusive | Name: locktoken | |||
Namespace: DAV: | Purpose: The lock token associated with a lock. | |||
Purpose: Specifies an exclusive lock | Description: The href contains a single lock token URI which refers | |||
to the lock. | ||||
<!ELEMENT exclusive EMPTY > | <!ELEMENT locktoken (href) > | |||
12.7.2. shared XML Element | 14.15. locktype XML Element | |||
Name: shared | Name: locktype | |||
Namespace: DAV: | Purpose: Specifies the access type of a lock. At present, this | |||
specification only defines one lock type, the write lock. | ||||
Purpose: Specifies a shared lock | <!ELEMENT locktype (write) > | |||
<!ELEMENT shared EMPTY > | 14.16. multistatus XML Element | |||
12.8. locktype XML Element | Name: multistatus | |||
Name: locktype | Purpose: Contains multiple response messages. | |||
Namespace: DAV: | Description: The 'responsedescription' element at the top level is | |||
used to provide a general message describing the overarching | ||||
nature of the response. If this value is available an application | ||||
may use it instead of presenting the individual response | ||||
descriptions contained within the responses. | ||||
Purpose: Specifies the access type of a lock. At present, this | <!ELEMENT multistatus (response*, responsedescription?) > | |||
specification only defines one lock type, the write lock. | ||||
<!ELEMENT locktype (write) > | 14.17. owner XML Element | |||
12.8.1. write XML Element | Name: owner | |||
Name: write | Purpose: Provides information about the creator of a lock. | |||
Namespace: DAV: | Description: Allows a client to provide information sufficient for | |||
either directly contacting a principal (such as a telephone number | ||||
or Email URI), or for discovering the principal (such as the URL | ||||
of a homepage) who created a lock. The value provided MUST be | ||||
treated as a dead property in terms of XML Information Item | ||||
preservation. The server MUST NOT alter the value unless the | ||||
owner value provided by the client is empty. For a certain amount | ||||
of interoperability between different client implementations, if | ||||
clients have URI-formatted contact information for the lock | ||||
creator suitable for user display, then clients SHOULD put those | ||||
URIs in 'href' child elements of the 'owner' element. | ||||
Purpose: Specifies a write lock. | Extensibility: MAY be extended with child elements, mixed content, | |||
text content or attributes. | ||||
<!ELEMENT write EMPTY > | <!ELEMENT owner ANY > | |||
12.9. multistatus XML Element | 14.18. prop XML Element | |||
Name: multistatus | Name: prop | |||
Namespace: DAV: | Purpose: Contains properties related to a resource. | |||
Purpose: Contains multiple response messages. | Description: A generic container for properties defined on | |||
resources. All elements inside a 'prop' XML element MUST define | ||||
properties related to the resource, although possible property | ||||
names are in no way limited to those property names defined in | ||||
this document or other standards. This element MUST NOT contain | ||||
text or mixed content. | ||||
Description: The responsedescription at the top level is used to | <!ELEMENT prop ANY > | |||
provide a general message describing the overarching nature of the | ||||
response. If this value is available an application may use it | ||||
instead of presenting the individual response descriptions | ||||
contained within the responses. | ||||
<!ELEMENT multistatus (response+, responsedescription?) > | 14.19. propertyupdate XML Element | |||
12.9.1. response XML Element | Name: propertyupdate | |||
Name: response | Purpose: Contains a request to alter the properties on a resource. | |||
Namespace: DAV: | Description: This XML element is a container for the information | |||
required to modify the properties on the resource. | ||||
Purpose: Holds a single response describing the effect of a method | <!ELEMENT propertyupdate (remove | set)+ > | |||
on resource and/or its properties. | ||||
Description: A particular href MUST NOT appear more than once as the | 14.20. propfind XML Element | |||
child of a response XML element under a multistatus XML element. | ||||
This requirement is necessary in order to keep processing costs | ||||
for a response to linear time. Essentially, this prevents having | ||||
to search in order to group together all the responses by href. | ||||
There are, however, no requirements regarding ordering based on | ||||
href values. | ||||
<!ELEMENT response (href, ((href*, status)|(propstat+)), | Name: propfind | |||
responsedescription?) > | ||||
12.9.1.1. propstat XML Element | Purpose: Specifies the properties to be returned from a PROPFIND | |||
method. Four special elements are specified for use with | ||||
'propfind': 'prop', 'allprop', 'include' and 'propname'. If | ||||
'prop' is used inside 'propfind' it MUST NOT contain property | ||||
values. | ||||
Name: propstat | <!ELEMENT propfind ( propname | (allprop, include?) | prop ) > | |||
Namespace: DAV: | 14.21. propname XML Element | |||
Purpose: Groups together a prop and status element that is | Name: propname | |||
associated with a particular href element. | ||||
Description: The propstat XML element MUST contain one prop XML | Purpose: Specifies that only a list of property names on the | |||
resource is to be returned. | ||||
<!ELEMENT propname EMPTY > | ||||
14.22. propstat XML Element | ||||
Name: propstat | ||||
Purpose: Groups together a prop and status element that is | ||||
associated with a particular 'href' element. | ||||
Description: The propstat XML element MUST contain one prop XML | ||||
element and one status XML element. The contents of the prop XML | element and one status XML element. The contents of the prop XML | |||
element MUST only list the names of properties to which the result | element MUST only list the names of properties to which the result | |||
in the status element applies. | in the status element applies. The optional precondition/ | |||
postcondition element and 'responsedescription' text also apply to | ||||
<!ELEMENT propstat (prop, status, responsedescription?) > | the properties named in 'prop'. | |||
12.9.1.2. status XML Element | <!ELEMENT propstat (prop, status, error?, responsedescription?) > | |||
Name: status | 14.23. remove XML Element | |||
Namespace: DAV: | Name: remove | |||
Purpose: Holds a single HTTP status-line | Purpose: Lists the properties to be removed from a resource. | |||
Value: status-line ;status-line defined in [RFC2068] | Description: Remove instructs that the properties specified in prop | |||
should be removed. Specifying the removal of a property that does | ||||
not exist is not an error. All the XML elements in a 'prop' XML | ||||
element inside of a 'remove' XML element MUST be empty, as only | ||||
the names of properties to be removed are required. | ||||
<!ELEMENT status (#PCDATA) > | <!ELEMENT remove (prop) > | |||
12.9.2. responsedescription XML Element | 14.24. response XML Element | |||
Name: responsedescription | Name: response | |||
Namespace: DAV: | Purpose: Holds a single response describing the effect of a method | |||
on resource and/or its properties. | ||||
Purpose: Contains a message that can be displayed to the user | Description: The 'href' element contains a HTTP URL pointing to a | |||
explaining the nature of the response. | WebDAV resource when used in the 'response' container. A | |||
particular 'href' value MUST NOT appear more than once as the | ||||
child of a 'response' XML element under a 'multistatus' XML | ||||
element. This requirement is necessary in order to keep | ||||
processing costs for a response to linear time. Essentially, this | ||||
prevents having to search in order to group together all the | ||||
responses by 'href'. There are, however, no requirements | ||||
regarding ordering based on 'href' values. The optional | ||||
precondition/postcondition element and 'responsedescription' text | ||||
can provide additional information about this resource relative to | ||||
the request or result. | ||||
Description: This XML element provides information suitable to be | <!ELEMENT response (href, ((href*, status)|(propstat+)), | |||
presented to a user. | error?, responsedescription? , location?) > | |||
<!ELEMENT responsedescription (#PCDATA) > | 14.25. responsedescription XML Element | |||
12.10. owner XML Element | Name: responsedescription | |||
Name: owner | Purpose: Contains information about a status response within a | |||
Multi-Status. | ||||
Namespace: DAV: | Description: Provides information suitable to be presented to a | |||
user. | ||||
Purpose: Provides information about the principal taking out a lock. | <!ELEMENT responsedescription (#PCDATA) > | |||
Description: The owner XML element provides information sufficient | 14.26. set XML Element | |||
for either directly contacting a principal (such as a telephone | ||||
number or Email URI), or for discovering the principal (such as | ||||
the URL of a homepage) who owns a lock. | ||||
<!ELEMENT owner ANY> | Name: set | |||
12.11. prop XML element | Purpose: Lists the property values to be set for a resource. | |||
Name: prop | Description: The 'set' element MUST contain only a 'prop' element. | |||
The elements contained by the 'prop' element inside the 'set' | ||||
element MUST specify the name and value of properties that are set | ||||
on the resource identified by Request-URI. If a property already | ||||
exists then its value is replaced. Language tagging information | ||||
appearing in the scope of the 'prop' element (in the "xml:lang" | ||||
attribute, if present) MUST be persistently stored along with the | ||||
property, and MUST be subsequently retrievable using PROPFIND. | ||||
Namespace: DAV: | <!ELEMENT set (prop) > | |||
Purpose: Contains properties related to a resource. | 14.27. shared XML Element | |||
Description: The prop XML element is a generic container for | Name: shared | |||
properties defined on resources. All elements inside a prop XML | ||||
element MUST define properties related to the resource. No other | ||||
elements may be used inside of a prop element. | ||||
<!ELEMENT prop ANY> | Purpose: Specifies a shared lock. | |||
12.12. propertybehavior XML element | <!ELEMENT shared EMPTY > | |||
Name: propertybehavior | 14.28. status XML Element | |||
Namespace: DAV: | Name: status | |||
Purpose: Holds a single HTTP status-line. | ||||
Purpose: Specifies how properties are handled during a COPY or MOVE. | Value: status-line (defined in Section 6.1 of [RFC2616]) | |||
Description: The propertybehavior XML element specifies how | <!ELEMENT status (#PCDATA) > | |||
properties are handled during a COPY or MOVE. If this XML element | ||||
is not included in the request body then the server is expected to | ||||
act as defined by the default property handling behavior of the | ||||
associated method. All WebDAV compliant resources MUST support | ||||
the propertybehavior XML element. | ||||
<!ELEMENT propertybehavior (omit | keepalive) > | 14.29. timeout XML Element | |||
12.12.1. keepalive XML element | Name: timeout | |||
Name: keepalive | Purpose: The number of seconds remaining before a lock expires. | |||
Namespace: DAV: | Value: TimeType (defined in Section 10.7). | |||
Purpose: Specifies requirements for the copying/moving of live | <!ELEMENT timeout (#PCDATA) > | |||
properties. | ||||
Description: If a list of URIs is included as the value of keepalive | 14.30. write XML Element | |||
then the named properties MUST be "live" after they are copied | ||||
(moved) to the destination resource of a COPY (or MOVE). If the | ||||
value "*" is given for the keepalive XML element, this designates | ||||
that all live properties on the source resource MUST be live on | ||||
the destination. If the requirements specified by the keepalive | ||||
element can not be honored then the method MUST fail with a 412 | ||||
(Precondition Failed). All DAV compliant resources MUST support | ||||
the keepalive XML element for use with the COPY and MOVE methods. | ||||
Value: "*" ; #PCDATA value can only be "*" | Name: write | |||
<!ELEMENT keepalive (#PCDATA | href+) > | Purpose: Specifies a write lock. | |||
12.12.2. omit XML element | <!ELEMENT write EMPTY > | |||
Name: omit | 15. DAV Properties | |||
Namespace: DAV: | For DAV properties, the name of the property is also the same as the | |||
name of the XML element that contains its value. In the section | ||||
below, the final line of each section gives the element type | ||||
declaration using the format defined in [REC-XML]. The "Value" | ||||
field, where present, specifies further restrictions on the allowable | ||||
contents of the XML element using BNF (i.e., to further restrict the | ||||
values of a PCDATA element). | ||||
Purpose: The omit XML element instructs the server that it should | A protected property is one which cannot be changed with a PROPPATCH | |||
use best effort to copy properties but a failure to copy a | request. There may be other requests which would result in a change | |||
property MUST NOT cause the method to fail. | to a protected property (as when a LOCK request affects the value of | |||
DAV:lockdiscovery). Note that a given property could be protected on | ||||
one type of resource, but not protected on another type of resource. | ||||
Description: The default behavior for a COPY or MOVE is to copy/move | A computed property is one with a value defined in terms of a | |||
all properties or fail the method. In certain circumstances, such | computation (based on the content and other properties of that | |||
as when a server copies a resource over another protocol such as | resource, or even of some other resource). A computed property is | |||
FTP, it may not be possible to copy/move the properties associated | always a protected property. | |||
with the resource. Thus any attempt to copy/move over FTP would | ||||
always have to fail because properties could not be moved over, | ||||
even as dead properties. All DAV compliant resources MUST support | ||||
the omit XML element on COPY/MOVE methods. | ||||
<!ELEMENT omit EMPTY > | COPY and MOVE behavior refers to local COPY and MOVE operations. | |||
12.13. propertyupdate XML element | For properties defined based on HTTP GET response headers (DAV:get*), | |||
the header value could include LWS as defined in [RFC2616], Section | ||||
4.2. Server implementors SHOULD strip LWS from these values before | ||||
using as WebDAV property values. | ||||
Name: propertyupdate | 15.1. creationdate Property | |||
Namespace: DAV: | Name: creationdate | |||
Purpose: Contains a request to alter the properties on a resource. | Purpose: Records the time and date the resource was created. | |||
Description: This XML element is a container for the information | Value: date-time (defined in [RFC3339], see the ABNF in section | |||
required to modify the properties on the resource. This XML | 5.6.) | |||
element is multi-valued. | ||||
<!ELEMENT propertyupdate (remove | set)+ > | Protected: MAY be protected. Some servers allow DAV:creationdate | |||
to be changed to reflect the time the document was created if that | ||||
is more meaningful to the user (rather than the time it was | ||||
uploaded). Thus, clients SHOULD NOT use this property in | ||||
synchronization logic (use DAV:getetag instead). | ||||
12.13.1. remove XML element | COPY/MOVE behaviour: This property value SHOULD be kept during a | |||
MOVE operation, but is normally re-initialized when a resource is | ||||
created with a COPY. It should not be set in a COPY. | ||||
Name: remove | Description: The DAV:creationdate property SHOULD be defined on all | |||
DAV compliant resources. If present, it contains a timestamp of | ||||
the moment when the resource was created. Servers that are | ||||
incapable of persistently recording the creation date SHOULD | ||||
instead leave it undefined (i.e. report "Not Found"). | ||||
Namespace: DAV: | <!ELEMENT creationdate (#PCDATA) > | |||
Purpose: Lists the DAV properties to be removed from a resource. | 15.2. displayname Property | |||
Description: Remove instructs that the properties specified in prop | Name: displayname | |||
should be removed. Specifying the removal of a property that does | ||||
not exist is not an error. All the XML elements in a prop XML | ||||
element inside of a remove XML element MUST be empty, as only the | ||||
names of properties to be removed are required. | ||||
<!ELEMENT remove (prop) > | Purpose: Provides a name for the resource that is suitable for | |||
presentation to a user. | ||||
12.13.2. set XML element | Value: Any text. | |||
Name: set | Protected: SHOULD NOT be protected. Note that servers implementing | |||
[RFC2518] might have made this a protected property as this is a | ||||
new requirement. | ||||
Namespace: DAV: | COPY/MOVE behaviour: This property value SHOULD be preserved in | |||
COPY and MOVE operations. | ||||
Purpose: Lists the DAV property values to be set for a resource. | Description: Contains a description of the resource that is | |||
suitable for presentation to a user. This property is defined on | ||||
the resource, and hence SHOULD have the same value independent of | ||||
the Request-URI used to retrieve it (thus computing this property | ||||
based on the Request-URI is deprecated). While generic clients | ||||
might display the property value to end users, client UI designers | ||||
must understand that the method for identifying resources is still | ||||
the URL. Changes to DAV:displayname do not issue moves or copies | ||||
to the server, but simply change a piece of meta-data on the | ||||
individual resource. Two resources can have the same DAV: | ||||
displayname value even within the same collection. | ||||
Description: The set XML element MUST contain only a prop XML | <!ELEMENT displayname (#PCDATA) > | |||
element. The elements contained by the prop XML element inside | ||||
the set XML element MUST specify the name and value of properties | ||||
that are set on the resource identified by Request-URI. If a | ||||
property already exists then its value is replaced. Language | ||||
tagging information in the property's value (in the "xml:lang" | ||||
attribute, if present) MUST be persistently stored along with the | ||||
property, and MUST be subsequently retrievable using PROPFIND. | ||||
<!ELEMENT set (prop) > | 15.3. getcontentlanguage Property | |||
12.14. propfind XML Element | Name: getcontentlanguage | |||
Name: propfind | Purpose: Contains the Content-Language header value (from Section | |||
14.12 of [RFC2616]) as it would be returned by a GET without | ||||
accept headers. | ||||
Namespace: DAV: | Value: language-tag (language-tag is defined in Section 3.10 of | |||
[RFC2616]). | ||||
Purpose: Specifies the properties to be returned from a PROPFIND | Protected: SHOULD NOT be protected, so that clients can reset the | |||
method. Two special elements are specified for use with propfind, | language. Note that servers implementing [RFC2518] might have | |||
allprop and propname. If prop is used inside propfind it MUST | made this a protected property as this is a new requirement. | |||
only contain property names, not values. | ||||
<!ELEMENT propfind (allprop | propname | prop) > | COPY/MOVE behaviour: This property value SHOULD be preserved in | |||
COPY and MOVE operations. | ||||
12.14.1. allprop XML Element | Description: The DAV:getcontentlanguage property MUST be defined on | |||
any DAV compliant resource that returns the Content-Language | ||||
header on a GET. | ||||
Name: allprop | <!ELEMENT getcontentlanguage (#PCDATA) > | |||
Namespace: DAV: | 15.4. getcontentlength Property | |||
Purpose: The allprop XML element specifies that all property names | Name: getcontentlength | |||
and values on the resource are to be returned. | ||||
<!ELEMENT allprop EMPTY > | Purpose: Contains the Content-Length header returned by a GET | |||
without accept headers. | ||||
12.14.2. propname XML Element | Value: See Section 14.13 of [RFC2616]. | |||
Name: propname | Protected: This property is computed, therefore protected. | |||
Namespace: DAV: | Description: The DAV:getcontentlength property MUST be defined on | |||
any DAV compliant resource that returns the Content-Length header | ||||
in response to a GET. | ||||
Purpose: The propname XML element specifies that only a list of | COPY/MOVE behaviour: This property value is dependent on the size | |||
property names on the resource is to be returned. | of the destination resource, not the value of the property on the | |||
source resource. | ||||
<!ELEMENT propname EMPTY > | <!ELEMENT getcontentlength (#PCDATA) > | |||
13. DAV Properties | 15.5. getcontenttype Property | |||
For DAV properties, the name of the property is also the same as the | Name: getcontenttype | |||
name of the XML element that contains its value. In the section | ||||
below, the final line of each section gives the element type | ||||
declaration using the format defined in [REC-XML]. The "Value" | ||||
field, where present, specifies further restrictions on the allowable | ||||
contents of the XML element using BNF (i.e., to further restrict the | ||||
values of a PCDATA element). | ||||
13.1. creationdate Property | Purpose: Contains the Content-Type header value (from Section 14.17 | |||
of [RFC2616]) as it would be returned by a GET without accept | ||||
headers. | ||||
Name: creationdate | Value: media-type (defined in Section 3.7 of [RFC2616]) | |||
Namespace: DAV: | Protected: Potentially protected if the server prefers to assign | |||
content types on its own (see also discussion in Section 9.7.1). | ||||
Purpose: Records the time and date the resource was created. | COPY/MOVE behaviour: This property value SHOULD be preserved in | |||
COPY and MOVE operations. | ||||
Value: date-time ; See Appendix A.2 | Description: This property MUST be defined on any DAV compliant | |||
resource that returns the Content-Type header in response to a | ||||
GET. | ||||
Description: The creationdate property should be defined on all DAV | <!ELEMENT getcontenttype (#PCDATA) > | |||
compliant resources. If present, it contains a timestamp of the | ||||
moment when the resource was created (i.e., the moment it had non- | ||||
null state). | ||||
<!ELEMENT creationdate (#PCDATA) > | 15.6. getetag Property | |||
13.2. displayname Property | Name: getetag | |||
Name: displayname | Purpose: Contains the ETag header value (from Section 14.19 of | |||
[RFC2616]) as it would be returned by a GET without accept | ||||
headers. | ||||
Namespace: DAV: | Value: entity-tag (defined in Section 3.11 of [RFC2616]) | |||
Purpose: Provides a name for the resource that is suitable for | Protected: MUST be protected because this value is created and | |||
presentation to a user. | controlled by the server. | |||
Description: The displayname property should be defined on all DAV | COPY/MOVE behaviour: This property value is dependent on the final | |||
compliant resources. If present, the property contains a | state of the destination resource, not the value of the property | |||
description of the resource that is suitable for presentation to a | on the source resource. Also note the considerations in | |||
user. | Section 8.8. | |||
<!ELEMENT displayname (#PCDATA) > | Description: The getetag property MUST be defined on any DAV | |||
compliant resource that returns the Etag header. Refer to Section | ||||
3.11 of RFC2616 for a complete definition of the semantics of an | ||||
ETag, and to Section 8.6 for a discussion of ETags in WebDAV. | ||||
13.3. getcontentlanguage Property | <!ELEMENT getetag (#PCDATA) > | |||
Name: getcontentlanguage | 15.7. getlastmodified Property | |||
Namespace: DAV: | Name: getlastmodified | |||
Purpose: Contains the Content-Language header returned by a GET | Purpose: Contains the Last-Modified header value (from Section | |||
without accept headers | 14.29 of [RFC2616]) as it would be returned by a GET method | |||
without accept headers. | ||||
Description: The getcontentlanguage property MUST be defined on any | Value: rfc1123-date (defined in Section 3.3.1 of [RFC2616]) | |||
DAV compliant resource that returns the Content-Language header on | ||||
a GET. | ||||
Value: language-tag ;language-tag is defined in section 14.13 of | Protected: SHOULD be protected because some clients may rely on the | |||
[RFC2068] | value for appropriate caching behavior, or on the value of the | |||
Last-Modified header to which this property is linked. | ||||
<!ELEMENT getcontentlanguage (#PCDATA) > | COPY/MOVE behaviour: This property value is dependent on the last | |||
modified date of the destination resource, not the value of the | ||||
property on the source resource. Note that some server | ||||
implementations use the file system date modified value for the | ||||
DAV:getlastmodified value, and this can be preserved in a MOVE | ||||
even when the HTTP Last-Modified value SHOULD change. Note that | ||||
since [RFC2616] requires clients to use ETags where provided, a | ||||
server implementing ETags can count on clients using a much better | ||||
mechanism than modification dates for offline synchronization or | ||||
cache control. Also note the considerations in Section 8.8. | ||||
13.4. getcontentlength Property | Description: Note that the last-modified date on a resource SHOULD | |||
only reflect changes in the body (the GET responses) of the | ||||
resource. A change in a property only SHOULD NOT cause the last- | ||||
modified date to change, because clients MAY rely on the last- | ||||
modified date to know when to overwrite the existing body. The | ||||
DAV:getlastmodified property MUST be defined on any DAV compliant | ||||
resource that returns the Last-Modified header in response to a | ||||
GET. | ||||
Name: getcontentlength | <!ELEMENT getlastmodified (#PCDATA) > | |||
Namespace: DAV: | 15.8. lockdiscovery Property | |||
Purpose: Contains the Content-Length header returned by a GET | Name: lockdiscovery | |||
without accept headers. | ||||
Description: The getcontentlength property MUST be defined on any | Purpose: Describes the active locks on a resource | |||
DAV compliant resource that returns the Content-Length header in | ||||
response to a GET. | ||||
Value: content-length ; see section 14.14 of [RFC2068] | Protected: MUST be protected. Clients change the list of locks | |||
through LOCK and UNLOCK, not through PROPPATCH. | ||||
<!ELEMENT getcontentlength (#PCDATA) > | COPY/MOVE behaviour: The value of this property depends on the lock | |||
state of the destination, not on the locks of the source resource. | ||||
Recall that locks are not moved in a MOVE operation. | ||||
13.5. getcontenttype Property | Description: Returns a listing of who has a lock, what type of lock | |||
he has, the timeout type and the time remaining on the timeout, | ||||
and the associated lock token. Owner information MAY be omitted | ||||
if it is considered sensitive. If there are no locks, but the | ||||
server supports locks, the property will be present but contain | ||||
zero 'activelock' elements. If there is one or more lock, an | ||||
'activelock' element appears for each lock on the resource. This | ||||
property is NOT lockable with respect to write locks (Section 7). | ||||
Name: getcontenttype | <!ELEMENT lockdiscovery (activelock)* > | |||
Namespace: DAV: | 15.8.1. Example - Retrieving DAV:lockdiscovery | |||
Purpose: Contains the Content-Type header returned by a GET without | >>Request | |||
accept headers. | ||||
Description: This getcontenttype property MUST be defined on any DAV | PROPFIND /container/ HTTP/1.1 | |||
compliant resource that returns the Content-Type header in | Host: www.example.com | |||
response to a GET. | Content-Length: xxxx | |||
Content-Type: application/xml; charset="utf-8" | ||||
Value: media-type ; defined in section 3.7 of [RFC2068] | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D='DAV:'> | ||||
<D:prop><D:lockdiscovery/></D:prop> | ||||
</D:propfind> | ||||
<!ELEMENT getcontenttype (#PCDATA) > | >>Response | |||
13.6. getetag Property | HTTP/1.1 207 Multi-Status | |||
Name: getetag | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | ||||
Namespace: DAV: | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D='DAV:'> | ||||
<D:response> | ||||
<D:href>http://www.example.com/container/</D:href> | ||||
<D:propstat> | ||||
<D:prop> | ||||
<D:lockdiscovery> | ||||
<D:activelock> | ||||
<D:locktype><D:write/></D:locktype> | ||||
<D:lockscope><D:exclusive/></D:lockscope> | ||||
<D:depth>0</D:depth> | ||||
<D:owner>Jane Smith</D:owner> | ||||
<D:timeout>Infinite</D:timeout> | ||||
<D:locktoken> | ||||
<D:href | ||||
>urn:uuid:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76</D:href> | ||||
</D:locktoken> | ||||
<D:lockroot> | ||||
<D:href>http://www.example.com/container/</D:href> | ||||
</D:lockroot> | ||||
</D:activelock> | ||||
</D:lockdiscovery> | ||||
</D:prop> | ||||
<D:status>HTTP/1.1 200 OK</D:status> | ||||
</D:propstat> | ||||
</D:response> | ||||
</D:multistatus> | ||||
Purpose: Contains the ETag header returned by a GET without accept | This resource has a single exclusive write lock on it, with an | |||
headers. | infinite timeout. | |||
Description: The getetag property MUST be defined on any DAV | 15.9. resourcetype Property | |||
compliant resource that returns the Etag header. | ||||
Value: entity-tag ; defined in section 3.11 of [RFC2068] | Name: resourcetype | |||
<!ELEMENT getetag (#PCDATA) > | Purpose: Specifies the nature of the resource. | |||
13.7. getlastmodified Property | Protected: SHOULD be protected. Resource type is generally decided | |||
through the operation creating the resource (MKCOL vs PUT), not by | ||||
PROPPATCH. | ||||
Name: getlastmodified | COPY/MOVE behaviour: Generally a COPY/MOVE of a resource results in | |||
the same type of resource at the destination. | ||||
Namespace: DAV: | Description: MUST be defined on all DAV compliant resources. Each | |||
child element identifies a specific type the resource belongs to, | ||||
such as 'collection', which is the only resource type defined by | ||||
this specification (see Section 14.3). If the element contains | ||||
the 'collection' child element plus additional unrecognized | ||||
elements, it should generally be treated as a collection. If the | ||||
element contains no recognized child elements, it should be | ||||
treated as a non-collection resource. The default value is empty. | ||||
This element MUST NOT contain text or mixed content. Any custom | ||||
child element is considered to be an identifier for a resource | ||||
type. | ||||
Purpose: Contains the Last-Modified header returned by a GET method | Example: (fictional example to show extensibility) | |||
without accept headers. | ||||
Description: Note that the last-modified date on a resource may | <x:resourcetype xmlns:x="DAV:"> | |||
reflect changes in any part of the state of the resource, not | <x:collection/> | |||
necessarily just a change to the response to the GET method. For | <f:search-results xmlns:f="http://www.example.com/ns"/> | |||
example, a change in a property may cause the last-modified date | </x:resourcetype> | |||
to change. The getlastmodified property MUST be defined on any | ||||
DAV compliant resource that returns the Last-Modified header in | ||||
response to a GET. | ||||
Value: HTTP-date ; defined in section 3.3.1 of [RFC2068] | 15.10. supportedlock Property | |||
<!ELEMENT getlastmodified (#PCDATA) > | Name: supportedlock | |||
13.8. lockdiscovery Property | Purpose: To provide a listing of the lock capabilities supported by | |||
the resource. | ||||
Name: lockdiscovery | Protected: MUST be protected. Servers determine what lock | |||
mechanisms are supported, not clients. | ||||
Namespace: DAV: | COPY/MOVE behaviour: This property value is dependent on the kind | |||
of locks supported at the destination, not on the value of the | ||||
property at the source resource. Servers attempting to COPY to a | ||||
destination should not attempt to set this property at the | ||||
destination. | ||||
Purpose: Describes the active locks on a resource | Description: Returns a listing of the combinations of scope and | |||
Description: The lockdiscovery property returns a listing of who has | access types which may be specified in a lock request on the | |||
a lock, what type of lock he has, the timeout type and the time | resource. Note that the actual contents are themselves controlled | |||
remaining on the timeout, and the associated lock token. The | by access controls so a server is not required to provide | |||
server is free to withhold any or all of this information if the | information the client is not authorized to see. This property is | |||
requesting principal does not have sufficient access rights to see | NOT lockable with respect to write locks (Section 7). | |||
the requested data. | ||||
<!ELEMENT lockdiscovery (activelock)* > | <!ELEMENT supportedlock (lockentry)* > | |||
13.8.1. Example - Retrieving the lockdiscovery Property | 15.10.1. Example - Retrieving DAV:supportedlock | |||
>>Request | >>Request | |||
PROPFIND /container/ HTTP/1.1 | PROPFIND /container/ HTTP/1.1 | |||
Host: www.foo.bar | Host: www.example.com | |||
Content-Length: xxxx | Content-Length: xxxx | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D='DAV:'> | <D:propfind xmlns:D="DAV:"> | |||
<D:prop><D:lockdiscovery/></D:prop> | <D:prop><D:supportedlock/></D:prop> | |||
</D:propfind> | </D:propfind> | |||
>>Response | >>Response | |||
HTTP/1.1 207 Multi-Status | HTTP/1.1 207 Multi-Status | |||
Content-Type: text/xml; charset="utf-8" | Content-Type: application/xml; charset="utf-8" | |||
Content-Length: xxxx | Content-Length: xxxx | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:multistatus xmlns:D='DAV:'> | <D:multistatus xmlns:D="DAV:"> | |||
<D:response> | <D:response> | |||
<D:href>http://www.foo.bar/container/</D:href> | <D:href>http://www.example.com/container/</D:href> | |||
<D:propstat> | <D:propstat> | |||
<D:prop> | <D:prop> | |||
<D:lockdiscovery> | <D:supportedlock> | |||
<D:activelock> | <D:lockentry> | |||
<D:locktype><D:write/></D:locktype> | <D:lockscope><D:exclusive/></D:lockscope> | |||
<D:lockscope><D:exclusive/></D:lockscope> | <D:locktype><D:write/></D:locktype> | |||
<D:depth>0</D:depth> | </D:lockentry> | |||
<D:owner>Jane Smith</D:owner> | <D:lockentry> | |||
<D:timeout>Infinite</D:timeout> | <D:lockscope><D:shared/></D:lockscope> | |||
<D:locktoken> | <D:locktype><D:write/></D:locktype> | |||
<D:href> | </D:lockentry> | |||
opaquelocktoken:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76 | </D:supportedlock> | |||
</D:href> | </D:prop> | |||
</D:locktoken> | <D:status>HTTP/1.1 200 OK</D:status> | |||
</D:activelock> | </D:propstat> | |||
</D:lockdiscovery> | </D:response> | |||
</D:prop> | </D:multistatus> | |||
<D:status>HTTP/1.1 200 OK</D:status> | ||||
</D:propstat> | ||||
</D:response> | ||||
</D:multistatus> | ||||
This resource has a single exclusive write lock on it, with an | 16. Precondition/Postcondition XML Elements | |||
infinite timeout. | ||||
13.9. resourcetype Property | As introduced in Section 8.7, extra information on error conditions | |||
can be included in the body of many status responses. This section | ||||
makes requirements on the use of the error body mechanism and | ||||
introduces a number of precondition and postcondition codes. | ||||
Name: resourcetype | A "precondition" of a method describes the state of the server that | |||
must be true for that method to be performed. A "postcondition" of a | ||||
method describes the state of the server that must be true after that | ||||
method has been completed. | ||||
Namespace: DAV: | Each precondition and postcondition has a unique XML element | |||
associated with it. In a 207 Multi-Status response, the XML element | ||||
MUST appear inside an 'error' element in the appropriate 'propstat or | ||||
'response' element depending on whether the condition applies to one | ||||
or more properties or to the resource as a whole. In all other error | ||||
responses where this specification's 'error' body is used, the | ||||
precondition/postcondition XML element MUST be returned as the child | ||||
of a top-level 'error' element in the response body, unless otherwise | ||||
negotiated by the request, along with an appropriate response status. | ||||
The most common response status codes are 403 (Forbidden) if the | ||||
request should not be repeated because it will always fail, and 409 | ||||
(Conflict) if it is expected that the user might be able to resolve | ||||
the conflict and resubmit the request. The 'error' element MAY | ||||
contain child elements with specific error information and MAY be | ||||
extended with any custom child elements. | ||||
Purpose: Specifies the nature of the resource. | This mechanism does not take the place of using a correct numeric | |||
status code as defined here or in HTTP, because the client MUST | ||||
always be able to take a reasonable course of action based only on | ||||
the numeric code. However, it does remove the need to define new | ||||
numeric codes. The new machine-readable codes used for this purpose | ||||
are XML elements classified as preconditions and postconditions, so | ||||
naturally any group defining a new condition code can use their own | ||||
namespace. As always, the "DAV:" namespace is reserved for use by | ||||
IETF-chartered WebDAV working groups. | ||||
Description: The resourcetype property MUST be defined on all DAV | A server supporting this specification SHOULD use the XML error | |||
compliant resources. The default value is empty. | whenever a precondition or postcondition defined in this document is | |||
violated. For error conditions not specified in this document, the | ||||
server MAY simply choose an appropriate numeric status and leave the | ||||
response body blank. However, a server MAY instead use a custom | ||||
condition code and other supporting text, because even when clients | ||||
do not automatically recognize condition codes they can be quite | ||||
useful in interoperability testing and debugging. | ||||
<!ELEMENT resourcetype ANY > | Example - Response with precondition code | |||
>>Response | ||||
13.10. source Property | HTTP/1.1 423 Locked | |||
Content-Type: application/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
Name: source | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:error xmlns:D="DAV:"> | ||||
<D:lock-token-submitted> | ||||
<D:href>/workspace/webdav/</D:href> | ||||
</D:lock-token-submitted> | ||||
</D:error> | ||||
Namespace: DAV: | In this example, a client unaware of a depth-infinity lock on the | |||
parent collection "/workspace/webdav/" attempted to modify the | ||||
collection member "/workspace/webdav/proposal.doc". | ||||
Purpose: The destination of the source link identifies the resource | Some other useful preconditions and postconditions have been defined | |||
that contains the unprocessed source of the link's source. | in other specifications extending WebDAV, such as [RFC3744] (see | |||
particularly Section 7.1.1), [RFC3253], and [RFC3648]. | ||||
Description: The source of the link (src) is typically the URI of | All these elements are in the "DAV:" namespace. If not specified | |||
the output resource on which the link is defined, and there is | otherwise, the content for each condition's XML element is defined to | |||
typically only one destination (dst) of the link, which is the URI | be empty. | |||
where the unprocessed source of the resource may be accessed. | ||||
When more than one link destination exists, this specification | ||||
asserts no policy on ordering. | ||||
<!ELEMENT source (link)* > | Name: lock-token-matches-request-uri | |||
13.10.1. Example - A source Property | Use with: 409 Conflict | |||
<?xml version="1.0" encoding="utf-8" ?> | Purpose: (precondition) -- A request may include a Lock-Token header | |||
<D:prop xmlns:D="DAV:" xmlns:F="http://www.foocorp.com/Project/"> | to identify a lock for the UNLOCK method. However, if the | |||
<D:source> | Request-URI does not fall within the scope of the lock identified | |||
<D:link> | by the token, the server SHOULD use this error. The lock may have | |||
<F:projfiles>Source</F:projfiles> | a scope that does not include the Request-URI, or the lock could | |||
<D:src>http://foo.bar/program</D:src> | have disappeared, or the token may be invalid. | |||
<D:dst>http://foo.bar/src/main.c</D:dst> | ||||
</D:link> | ||||
<D:link> | ||||
<F:projfiles>Library</F:projfiles> | ||||
<D:src>http://foo.bar/program</D:src> | ||||
<D:dst>http://foo.bar/src/main.lib</D:dst> | ||||
</D:link> | ||||
<D:link> | ||||
<F:projfiles>Makefile</F:projfiles> | ||||
<D:src>http://foo.bar/program</D:src> | ||||
<D:dst>http://foo.bar/src/makefile</D:dst> | ||||
</D:link> | ||||
</D:source> | ||||
</D:prop> | ||||
In this example the resource http://foo.bar/program has a source | Name: lock-token-submitted (precondition) | |||
property that contains three links. Each link contains three | ||||
elements, two of which, src and dst, are part of the DAV schema | ||||
defined in this document, and one which is defined by the schema | ||||
http://www.foocorp.com/project/ (Source, Library, and Makefile). A | ||||
client which only implements the elements in the DAV spec will not | ||||
understand the foocorp elements and will ignore them, thus seeing the | ||||
expected source and destination links. An enhanced client may know | ||||
about the foocorp elements and be able to present the user with | ||||
additional information about the links. This example demonstrates | ||||
the power of XML markup, allowing element values to be enhanced | ||||
without breaking older clients. | ||||
13.11. supportedlock Property | Use with: 423 Locked | |||
Name: supportedlock | Purpose: The request could not succeed because a lock token should | |||
have been submitted. This element, if present, MUST contain at | ||||
least one URL of a locked resource that prevented the request. In | ||||
cases of MOVE, COPY and DELETE where collection locks are | ||||
involved, it can be difficult for the client to find out which | ||||
locked resource made the request fail -- but the server is only | ||||
resonsible for returning one such locked resource. The server MAY | ||||
return every locked resource that prevented the request from | ||||
succeeding if it knows them all. | ||||
Namespace: DAV: | <!ELEMENT lock-token-submitted (href+) > | |||
Purpose: To provide a listing of the lock capabilities supported by | Name: no-conflicting-lock (precondition) | |||
the resource. | ||||
Description: The supportedlock property of a resource returns a | Use with: Typically 423 Locked | |||
listing of the combinations of scope and access types which may be | ||||
specified in a lock request on the resource. Note that the actual | ||||
contents are themselves controlled by access controls so a server | ||||
is not required to provide information the client is not | ||||
authorized to see. | ||||
<!ELEMENT supportedlock (lockentry)* > | Purpose: A LOCK request failed due the presence of an already | |||
existing conflicting lock. Note that a lock can be in conflict | ||||
although the resource to which the request was directed is only | ||||
indirectly locked. In this case, the precondition code can be | ||||
used to inform the client about the resource which is the root of | ||||
the conflicting lock, avoiding a separate lookup of the | ||||
"lockdiscovery" property. | ||||
13.11.1. Example - Retrieving the supportedlock Property | <!ELEMENT no-conflicting-lock (href)* > | |||
>>Request | Name: no-external-entities | |||
PROPFIND /container/ HTTP/1.1 | Use with: 403 Forbidden | |||
Host: www.foo.bar | ||||
Content-Length: xxxx | ||||
Content-Type: text/xml; charset="utf-8" | ||||
<?xml version="1.0" encoding="utf-8" ?> | Purpose: (precondition) -- If the server rejects a client request | |||
<D:propfind xmlns:D="DAV:"> | because the request body contains an external entity, the server | |||
<D:prop><D:supportedlock/></D:prop> | SHOULD use this error. | |||
</D:propfind> | ||||
>>Response | Name: preserved-live-properties | |||
HTTP/1.1 207 Multi-Status | Use with: 409 Conflict | |||
Content-Type: text/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
<?xml version="1.0" encoding="utf-8" ?> | Purpose: (postcondition) -- The server received an otherwise-valid | |||
<D:multistatus xmlns:D="DAV:"> | MOVE or COPY request, but cannot maintain the live properties with | |||
<D:response> | the same behavior at the destination. It may be that the server | |||
<D:href>http://www.foo.bar/container/</D:href> | only supports some live properties in some parts of the | |||
<D:propstat> | repository, or simply has an internal error. | |||
<D:prop> | ||||
<D:supportedlock> | ||||
<D:lockentry> | ||||
<D:lockscope><D:exclusive/></D:lockscope> | ||||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | ||||
<D:lockentry> | ||||
<D:lockscope><D:shared/></D:lockscope> | ||||
<D:locktype><D:write/></D:locktype> | ||||
</D:lockentry> | ||||
</D:supportedlock> | ||||
</D:prop> | ||||
<D:status>HTTP/1.1 200 OK</D:status> | ||||
</D:propstat> | ||||
</D:response> | ||||
</D:multistatus> | ||||
14. Instructions for Processing XML in DAV | Name: propfind-finite-depth | |||
All DAV compliant resources MUST ignore any unknown XML element and | Use with: 403 Forbidden | |||
all its children encountered while processing a DAV method that uses | ||||
XML as its command language. | Purpose: (precondition) -- This server does not allow infinite-depth | |||
PROPFIND requests on collections. | ||||
Name: cannot-modify-protected-property | ||||
Use with: 403 Forbidden | ||||
Purpose: (precondition) -- The client attempted to set a protected | ||||
property in a PROPPATCH (such as DAV:getetag). See also | ||||
[RFC3253], Section 3.12. | ||||
17. XML Extensibility in DAV | ||||
The XML namespace extension ([REC-XML-NAMES]) is used in this | ||||
specification in order to allow for new XML elements to be added | ||||
without fear of colliding with other element names. Although WebDAV | ||||
request and response bodies can be extended by arbitrary XML | ||||
elements, which can be ignored by the message recipient, an XML | ||||
element in the "DAV:" namespace SHOULD NOT be used in the request or | ||||
response body unless that XML element is explicitly defined in an | ||||
IETF RFC reviewed by a WebDAV working group. | ||||
For WebDAV to be both extensibile and backwards-compatible, both | ||||
clients and servers need to know how to behave when unexpected or | ||||
unrecognized command extensions are received. For XML processing, | ||||
this means that clients and servers MUST process received XML | ||||
documents as if unexpected elements and attributes (and all children | ||||
of unrecognized elements) were not there. An unexpected element or | ||||
attribute includes one which may be used in another context but is | ||||
not expected here. Ignoring such items for purposes of processing | ||||
can of course be consistent with logging all information or | ||||
presenting for debugging. | ||||
This restriction also applies to the processing, by clients, of DAV | This restriction also applies to the processing, by clients, of DAV | |||
property values where unknown XML elements SHOULD be ignored unless | property values where unexpected XML elements SHOULD be ignored | |||
the property's schema declares otherwise. | unless the property's schema declares otherwise. | |||
This restriction does not apply to setting dead DAV properties on the | This restriction does not apply to setting dead DAV properties on the | |||
server where the server MUST record unknown XML elements. | server where the server MUST record all XML elements. | |||
Additionally, this restriction does not apply to the use of XML where | Additionally, this restriction does not apply to the use of XML where | |||
XML happens to be the content type of the entity body, for example, | XML happens to be the content type of the entity body, for example, | |||
when used as the body of a PUT. | when used as the body of a PUT. | |||
Since XML can be transported as text/xml or application/xml, a DAV | Processing instructions in XML SHOULD be ignored by recipients. | |||
server MUST accept DAV method requests with XML parameters | Thus, specifications extending WebDAV SHOULD NOT use processing | |||
transported as either text/xml or application/xml, and DAV client | instructions to define normative behavior. | |||
MUST accept XML responses using either text/xml or application/xml. | ||||
15. DAV Compliance Classes | XML DTD fragments are included for all the XML elements defined in | |||
this specification. However, correct XML will not be valid according | ||||
to any DTD due to namespace usage and extension rules. In | ||||
particular: | ||||
A DAV compliant resource can choose from two classes of compliance. | o Elements (from this specification) are in the "DAV:" namespace, | |||
o Element ordering is irrelevant unless otherwise stated, | ||||
o Extension attributes MAY be added, | ||||
o For element type definitions of "ANY", the normative text | ||||
definition for that element defines what can be in it and what | ||||
that means. | ||||
o For element type definitions of "#PCDATA", extension elements MUST | ||||
NOT be added. | ||||
o For other element type definitions, including "EMPTY", extension | ||||
elements MAY be added. | ||||
Note that this means that elements containing elements cannot be | ||||
extended to contain text, and vice versa. | ||||
With DTD validation relaxed by the rules above, the constraints | ||||
described by the DTD fragments are normative (see for example | ||||
Appendix A). A recipient of a WebDAV message with an XML body MUST | ||||
NOT validate the XML document according to any hard-coded or | ||||
dynamically-declared DTD. | ||||
Note that this section describes backwards-compatible extensibility | ||||
rules. There might also be times when an extension is designed not | ||||
to be backwards-compatible, for example defining an extension that | ||||
reuses an XML element defined in this document but omitting one of | ||||
the child elements required by the DTDs in this specification. | ||||
18. DAV Compliance Classes | ||||
A DAV compliant resource can advertise several classes of compliance. | ||||
A client can discover the compliance classes of a resource by | A client can discover the compliance classes of a resource by | |||
executing OPTIONS on the resource, and examining the "DAV" header | executing OPTIONS on the resource, and examining the "DAV" header | |||
which is returned. | which is returned. Note particularly that resources are spoken of as | |||
being compliant, rather than servers. That is because theoretically | ||||
some resources on a server could support different feature sets. | ||||
E.g. a server could have a sub-repository where an advanced feature | ||||
like versioning was supported, even if that feature was not supported | ||||
on all sub-repositories. | ||||
Since this document describes extensions to the HTTP/1.1 protocol, | Since this document describes extensions to the HTTP/1.1 protocol, | |||
minimally all DAV compliant resources, clients, and proxies MUST be | minimally all DAV compliant resources, clients, and proxies MUST be | |||
compliant with [RFC2068]. | compliant with [RFC2616]. | |||
Compliance classes are not necessarily sequential. A resource that | A resource that is class 2 or class 3 compliant must also be class 1 | |||
is class 2 compliant must also be class 1 compliant; but if | compliant. | |||
additional compliance classes are defined later, a resource that is | ||||
class 1, 2, and 4 compliant might not be class 3 compliant. Also | ||||
note that identifiers other than numbers may be used as compliance | ||||
class identifiers. | ||||
15.1. Class 1 | 18.1. Class 1 | |||
A class 1 compliant resource MUST meet all "MUST" requirements in all | A class 1 compliant resource MUST meet all "MUST" requirements in all | |||
sections of this document. | sections of this document. | |||
Class 1 compliant resources MUST return, at minimum, the value "1" in | Class 1 compliant resources MUST return, at minimum, the value "1" in | |||
the DAV header on all responses to the OPTIONS method. | the DAV header on all responses to the OPTIONS method. | |||
15.2. Class 2 | 18.2. Class 2 | |||
A class 2 compliant resource MUST meet all class 1 requirements and | A class 2 compliant resource MUST meet all class 1 requirements and | |||
support the LOCK method, the supportedlock property, the | support the LOCK method, the DAV:supportedlock property, the DAV: | |||
lockdiscovery property, the Time-Out response header and the Lock- | lockdiscovery property, the Time-Out response header and the Lock- | |||
Token request header. A class "2" compliant resource SHOULD also | Token request header. A class "2" compliant resource SHOULD also | |||
support the Time-Out request header and the owner XML element. | support the Time-Out request header and the 'owner' XML element. | |||
Class 2 compliant resources MUST return, at minimum, the values "1" | Class 2 compliant resources MUST return, at minimum, the values "1" | |||
and "2" in the DAV header on all responses to the OPTIONS method. | and "2" in the DAV header on all responses to the OPTIONS method. | |||
16. Internationalization Considerations | 18.3. Class 3 | |||
A resource can explicitly advertise its support for the revisions to | ||||
[RFC2518] made in this document. Class 1 MUST be supported as well. | ||||
Class 2 MAY be supported. Advertising class 3 support in addition to | ||||
class 1 and 2 means that the server supports all the requirements in | ||||
this specification. Advertising class 3 and class 1 support, but not | ||||
class 2, means that the server supports all the requirements in this | ||||
specification except possibly those that involve locking support. | ||||
Example: | ||||
DAV: 1, 3 | ||||
19. Internationalization Considerations | ||||
In the realm of internationalization, this specification complies | In the realm of internationalization, this specification complies | |||
with the IETF Character Set Policy [RFC2277]. In this specification, | with the IETF Character Set Policy [RFC2277]. In this specification, | |||
human-readable fields can be found either in the value of a property, | human-readable fields can be found either in the value of a property, | |||
or in an error message returned in a response entity body. In both | or in an error message returned in a response entity body. In both | |||
cases, the human-readable content is encoded using XML, which has | cases, the human-readable content is encoded using XML, which has | |||
explicit provisions for character set tagging and encoding, and | explicit provisions for character set tagging and encoding, and | |||
requires that XML processors read XML elements encoded, at minimum, | requires that XML processors read XML elements encoded, at minimum, | |||
using the UTF-8 [UTF-8] encoding of the ISO 10646 multilingual plane. | using the UTF-8 [RFC3629] and UTF-16 encodings of the ISO 10646 | |||
XML examples in this specification demonstrate use of the charset | multilingual plane. XML examples in this specification demonstrate | |||
parameter of the Content-Type header, as defined in [RFC2376], as | use of the charset parameter of the Content-Type header, as defined | |||
well as the XML "encoding" attribute, which together provide charset | in [RFC3023], as well as the XML declarations which provide charset | |||
identification information for MIME and XML processors. | identification information for MIME and XML processors. | |||
XML also provides a language tagging capability for specifying the | XML also provides a language tagging capability for specifying the | |||
language of the contents of a particular XML element. XML uses | language of the contents of a particular XML element. The "xml:lang" | |||
either IANA registered language tags (see [RFC1766]) or ISO 639 | attribute appears on an XML element to identify the language of its | |||
language tags [ISO-639] in the "xml:lang" attribute of an XML element | content and attributes. See [REC-XML] for definitions of values and | |||
to identify the language of its content and attributes. | scoping. | |||
WebDAV applications MUST support the character set tagging, character | WebDAV applications MUST support the character set tagging, character | |||
set encoding, and the language tagging functionality of the XML | set encoding, and the language tagging functionality of the XML | |||
specification. Implementors of WebDAV applications are strongly | specification. Implementors of WebDAV applications are strongly | |||
encouraged to read "XML Media Types" [RFC2376] for instruction on | encouraged to read "XML Media Types" [RFC3023] for instruction on | |||
which MIME media type to use for XML transport, and on use of the | which MIME media type to use for XML transport, and on use of the | |||
charset parameter of the Content-Type header. | charset parameter of the Content-Type header. | |||
Names used within this specification fall into three categories: | Names used within this specification fall into four categories: names | |||
names of protocol elements such as methods and headers, names of XML | of protocol elements such as methods and headers, names of XML | |||
elements, and names of properties. Naming of protocol elements | elements, names of properties, and names of conditions. Naming of | |||
follows the precedent of HTTP, using English names encoded in USASCII | protocol elements follows the precedent of HTTP, using English names | |||
for methods and headers. Since these protocol elements are not | encoded in USASCII for methods and headers. Since these protocol | |||
visible to users, and are in fact simply long token identifiers, they | elements are not visible to users, and are simply long token | |||
do not need to support encoding in multiple character sets. | identifiers, they do not need to support multiple languages. | |||
Similarly, though the names of XML elements used in this | Similarly, the names of XML elements used in this specification are | |||
specification are English names encoded in UTF-8, these names are not | not visible to the user and hence do not need to support multiple | |||
visible to the user, and hence do not need to support multiple | languages. | |||
character set encodings. | ||||
The name of a property defined on a resource is a URI. Although some | WebDAV property names are qualified XML names (pairs of XML namespace | |||
applications (e.g., a generic property viewer) will display property | name and local name). Although some applications (e.g., a generic | |||
URIs directly to their users, it is expected that the typical | property viewer) will display property names directly to their users, | |||
application will use a fixed set of properties, and will provide a | it is expected that the typical application will use a fixed set of | |||
mapping from the property name URI to a human-readable field when | properties, and will provide a mapping from the property name and | |||
displaying the property name to a user. It is only in the case where | namespace to a human-readable field when displaying the property name | |||
the set of properties is not known ahead of time that an application | to a user. It is only in the case where the set of properties is not | |||
need display a property name URI to a user. We recommend that | known ahead of time that an application need display a property name | |||
applications provide human-readable property names wherever feasible. | to a user. We recommend that applications provide human-readable | |||
property names wherever feasible. | ||||
For error reporting, we follow the convention of HTTP/1.1 status | For error reporting, we follow the convention of HTTP/1.1 status | |||
codes, including with each status code a short, English description | codes, including with each status code a short, English description | |||
of the code (e.g., 423 (Locked)). While the possibility exists that | of the code (e.g., 423 (Locked)). While the possibility exists that | |||
a poorly crafted user agent would display this message to a user, | a poorly crafted user agent would display this message to a user, | |||
internationalized applications will ignore this message, and display | internationalized applications will ignore this message, and display | |||
an appropriate message in the user's language and character set. | an appropriate message in the user's language and character set. | |||
Since interoperation of clients and servers does not require locale | Since interoperation of clients and servers does not require locale | |||
information, this specification does not specify any mechanism for | information, this specification does not specify any mechanism for | |||
transmission of this information. | transmission of this information. | |||
17. Security Considerations | 20. Security Considerations | |||
This section is provided to detail issues concerning security | This section is provided to detail issues concerning security | |||
implications of which WebDAV applications need to be aware. | implications of which WebDAV applications need to be aware. | |||
All of the security considerations of HTTP/1.1 (discussed in | All of the security considerations of HTTP/1.1 (discussed in | |||
[RFC2068]) and XML (discussed in [RFC2376]) also apply to WebDAV. In | [RFC2616]) and XML (discussed in [RFC3023]) also apply to WebDAV. In | |||
addition, the security risks inherent in remote authoring require | addition, the security risks inherent in remote authoring require | |||
stronger authentication technology, introduce several new privacy | stronger authentication technology, introduce several new privacy | |||
concerns, and may increase the hazards from poor server design. | concerns, and may increase the hazards from poor server design. | |||
These issues are detailed below. | These issues are detailed below. | |||
17.1. Authentication of Clients | 20.1. Authentication of Clients | |||
Due to their emphasis on authoring, WebDAV servers need to use | Due to their emphasis on authoring, WebDAV servers need to use | |||
authentication technology to protect not just access to a network | authentication technology to protect not just access to a network | |||
resource, but the integrity of the resource as well. Furthermore, | resource, but the integrity of the resource as well. Furthermore, | |||
the introduction of locking functionality requires support for | the introduction of locking functionality requires support for | |||
authentication. | authentication. | |||
A password sent in the clear over an insecure channel is an | A password sent in the clear over an insecure channel is an | |||
inadequate means for protecting the accessibility and integrity of a | inadequate means for protecting the accessibility and integrity of a | |||
resource as the password may be intercepted. Since Basic | resource as the password may be intercepted. Since Basic | |||
authentication for HTTP/1.1 performs essentially clear text | authentication for HTTP/1.1 performs essentially clear text | |||
transmission of a password, Basic authentication MUST NOT be used to | transmission of a password, Basic authentication MUST NOT be used to | |||
authenticate a WebDAV client to a server unless the connection is | authenticate a WebDAV client to a server unless the connection is | |||
secure. Furthermore, a WebDAV server MUST NOT send Basic | secure. Furthermore, a WebDAV server MUST NOT send a Basic | |||
authentication credentials in a WWW-Authenticate header unless the | authentication challenge in a WWW-Authenticate header unless the | |||
connection is secure. Examples of secure connections include a | connection is secure. An example of a secure connection would be a | |||
Transport Layer Security (TLS) connection employing a strong cipher | Transport Layer Security (TLS) connection employing a strong cipher | |||
suite with mutual authentication of client and server, or a | suite and server authentication. | |||
connection over a network which is physically secure, for example, an | ||||
isolated network in a building with restricted access. | ||||
WebDAV applications MUST support the Digest authentication scheme | WebDAV applications MUST support the Digest authentication scheme | |||
[RFC2069]. Since Digest authentication verifies that both parties to | [RFC2617]. Since Digest authentication verifies that both parties to | |||
a communication know a shared secret, a password, without having to | a communication know a shared secret, a password, without having to | |||
send that secret in the clear, Digest authentication avoids the | send that secret in the clear, Digest authentication avoids the | |||
security problems inherent in Basic authentication while providing a | security problems inherent in Basic authentication while providing a | |||
level of authentication which is useful in a wide range of scenarios. | level of authentication which is useful in a wide range of scenarios. | |||
17.2. Denial of Service | 20.2. Denial of Service | |||
Denial of service attacks are of special concern to WebDAV servers. | Denial of service attacks are of special concern to WebDAV servers. | |||
WebDAV plus HTTP enables denial of service attacks on every part of a | WebDAV plus HTTP enables denial of service attacks on every part of a | |||
system's resources. | system's resources. | |||
The underlying storage can be attacked by PUTting extremely large | o The underlying storage can be attacked by PUTting extremely large | |||
files. | files. | |||
Asking for recursive operations on large collections can attack | o Asking for recursive operations on large collections can attack | |||
processing time. | processing time. | |||
Making multiple pipelined requests on multiple connections can attack | o Making multiple pipelined requests on multiple connections can | |||
network connections. | attack network connections. | |||
WebDAV servers need to be aware of the possibility of a denial of | WebDAV servers need to be aware of the possibility of a denial of | |||
service attack at all levels. | service attack at all levels. The proper response to such an attack | |||
MAY be to simply drop the connection, or if the server is able to | ||||
make a response, the server MAY use a 400-level status request such | ||||
as 400 (Bad Request) and indicate why the request was refused (a 500- | ||||
level status response would indicate that the problem is with the | ||||
server, whereas unintentional DOS attacks are something the client is | ||||
capable of remedying). | ||||
17.3. Security through Obscurity | 20.3. Security through Obscurity | |||
WebDAV provides, through the PROPFIND method, a mechanism for listing | WebDAV provides, through the PROPFIND method, a mechanism for listing | |||
the member resources of a collection. This greatly diminishes the | the member resources of a collection. This greatly diminishes the | |||
effectiveness of security or privacy techniques that rely only on the | effectiveness of security or privacy techniques that rely only on the | |||
difficulty of discovering the names of network resources. Users of | difficulty of discovering the names of network resources. Users of | |||
WebDAV servers are encouraged to use access control techniques to | WebDAV servers are encouraged to use access control techniques to | |||
prevent unwanted access to resources, rather than depending on the | prevent unwanted access to resources, rather than depending on the | |||
relative obscurity of their resource names. | relative obscurity of their resource names. | |||
17.4. Privacy Issues Connected to Locks | 20.4. Privacy Issues Connected to Locks | |||
When submitting a lock request a user agent may also submit an owner | When submitting a lock request a user agent may also submit an | |||
XML field giving contact information for the person taking out the | 'owner' XML field giving contact information for the person taking | |||
lock (for those cases where a person, rather than a robot, is taking | out the lock (for those cases where a person, rather than a robot, is | |||
out the lock). This contact information is stored in a lockdiscovery | taking out the lock). This contact information is stored in a DAV: | |||
property on the resource, and can be used by other collaborators to | lockdiscovery property on the resource, and can be used by other | |||
begin negotiation over access to the resource. However, in many | collaborators to begin negotiation over access to the resource. | |||
cases this contact information can be very private, and should not be | However, in many cases this contact information can be very private, | |||
widely disseminated. Servers SHOULD limit read access to the | and should not be widely disseminated. Servers SHOULD limit read | |||
lockdiscovery property as appropriate. Furthermore, user agents | access to the DAV:lockdiscovery property as appropriate. | |||
SHOULD provide control over whether contact information is sent at | Furthermore, user agents SHOULD provide control over whether contact | |||
all, and if contact information is sent, control over exactly what | information is sent at all, and if contact information is sent, | |||
information is sent. | control over exactly what information is sent. | |||
17.5. Privacy Issues Connected to Properties | 20.5. Privacy Issues Connected to Properties | |||
Since property values are typically used to hold information such as | Since property values are typically used to hold information such as | |||
the author of a document, there is the possibility that privacy | the author of a document, there is the possibility that privacy | |||
concerns could arise stemming from widespread access to a resource's | concerns could arise stemming from widespread access to a resource's | |||
property data. To reduce the risk of inadvertent release of private | property data. To reduce the risk of inadvertent release of private | |||
information via properties, servers are encouraged to develop access | information via properties, servers are encouraged to develop access | |||
control mechanisms that separate read access to the resource body and | control mechanisms that separate read access to the resource body and | |||
read access to the resource's properties. This allows a user to | read access to the resource's properties. This allows a user to | |||
control the dissemination of their property data without overly | control the dissemination of their property data without overly | |||
restricting access to the resource's contents. | restricting access to the resource's contents. | |||
17.6. Reduction of Security due to Source Link | 20.6. Implications of XML Entities | |||
HTTP/1.1 warns against providing read access to script code because | ||||
it may contain sensitive information. Yet WebDAV, via its source | ||||
link facility, can potentially provide a URI for script resources so | ||||
they may be authored. For HTTP/1.1, a server could reasonably | ||||
prevent access to source resources due to the predominance of read- | ||||
only access. WebDAV, with its emphasis on authoring, encourages read | ||||
and write access to source resources, and provides the source link | ||||
facility to identify the source. This reduces the security benefits | ||||
of eliminating access to source resources. Users and administrators | ||||
of WebDAV servers should be very cautious when allowing remote | ||||
authoring of scripts, limiting read and write access to the source | ||||
resources to authorized principals. | ||||
17.7. Implications of XML External Entities | ||||
XML supports a facility known as "external entities", defined in | XML supports a facility known as "external entities", defined in | |||
section 4.2.2 of [REC-XML], which instruct an XML processor to | Section 4.2.2 of [REC-XML], which instruct an XML processor to | |||
retrieve and perform an inline include of XML located at a particular | retrieve and include additional XML. An external XML entity can be | |||
URI. An external XML entity can be used to append or modify the | used to append or modify the document type declaration (DTD) | |||
document type declaration (DTD) associated with an XML document. An | associated with an XML document. An external XML entity can also be | |||
external XML entity can also be used to include XML within the | used to include XML within the content of an XML document. For non- | |||
content of an XML document. For non-validating XML, such as the XML | validating XML, such as the XML used in this specification, including | |||
used in this specification, including an external XML entity is not | an external XML entity is not required by XML. However, XML does | |||
required by [REC-XML]. However, [REC-XML] does state that an XML | state that an XML processor may, at its discretion, include the | |||
processor may, at its discretion, include the external XML entity. | external XML entity. | |||
External XML entities have no inherent trustworthiness and are | External XML entities have no inherent trustworthiness and are | |||
subject to all the attacks that are endemic to any HTTP GET request. | subject to all the attacks that are endemic to any HTTP GET request. | |||
Furthermore, it is possible for an external XML entity to modify the | Furthermore, it is possible for an external XML entity to modify the | |||
DTD, and hence affect the final form of an XML document, in the worst | DTD, and hence affect the final form of an XML document, in the worst | |||
case significantly modifying its semantics, or exposing the XML | case significantly modifying its semantics, or exposing the XML | |||
processor to the security risks discussed in [RFC2376]. Therefore, | processor to the security risks discussed in [RFC3023]. Therefore, | |||
implementers must be aware that external XML entities should be | implementers must be aware that external XML entities should be | |||
treated as untrustworthy. | treated as untrustworthy. If a server implementor chooses not to | |||
handle external XML entities, it SHOULD respond to requests | ||||
containing external entities with the 'no-external-entities' | ||||
condition code. | ||||
There is also the scalability risk that would accompany a widely | There is also the scalability risk that would accompany a widely | |||
deployed application which made use of external XML entities. In | deployed application which made use of external XML entities. In | |||
this situation, it is possible that there would be significant | this situation, it is possible that there would be significant | |||
numbers of requests for one external XML entity, potentially | numbers of requests for one external XML entity, potentially | |||
overloading any server which fields requests for the resource | overloading any server which fields requests for the resource | |||
containing the external XML entity. | containing the external XML entity. | |||
17.8. Risks Connected with Lock Tokens | Furthermore, there's also a risk based on the evaluation of "internal | |||
entities" as defined in Section 4.2.2 of [REC-XML]. A small, | ||||
carefully crafted request using nested internal entities may require | ||||
enormous amounts of memory and/or processing time to process. Server | ||||
implementors should be aware of this risk and configure their XML | ||||
parsers so that requests like these can be detected and rejected as | ||||
early as possible. | ||||
This specification, in Section 6.4, requires the use of Universal | 20.7. Risks Connected with Lock Tokens | |||
Unique Identifiers (UUIDs) for lock tokens, in order to guarantee | ||||
their uniqueness across space and time. UUIDs, as defined in | This specification encourages the use of "A Universally Unique | |||
[ISO-11578], contain a "node" field which "consists of the IEEE | Identifier (UUID) URN Namespace" ([RFC4122]) for lock tokens | |||
address, usually the host address. For systems with multiple IEEE | (Section 6.5), in order to guarantee their uniqueness across space | |||
802 nodes, any available node address can be used." Since a WebDAV | and time. Version 1 UUIDs (defined in Section 4) MAY contain a | |||
server will issue many locks over its lifetime, the implication is | "node" field that "consists of an IEEE 802 MAC address, usually the | |||
that it will also be publicly exposing its IEEE 802 address. | host address. For systems with multiple IEEE addresses, any | |||
available one can be used". Since a WebDAV server will issue many | ||||
locks over its lifetime, the implication is that it may also be | ||||
publicly exposing its IEEE 802 address. | ||||
There are several risks associated with exposure of IEEE 802 | There are several risks associated with exposure of IEEE 802 | |||
addresses. Using the IEEE 802 address: | addresses. Using the IEEE 802 address: | |||
o It is possible to track the movement of hardware from subnet to | o It is possible to track the movement of hardware from subnet to | |||
subnet. | subnet. | |||
o It may be possible to identify the manufacturer of the hardware | o It may be possible to identify the manufacturer of the hardware | |||
running a WebDAV server. | running a WebDAV server. | |||
o It may be possible to determine the number of each type of | o It may be possible to determine the number of each type of | |||
computer running WebDAV. | computer running WebDAV. | |||
Section 6.4.1 of this specification details an alternate mechanism | This risk only applies to host address based UUID versions. Section | |||
for generating the "node" field of a UUID without using an IEEE 802 | 4 of [RFC4122] describes several other mechanisms for generating | |||
address, which alleviates the risks associated with exposure of IEEE | UUIDs that do not involve the host address and therefore do not | |||
802 addresses by using an alternate source of uniqueness. | suffer from this risk. | |||
18. IANA Considerations | 20.8. Hosting Malicious Content | |||
This document defines two namespaces, the namespace of property | HTTP has the ability to host programs which are executed on client | |||
names, and the namespace of WebDAV-specific XML elements used within | machines. These programs can take many forms including web scripts, | |||
property values. URIs are used for both names, for several reasons. | executables, plug in modules, and macros in documents. WebDAV does | |||
Assignment of a URI does not require a request to a central naming | not change any of the security concerns around these programs yet | |||
authority, and hence allow WebDAV property names and XML elements to | often WebDAV is used in contexts where a wide range of users can | |||
be quickly defined by any WebDAV user or application. URIs also | publish documents on a server. The server might not have a close | |||
provide a unique address space, ensuring that the distributed users | trust relationship with the author that is publishing the document. | |||
of WebDAV will not have collisions among the property names and XML | Servers that allow clients to publish arbitrary content can usefully | |||
elements they create. | implement precautions to check that content published to the server | |||
is not harmful to other clients. Servers could do this by techniques | ||||
such as restricting the types of content that is allowed to be | ||||
published and running virus and malware detection software on | ||||
published content. Servers can also mitigate the risk by having | ||||
appropriate access restriction and authentication of users that are | ||||
allowed to publish content to the server. | ||||
This specification defines a distinguished set of property names and | 21. IANA Considerations | |||
XML elements that are understood by all WebDAV applications. The | ||||
property names and XML elements in this specification are all derived | ||||
from the base URI DAV: by adding a suffix to this URI, for example, | ||||
DAV:creationdate for the "creationdate" property. | ||||
This specification also defines a URI scheme for the encoding of lock | 21.1. New URI Schemes | |||
tokens, the opaquelocktoken URI scheme described in Section 6.4. | ||||
To ensure correct interoperation based on this specification, IANA | This specification defines two URI schemes: | |||
must reserve the URI namespaces starting with "DAV:" and with | ||||
"opaquelocktoken:" for use by this specification, its revisions, and | ||||
related WebDAV specifications. | ||||
19. Intellectual Property | 1. the "opaquelocktoken" scheme defined in Appendix C, and | |||
The following notice is copied from RFC 2026 [RFC2026], section 10.4, | 2. the "DAV" URI scheme, which historically was used in [RFC2518] to | |||
and describes the position of the IETF concerning intellectual | disambiguate WebDAV property and XML element names and which | |||
property claims made against this document. | continues to be used for that purpose in this specification and | |||
others extending WebDAV. Creation of identifiers in the "DAV:" | ||||
namespace is controlled by the IETF. | ||||
The IETF takes no position regarding the validity or scope of any | Note that defining new URI schemes for XML namespaces is now | |||
intellectual property or other rights that might be claimed to | discouraged. "DAV:" was defined before standard best practices | |||
pertain to the implementation or use other technology described in | emerged. | |||
this document or the extent to which any license under such rights | ||||
might or might not be available; neither does it represent that it | ||||
has made any effort to identify any such rights. Information on the | ||||
IETF's procedures with respect to rights in standards-track and | ||||
standards-related documentation can be found in BCP-11. Copies of | ||||
claims of rights made available for publication and any assurances of | ||||
licenses to be made available, or the result of an attempt made to | ||||
obtain a general license or permission for the use of such | ||||
proprietary rights by implementors or users of this specification can | ||||
be obtained from the IETF Secretariat. | ||||
The IETF invites any interested party to bring to its attention any | 21.2. XML Namespaces | |||
copyrights, patents or patent applications, or other proprietary | ||||
rights which may cover technology that may be required to practice | ||||
this standard. Please address the information to the IETF Executive | ||||
Director. | ||||
20. Acknowledgements | XML namespaces disambiguate WebDAV property names and XML elements. | |||
Any WebDAV user or application can define a new namespace in order to | ||||
create custom properties or extend WebDAV XML syntax. IANA does not | ||||
need to manage such namespaces, property names or element names. | ||||
21.3. Message Header Fields | ||||
The message header fields below should be added to the permanent | ||||
registry (see [RFC3864]). | ||||
21.3.1. DAV | ||||
Header field name: DAV | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.1) | ||||
21.3.2. Depth | ||||
Header field name: Depth | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.2) | ||||
21.3.3. Destination | ||||
Header field name: Destination | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.3) | ||||
21.3.4. If | ||||
Header field name: If | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.4) | ||||
21.3.5. Lock-Token | ||||
Header field name: Lock-Token | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.5) | ||||
21.3.6. Overwrite | ||||
Header field name: Overwrite | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.6) | ||||
21.3.7. Timeout | ||||
Header field name: Timeout | ||||
Applicable protocol: http | ||||
Status: standard | ||||
Author/Change controller: IETF | ||||
Specification document: this specification (Section 10.7) | ||||
22. Acknowledgements | ||||
A specification such as this thrives on piercing critical review and | A specification such as this thrives on piercing critical review and | |||
withers from apathetic neglect. The authors gratefully acknowledge | withers from apathetic neglect. The authors gratefully acknowledge | |||
the contributions of the following people, whose insights were so | the contributions of the following people, whose insights were so | |||
valuable at every stage of our work. | valuable at every stage of our work. | |||
Contributors to RFC2518 | ||||
Terry Allen, Harald Alvestrand, Jim Amsden, Becky Anderson, Alan | Terry Allen, Harald Alvestrand, Jim Amsden, Becky Anderson, Alan | |||
Babich, Sanford Barr, Dylan Barrell, Bernard Chester, Tim Berners- | Babich, Sanford Barr, Dylan Barrell, Bernard Chester, Tim Berners- | |||
Lee, Dan Connolly, Jim Cunningham, Ron Daniel, Jr., Jim Davis, Keith | Lee, Dan Connolly, Jim Cunningham, Ron Daniel, Jr., Jim Davis, Keith | |||
Dawson, Mark Day, Brian Deen, Martin Duerst, David Durand, Lee | Dawson, Mark Day, Brian Deen, Martin Duerst, David Durand, Lee | |||
Farrell, Chuck Fay, Wesley Felter, Roy Fielding, Mark Fisher, Alan | Farrell, Chuck Fay, Wesley Felter, Roy Fielding, Mark Fisher, Alan | |||
Freier, George Florentine, Jim Gettys, Phill Hallam-Baker, Dennis | Freier, George Florentine, Jim Gettys, Phill Hallam-Baker, Dennis | |||
Hamilton, Steve Henning, Mead Himelstein, Alex Hopmann, Andre van der | Hamilton, Steve Henning, Mead Himelstein, Alex Hopmann, Andre van der | |||
Hoek, Ben Laurie, Paul Leach, Ora Lassila, Karen MacArthur, Steven | Hoek, Ben Laurie, Paul Leach, Ora Lassila, Karen MacArthur, Steven | |||
Martin, Larry Masinter, Michael Mealling, Keith Moore, Thomas Narten, | Martin, Larry Masinter, Michael Mealling, Keith Moore, Thomas Narten, | |||
Henrik Nielsen, Kenji Ota, Bob Parker, Glenn Peterson, Jon Radoff, | Henrik Nielsen, Kenji Ota, Bob Parker, Glenn Peterson, Jon Radoff, | |||
skipping to change at page 90, line 27 ¶ | skipping to change at page 124, line 40 ¶ | |||
Larry Masinter have been invaluable, both in helping the formation of | Larry Masinter have been invaluable, both in helping the formation of | |||
the working group and in patiently coaching the authors along the | the working group and in patiently coaching the authors along the | |||
way. In so many ways he has set high standards we have toiled to | way. In so many ways he has set high standards we have toiled to | |||
meet. The contributions of Judith Slein in clarifying the | meet. The contributions of Judith Slein in clarifying the | |||
requirements, and in patiently reviewing draft after draft, both | requirements, and in patiently reviewing draft after draft, both | |||
improved this specification and expanded our minds on document | improved this specification and expanded our minds on document | |||
management. | management. | |||
We would also like to thank John Turner for developing the XML DTD. | We would also like to thank John Turner for developing the XML DTD. | |||
21. References | The authors of RFC2518 were Yaron Goland, Jim Whitehead, A. Faizi, | |||
Steve Carter and D. Jensen. Although their names had to be removed | ||||
21.1. Normative References | due to IETF author count restrictions they can take credit for the | |||
majority of the design of WebDAV. | ||||
[RFC1766] Alvestrand, H., "Tags for the Identification of | ||||
Languages", RFC 1766, March 1995. | ||||
[RFC2277] Alvestrand, H., "IETF Policy on Character Sets and | ||||
Languages", BCP 18, RFC 2277, January 1998. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
Requirement Levels", BCP 14, RFC 2119, March 1997. | ||||
[RFC2396] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
Resource Identifiers (URI): Generic Syntax", RFC 2396, | ||||
August 1998. | ||||
[REC-XML] Bray, T., Paoli, J., and C. Sperberg-McQueen, "Extensible | ||||
Markup Language (XML) 1.0", W3C REC-xml-19980210, | ||||
February 1998, | ||||
<http://www.w3.org/TR/1998/REC-xml-19980210>. | ||||
[REC-XML-NAMES] | ||||
Bray, T., Hollander, D., and A. Layman, "Namespaces in | ||||
XML", W3C REC-xml-names-19990114, January 1999, | ||||
<http://www.w3.org/TR/1999/REC-xml-names-19990114>. | ||||
[RFC2069] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P., | ||||
Luotonen, A., Sink, E., and L. Stewart, "An Extension to | ||||
HTTP : Digest Access Authentication", RFC 2069, | ||||
January 1997. | ||||
[RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., and T. | ||||
Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", | ||||
RFC 2068, January 1997. | ||||
[ISO-639] International Organization for Standardization, "ISO 639: | ||||
1988. Code for the representation of names of languages.", | ||||
1988. | ||||
[ISO-8601] | ||||
International Organization for Standardization, "ISO 8601, | ||||
Data elements and interchange formats-Information | ||||
interchange--Representation of dates and times", | ||||
June 1988. | ||||
[ISO-11578] | ||||
International Organization for Standardization, "ISO/IEC | ||||
11578:1996. Information technology - Open Systems | ||||
Interconnection - Remote Procedure Call (RPC)", 1996. | ||||
[RFC2141] Moats, R., "URN Syntax", RFC 2141, May 1997. | ||||
[UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO | ||||
10646", RFC 2279, January 1998. | ||||
21.2. Informational References | ||||
[RFC2026] Bradner, S., "The Internet Standards Process -- Revision | ||||
3", BCP 9, RFC 2026, October 1996. | ||||
[RFC1807] Lasher, R. and D. Cohen, "A Format for Bibliographic | ||||
Records", RFC 1807, June 1995. | ||||
[WF] Lagoze, C., "The Warwick Framework: A Container | ||||
Architecture for Diverse Sets of Metadata", July 1996, | ||||
<http://www.dlib.org/dlib/july96/lagoze/07lagoze.html>. | ||||
D-Lib Magazine, July/August 1996. | ||||
[USMARC] Network Development and MARC Standards, Office, Washington | ||||
DC: Cataloging Distribution Service, Library of Congress., | ||||
"USMARC Format for Bibliographic Data", 1994. | ||||
[REC-PICS] | ||||
Miller, J., Krauskopf, T., Resnick, P., and W. Treese, | ||||
"PICS Label Distribution Label Syntax and Communication | ||||
Protocols, Version 1.1", W3C REC-PICS-labels-961031, | ||||
October 1996, | ||||
<http://www.w3.org/pub/WWW/TR/ | ||||
REC-PICS-labels-961031.html>. | ||||
[RFC2291] Slein, J., Vitali, F., Whitehead, E., and D. Durand, | ||||
"Requirements for a Distributed Authoring and Versioning | ||||
Protocol for the World Wide Web", RFC 2291, February 1998. | ||||
[RFC2413] Weibel, S., Kunze, J., Lagoze, C., and M. Wolf, "Dublin | Additional Acknowledgements for This Specification | |||
Core Metadata for Resource Discovery", RFC 2413, | ||||
September 1998. | ||||
[RFC2376] Whitehead, E. and M. Makoto, "XML Media Types", RFC 2376, | Significant contributors of text for this specification are listed as | |||
July 1998. | contributors in the section below. We must also gratefully | |||
acknowledge Geoff Clemm, Joel Soderberg, and Dan Brotsky for hashing | ||||
out specific text on the list or in meetings. Joe Hildebrand and | ||||
Cullen Jennings helped close many issues. Barry Lind described an | ||||
additional security consideration and Cullen Jennings provided text | ||||
for that consideration. Jason Crawford tracked issue status for this | ||||
document for a period of years, followed by Elias Sinderson. | ||||
Appendix A. Appendices | 23. Contributors to This Specification | |||
A.1. Appendix 1 - WebDAV Document Type Definition | Julian Reschke, | |||
<green/>bytes GmbH, | ||||
Hafenweg 16, 48155 Muenster, Germany, | ||||
Email: julian.reschke@greenbytes.de | ||||
This section provides a document type definition, following the rules | Elias Sinderson | |||
in [REC-XML], for the XML elements used in the protocol stream and in | University of California, Santa Cruz | |||
the values of properties. It collects the element definitions given | 1156 High Street, Santa Cruz, CA 95064 | |||
in sections 12 and 13. | Email: elias@cse.ucsc.edu | |||
<!DOCTYPE webdav-1.0 [ | Jim Whitehead, | |||
University of California, Santa Cruz | ||||
1156 High Street, Santa Cruz, CA 95064 | ||||
Email: ejw@soe.ucsc.edu | ||||
<!--============ XML Elements from Section 12 ==================--> | 24. Authors of RFC2518 | |||
<!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?, | Y. Y. Goland, | |||
locktoken?) > | Microsoft Corporation, | |||
One Microsoft Way, | ||||
Redmond, WA 98052-6399. | ||||
Email: yarong@microsoft.com. | ||||
<!ELEMENT lockentry (lockscope, locktype) > | E. J. Whitehead, Jr., | |||
<!ELEMENT lockinfo (lockscope, locktype, owner?) > | Dept. Of Information and Computer Science, | |||
University of California, Irvine, | ||||
Irvine, CA 92697-3425. | ||||
Email: ejw@ics.uci.edu. | ||||
<!ELEMENT locktype (write) > | A. Faizi, | |||
<!ELEMENT write EMPTY > | Netscape, | |||
685 East Middlefield Road, | ||||
Mountain View, CA 94043. | ||||
Email: asad@netscape.com. | ||||
<!ELEMENT lockscope (exclusive | shared) > | S. R. Carter, | |||
<!ELEMENT exclusive EMPTY > | Novell, | |||
<!ELEMENT shared EMPTY > | 1555 N. Technology Way, | |||
<!ELEMENT depth (#PCDATA) > | M/S ORM F111, | |||
Orem, UT 84097-2399. | ||||
Email: srcarter@novell.com. | ||||
<!ELEMENT owner ANY > | D. Jensen, | |||
Novell, | ||||
1555 N. Technology Way, | ||||
M/S ORM F111, | ||||
Orem, UT 84097-2399. | ||||
Email: dcjensen@novell.com. | ||||
<!ELEMENT timeout (#PCDATA) > | 25. References | |||
<!ELEMENT locktoken (href+) > | 25.1. Normative References | |||
<!ELEMENT href (#PCDATA) > | [REC-XML] Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., and | |||
F. Yergeau, "Extensible Markup Language (XML) 1.0 (Third | ||||
Edition)", W3C REC-xml-20040204, February 2004, | ||||
<http://www.w3.org/TR/2004/REC-xml-20040204>. | ||||
<!ELEMENT link (src+, dst+) > | [REC-XML-INFOSET] | |||
<!ELEMENT dst (#PCDATA) > | Cowan, J. and R. Tobin, "XML Information Set (Second | |||
<!ELEMENT src (#PCDATA) > | Edition)", W3C REC-xml-infoset-20040204, February 2004, | |||
<http://www.w3.org/TR/2004/REC-xml-infoset-20040204/>. | ||||
<!ELEMENT multistatus (response+, responsedescription?) > | [REC-XML-NAMES] | |||
Bray, T., Hollander, D., and A. Layman, "Namespaces in | ||||
XML", W3C REC-xml-names-19990114, January 1999, | ||||
<http://www.w3.org/TR/1999/REC-xml-names-19990114>. | ||||
<!ELEMENT response (href, ((href*, status)|(propstat+)), | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
responsedescription?) > | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
<!ELEMENT status (#PCDATA) > | ||||
<!ELEMENT propstat (prop, status, responsedescription?) > | ||||
<!ELEMENT responsedescription (#PCDATA) > | ||||
<!ELEMENT prop ANY > | [RFC2277] Alvestrand, H., "IETF Policy on Character Sets and | |||
Languages", BCP 18, RFC 2277, January 1998. | ||||
<!ELEMENT propertybehavior (omit | keepalive) > | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
<!ELEMENT omit EMPTY > | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | ||||
<!ELEMENT keepalive (#PCDATA | href+) > | [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., | |||
Leach, P., Luotonen, A., and L. Stewart, "HTTP | ||||
Authentication: Basic and Digest Access Authentication", | ||||
RFC 2617, June 1999. | ||||
<!ELEMENT propertyupdate (remove | set)+ > | [RFC3339] Klyne, G., Ed. and C. Newman, "Date and Time on the | |||
<!ELEMENT remove (prop) > | Internet: Timestamps", RFC 3339, July 2002. | |||
<!ELEMENT set (prop) > | ||||
<!ELEMENT propfind (allprop | propname | prop) > | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
<!ELEMENT allprop EMPTY > | 10646", STD 63, RFC 3629, November 2003. | |||
<!ELEMENT propname EMPTY > | ||||
<!ELEMENT collection EMPTY > | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | ||||
RFC 3986, January 2005. | ||||
<!--=========== Property Elements from Section 13 ===============--> | [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | |||
<!ELEMENT creationdate (#PCDATA) > | Unique IDentifier (UUID) URN Namespace", RFC 4122, | |||
<!ELEMENT displayname (#PCDATA) > | July 2005. | |||
<!ELEMENT getcontentlanguage (#PCDATA) > | ||||
<!ELEMENT getcontentlength (#PCDATA) > | ||||
<!ELEMENT getcontenttype (#PCDATA) > | ||||
<!ELEMENT getetag (#PCDATA) > | ||||
<!ELEMENT getlastmodified (#PCDATA) > | ||||
<!ELEMENT lockdiscovery (activelock)* > | ||||
<!ELEMENT resourcetype ANY > | ||||
<!ELEMENT source (link)* > | ||||
<!ELEMENT supportedlock (lockentry)* > | ||||
]> | ||||
A.2. Appendix 2 - ISO 8601 Date and Time Profile | 25.2. Informational References | |||
The creationdate property specifies the use of the ISO 8601 date | [RFC2291] Slein, J., Vitali, F., Whitehead, E., and D. Durand, | |||
format [ISO-8601]. This section defines a profile of the ISO 8601 | "Requirements for a Distributed Authoring and Versioning | |||
date format for use with this specification. This profile is quoted | Protocol for the World Wide Web", RFC 2291, February 1998. | |||
from an Internet-Draft by Chris Newman, and is mentioned here to | ||||
properly attribute his work. | ||||
date-time = full-date "T" full-time | [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D. | |||
Jensen, "HTTP Extensions for Distributed Authoring -- | ||||
WEBDAV", RFC 2518, February 1999. | ||||
full-date = date-fullyear "-" date-month "-" date-mday | [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media | |||
full-time = partial-time time-offset | Types", RFC 3023, January 2001. | |||
date-fullyear = 4DIGIT | [RFC3253] Clemm, G., Amsden, J., Ellison, T., Kaler, C., and J. | |||
date-month = 2DIGIT ; 01-12 | Whitehead, "Versioning Extensions to WebDAV | |||
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on | (Web Distributed Authoring and Versioning)", RFC 3253, | |||
month/year | March 2002. | |||
time-hour = 2DIGIT ; 00-23 | ||||
time-minute = 2DIGIT ; 00-59 | ||||
time-second = 2DIGIT ; 00-59, 00-60 based on leap second rules | ||||
time-secfrac = "." 1*DIGIT | ||||
time-numoffset = ("+" / "-") time-hour ":" time-minute | ||||
time-offset = "Z" / time-numoffset | ||||
partial-time = time-hour ":" time-minute ":" time-second | [RFC3648] Whitehead, J. and J. Reschke, Ed., "Web Distributed | |||
[time-secfrac] | Authoring and Versioning (WebDAV) Ordered Collections | |||
Protocol", RFC 3648, December 2003. | ||||
Numeric offsets are calculated as local time minus UTC (Coordinated | [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web | |||
Universal Time). So the equivalent time in UTC can be determined by | Distributed Authoring and Versioning (WebDAV) Access | |||
subtracting the offset from the local time. For example, 18:50:00- | Control Protocol", RFC 3744, May 2004. | |||
04:00 is the same time as 22:58:00Z. | ||||
If the time in UTC is known, but the offset to local time is unknown, | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
this can be represented with an offset of "-00:00". This differs | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
from an offset of "Z" which implies that UTC is the preferred | September 2004. | |||
reference point for the specified time. | ||||
A.3. Appendix 3 - Notes on Processing XML Elements | Appendix A. Notes on Processing XML Elements | |||
A.3.1. Notes on Empty XML Elements | A.1. Notes on Empty XML Elements | |||
XML supports two mechanisms for indicating that an XML element does | XML supports two mechanisms for indicating that an XML element does | |||
not have any content. The first is to declare an XML element of the | not have any content. The first is to declare an XML element of the | |||
form <A></A>. The second is to declare an XML element of the form | form <A></A>. The second is to declare an XML element of the form | |||
<A/>. The two XML elements are semantically identical. | <A/>. The two XML elements are semantically identical. | |||
It is a violation of the XML specification to use the <A></A> form if | A.2. Notes on Illegal XML Processing | |||
the associated DTD declares the element to be EMPTY (e.g., <!ELEMENT | ||||
A EMPTY>). If such a statement is included, then the empty element | ||||
format, <A/> must be used. If the element is not declared to be | ||||
EMPTY, then either form <A></A> or <A/> may be used for empty | ||||
elements. | ||||
A.3.2. Notes on Illegal XML Processing | ||||
XML is a flexible data format that makes it easy to submit data that | XML is a flexible data format that makes it easy to submit data that | |||
appears legal but in fact is not. The philosophy of "Be flexible in | appears legal but in fact is not. The philosophy of "Be flexible in | |||
what you accept and strict in what you send" still applies, but it | what you accept and strict in what you send" still applies, but it | |||
must not be applied inappropriately. XML is extremely flexible in | must not be applied inappropriately. XML is extremely flexible in | |||
dealing with issues of white space, element ordering, inserting new | dealing with issues of white space, element ordering, inserting new | |||
elements, etc. This flexibility does not require extension, | elements, etc. This flexibility does not require extension, | |||
especially not in the area of the meaning of elements. | especially not in the area of the meaning of elements. | |||
There is no kindness in accepting illegal combinations of XML | There is no kindness in accepting illegal combinations of XML | |||
elements. At best it will cause an unwanted result and at worst it | elements. At best it will cause an unwanted result and at worst it | |||
can cause real damage. | can cause real damage. | |||
A.3.2.1. Example - XML Syntax Error | A.3. Example - XML Syntax Error | |||
The following request body for a PROPFIND method is illegal. | The following request body for a PROPFIND method is illegal. | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:"> | <D:propfind xmlns:D="DAV:"> | |||
<D:allprop/> | <D:allprop/> | |||
<D:propname/> | <D:propname/> | |||
</D:propfind> | </D:propfind> | |||
The definition of the propfind element only allows for the allprop or | The definition of the propfind element only allows for the allprop or | |||
the propname element, not both. Thus the above is an error and must | the propname element, not both. Thus the above is an error and must | |||
be responded to with a 400 (Bad Request). | be responded to with a 400 (Bad Request). | |||
Imagine, however, that a server wanted to be "kind" and decided to | Imagine, however, that a server wanted to be "kind" and decided to | |||
pick the allprop element as the true element and respond to it. A | pick the allprop element as the true element and respond to it. A | |||
client running over a bandwidth limited line who intended to execute | client running over a bandwidth limited line who intended to execute | |||
a propname would be in for a big surprise if the server treated the | a propname would be in for a big surprise if the server treated the | |||
command as an allprop. | command as an allprop. | |||
Additionally, if a server were lenient and decided to reply to this | Additionally, if a server were lenient and decided to reply to this | |||
request, the results would vary randomly from server to server, with | request, the results would vary randomly from server to server, with | |||
some servers executing the allprop directive, and others executing | some servers executing the allprop directive, and others executing | |||
the propname directive. This reduces interoperability rather than | the propname directive. This reduces interoperability rather than | |||
increasing it. | increasing it. | |||
A.3.2.2. Example - Unknown XML Element | A.4. Example - Unexpected XML Element | |||
The previous example was illegal because it contained two elements | The previous example was illegal because it contained two elements | |||
that were explicitly banned from appearing together in the propfind | that were explicitly banned from appearing together in the propfind | |||
element. However, XML is an extensible language, so one can imagine | element. However, XML is an extensible language, so one can imagine | |||
new elements being defined for use with propfind. Below is the | new elements being defined for use with propfind. Below is the | |||
request body of a PROPFIND and, like the previous example, must be | request body of a PROPFIND and, like the previous example, must be | |||
rejected with a 400 (Bad Request) by a server that does not | rejected with a 400 (Bad Request) by a server that does not | |||
understand the expired-props element. | understand the expired-props element. | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:" | <D:propfind xmlns:D="DAV:" | |||
xmlns:E="http://www.foo.bar/standards/props/"> | xmlns:E="http://www.example.com/standards/props/"> | |||
<E:expired-props/> | <E:expired-props/> | |||
</D:propfind> | </D:propfind> | |||
To understand why a 400 (Bad Request) is returned let us look at the | To understand why a 400 (Bad Request) is returned let us look at the | |||
request body as the server unfamiliar with expired-props sees it. | request body as the server unfamiliar with expired-props sees it. | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:" | <D:propfind xmlns:D="DAV:" | |||
xmlns:E="http://www.foo.bar/standards/props/"> | xmlns:E="http://www.example.com/standards/props/"> | |||
</D:propfind> | </D:propfind> | |||
As the server does not understand the expired-props element, | As the server does not understand the 'expired-props' element, | |||
according to the WebDAV-specific XML processing rules specified in | according to the WebDAV-specific XML processing rules specified in | |||
Section 14, it must ignore it. Thus the server sees an empty | Section 17, it must process the request as if the element were not | |||
propfind, which by the definition of the propfind element is illegal. | there. Thus the server sees an empty propfind, which by the | |||
definition of the propfind element is illegal. | ||||
Please note that had the extension been additive it would not | Please note that had the extension been additive it would not | |||
necessarily have resulted in a 400 (Bad Request). For example, | necessarily have resulted in a 400 (Bad Request). For example, | |||
imagine the following request body for a PROPFIND: | imagine the following request body for a PROPFIND: | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | |||
<D:propfind xmlns:D="DAV:" | <D:propfind xmlns:D="DAV:" | |||
xmlns:E="http://www.foo.bar/standards/props/"> | xmlns:E="http://www.example.com/standards/props/"> | |||
<D:propname/> | <D:propname/> | |||
<E:leave-out>*boss*</E:leave-out> | <E:leave-out>*boss*</E:leave-out> | |||
</D:propfind> | </D:propfind> | |||
The previous example contains the fictitious element leave-out. Its | The previous example contains the fictitious element leave-out. Its | |||
purpose is to prevent the return of any property whose name matches | purpose is to prevent the return of any property whose name matches | |||
the submitted pattern. If the previous example were submitted to a | the submitted pattern. If the previous example were submitted to a | |||
server unfamiliar with leave-out, the only result would be that the | server unfamiliar with 'leave-out', the only result would be that the | |||
leave-out element would be ignored and a propname would be executed. | 'leave-out' element would be ignored and a propname would be | |||
executed. | ||||
A.4. Appendix 4 -- XML Namespaces for WebDAV | Appendix B. Notes on HTTP Client Compatibility | |||
A.4.1. Introduction | WebDAV was designed to be, and has been found to be, backward- | |||
compatible with HTTP 1.1. The PUT and DELETE methods are defined in | ||||
HTTP and thus may be used by HTTP clients as well as WebDAV-aware | ||||
clients, but the responses to PUT and DELETE have been extended in | ||||
this specification in ways that only a WebDAV client would be | ||||
entirely prepared for. Some theoretical concerns were raised about | ||||
whether those responses would cause interoperability problems with | ||||
HTTP-only clients, and this section addresses those concerns. | ||||
All DAV compliant systems MUST support the XML namespace extensions | Since any HTTP client ought to handle unrecognized 400-level and 500- | |||
as specified in [REC-XML-NAMES]. | level status codes as errors, the following new status codes should | |||
not present any issues: 422, 423 and 507 (424 is also a new status | ||||
code but it appears only in the body of a Multistatus response.) So, | ||||
for example, if a HTTP client attempted to PUT or DELETE a locked | ||||
resource, the 423 Locked response ought to result in a generic error | ||||
presented to the user. | ||||
A.4.2. Meaning of Qualified Names | The 207 Multistatus response is interesting because a HTTP client | |||
issuing a DELETE request to a collection might interpret a 207 | ||||
response as a success, even though it does not realize the resource | ||||
is a collection and cannot understand that the DELETE operation might | ||||
have been a complete or partial failure. That interpretation isn't | ||||
entirely justified, because a 200-level response indicates that the | ||||
server "received, understood and accepted" the request, not that the | ||||
request resulted in complete success. | ||||
[Note to the reader: This section does not appear in [REC-XML-NAMES], | One option is that a server could treat a DELETE of a collection as | |||
but is necessary to avoid ambiguity for WebDAV XML processors.] | an atomic operation, and use either 204 No Content in case of | |||
success, or some appropriate error response (400 or 500 level) for an | ||||
error. This approach would indeed maximize backward compatibility. | ||||
However, since interoperability tests and working group discussions | ||||
have not turned up any instances of HTTP clients issuing a DELETE | ||||
request against a WebDAV collection, this concern is more theoretical | ||||
than practical. Thus, servers are likely to be completely successful | ||||
at interoperating with HTTP clients even if they treat any collection | ||||
DELETE request as a WebDAV request and send a 207 Multistatus | ||||
response. | ||||
WebDAV compliant XML processors MUST interpret a qualified name as a | In general server implementations are encouraged to use the detailed | |||
URI constructed by appending the LocalPart to the namespace name URI. | responses and other mechanisms defined in this document rather than | |||
make changes for theoretical interoperability concerns. | ||||
Example | Appendix C. The 'opaquelocktoken' Scheme and URIs | |||
<del:glider xmlns:del="http://www.del.jensen.org/"> | The 'opaquelocktoken' URI scheme was defined in [RFC2518] (and | |||
<del:glidername> | registered by IANA) in order to create syntactically correct and | |||
Johnny Updraft | easy-to-generate URIs out of UUIDs, intended to be used as lock | |||
</del:glidername> | tokens and to be unique across all resources for all time. | |||
<del:glideraccidents/> | ||||
</del:glider> | ||||
In this example, the qualified element name "del:glider" is | An opaquelocktoken URI is constructed by concatenating the | |||
interpreted as the URL "http://www.del.jensen.org/glider". | 'opaquelocktoken' scheme with a UUID, along with an optional | |||
extension. Servers can create new UUIDs for each new lock token. If | ||||
a server wishes to reuse UUIDs the server MUST add an extension and | ||||
the algorithm generating the extension MUST guarantee that the same | ||||
extension will never be used twice with the associated UUID. | ||||
<bar:glider xmlns:del="http://www.del.jensen.org/"> | OpaqueLockToken-URI = "opaquelocktoken:" UUID [Extension] | |||
<bar:glidername> | ; UUID is defined in Section 3 of [RFC4122]. Note that LWS | |||
Johnny Updraft | ; is not allowed between elements of | |||
</bar:glidername> | ; this production. | |||
<bar:glideraccidents/> | ||||
</bar:glider> | ||||
Even though this example is syntactically different from the previous | Extension = path | |||
example, it is semantically identical. Each instance of the | ; path is defined in Section 3.3 of [RFC3986] | |||
namespace name "bar" is replaced with "http://www.del.jensen.org/" | ||||
and then appended to the local name for each element tag. The | ||||
resulting tag names in this example are exactly the same as for the | ||||
previous example. | ||||
<foo:r xmlns:foo="http://www.del.jensen.org/glide"> | Appendix D. Lock-null Resources | |||
<foo:rname> | ||||
Johnny Updraft | ||||
</foo:rname> | ||||
<foo:raccidents/> | ||||
</foo:r> | ||||
This example is semantically identical to the two previous ones. | The original WebDAV model for locking unmapped URLs created "lock- | |||
Each instance of the namespace name "foo" is replaced with | null resources". This model was over-complicated and some | |||
"http://www.del.jensen.org/glide" which is then appended to the local | interoperability and implementation problems were discovered. The | |||
name for each element tag, the resulting tag names are identical to | new WebDAV model for locking unmapped URLs (see Section 7.3) creates | |||
those in the previous examples. | "locked empty resources". Lock-null resources are deprecated. This | |||
section discusses the original model briefly because clients MUST be | ||||
able to handle either model. | ||||
Index | In the original "lock-null resource" model, which is no longer | |||
recommended for implementation: | ||||
1 | o A lock-null resource sometimes appeared as "Not Found". The | |||
102 Processing (status code) 61-62 | server responds with a 404 or 405 to any method except for PUT, | |||
MKCOL, OPTIONS, PROPFIND, LOCK, UNLOCK. | ||||
2 | o A lock-null resource does however show up as a member of its | |||
207 Multi-Status (status code) 63-64 | parent collection. | |||
4 | o The server removes the lock-null resource entirely (its URI | |||
422 Unprocessable Entity (status code) 63 | becomes unmapped) if its lock goes away before it is converted to | |||
423 Locked (status code) 63 | a regular resource. Recall that locks go away not only when they | |||
424 Failed Dependency (status code) 63 | expire or are unlcoked, but are also removed if a resource is | |||
renamed or moved, or if any parent collection is renamed or moved. | ||||
5 | o The server converts the lock-null resource into a regular resource | |||
507 Insufficient Storage (status code) 63 | if a PUT request to the URL is successful. | |||
A | o The server converts the lock-null resource into a collection if a | |||
activelock | MKCOL request to the URL is successful (though interoperability | |||
XML element 64 | experience showed that not all servers followed this requirement). | |||
allprop | ||||
XML element 74 | ||||
C | o Property values were defined for DAV:lockdiscovery and DAV: | |||
Collection 8 | supportedlock properties but not necessarily for other properties | |||
COPY method 39 | like DAV:getcontenttype. | |||
D | Clients can easily interoperate both with servers that support the | |||
DAV header 56 | old model "lock-null resources" and the recommended model of "locked | |||
compliance class '1' 83 | empty resources" by only attempting PUT after a LOCK to an unmapped | |||
compliance class '2' 83 | URL, not MKCOL or GET. | |||
DAV:collection resource type 65 | ||||
DAV:creationdate property 75 | ||||
DAV:displayname property 75 | ||||
DAV:getcontentlanguage property 75 | ||||
DAV:getcontentlength property 76 | ||||
DAV:getcontenttype property 76 | ||||
DAV:getetag property 76 | ||||
DAV:getlastmodified property 77 | ||||
DAV:lockdiscovery property 77 | ||||
DAV:resourcetype property 79 | ||||
DAV:source property 80 | ||||
DAV:supportedlock property 81 | ||||
Dead Property 8 | ||||
DELETE method 37 | ||||
depth | ||||
XML element 64 | ||||
Depth header 56 | ||||
Destination header 57 | ||||
dst | ||||
XML element 66 | ||||
E | D.1. Guidance for Clients Using LOCK to Create Resources | |||
exclusive | ||||
XML element 68 | ||||
H | A WebDAV client implemented to this specification might find servers | |||
Headers | that create lock-null resources (implemented before this | |||
DAV 56 | specification using [RFC2518]) as well as servers that create locked | |||
Depth 56 | empty resources. The response to the LOCK request will not indicate | |||
Destination 57 | what kind of resource was created. There are a few techniques which | |||
If 57 | help the client deal with either type. | |||
Lock-Token 60 | ||||
Overwrite 60 | ||||
Status-URI 61 | ||||
Timeout 61 | ||||
href | ||||
XML element 65 | ||||
I | If the client wishes to avoid accidentally creating either lock- | |||
If header 57 | null or empty locked resources, an "If-Match: *" header can be | |||
Internal Member URI 8 | included with LOCK requests to prevent the server from creating a | |||
new resource. | ||||
K | If a LOCK request creates a resource and the client subsequently | |||
keepalive | wants to overwrite that resource using a COPY or MOVE request, the | |||
XML element 71 | client should include an "Overwrite: T" header. | |||
L | If a LOCK request creates a resource and the client then decides | |||
link | to get rid of that resource, a DELETE request is supposed to fail | |||
XML element 66 | on a lock-null resource and UNLOCK should be used instead. But | |||
Live Property 8 | with a locked empty resource, UNLOCK doesn't make the resource | |||
LOCK method 48 | disappear. Therefore, the client might have to try both requests | |||
Lock-Token header 60 | and ignore an error in one of the two requests. | |||
lockentry | ||||
XML element 67 | ||||
lockinfo | ||||
XML element 67 | ||||
lockscope | ||||
XML element 67 | ||||
locktoken | ||||
XML element 65 | ||||
locktype | ||||
XML element 68 | ||||
M | Appendix E. Guidance for Clients Desiring to Authenticate | |||
Member URI 8 | ||||
Methods | ||||
COPY 39 | ||||
DELETE 37 | ||||
LOCK 48 | ||||
MKCOL 35 | ||||
MOVE 44 | ||||
PROPFIND 24 | ||||
PROPPATCH 33 | ||||
PUT 39 | ||||
UNLOCK 55 | ||||
MKCOL method 35 | ||||
MOVE method 44 | ||||
multistatus | ||||
XML element 69 | ||||
N | Many WebDAV clients already implemented have account settings | |||
Null Resource 8 | (similar to the way email clients store IMAP account settings). | |||
Thus, the WebDAV client would be able to authenticate with its first | ||||
couple requests to the server, provided it had a way to get the | ||||
authentication challenge from the server with realm name, nonce and | ||||
other challenge information. Note that the results of some requests | ||||
might vary according to whether the client is authenticated or not -- | ||||
a PROPFIND might return more visible resources if the client is | ||||
authenticated, yet not fail if the client is anonymous. | ||||
O | There are a number of ways the client might be able to trigger the | |||
omit | server do provide an authentication challenge. This appendix | |||
XML element 72 | describes a couple approaches that seem particularly likely to work. | |||
Overwrite header 60 | ||||
owner | ||||
XML element 70 | ||||
P | The first approach is to perform a request that ought to require | |||
prop | authentication. However, it's possible that a server might handle | |||
XML element 71 | any request even without authentication, so to be entirely safe the | |||
Properties | client could add a conditional header to ensure that even if the | |||
DAV:creationdate 75 | request passes permissions checks it's not actually handled by the | |||
DAV:displayname 75 | server. An example of following this approach would be to use a PUT | |||
DAV:getcontentlanguage 75 | request with an "If-Match" header with a made-up ETag value. This | |||
DAV:getcontentlength 76 | approach might fail to result in an authentication challenge if the | |||
DAV:getcontenttype 76 | server does not test authorization before testing conditionals as is | |||
DAV:getetag 76 | required (see Section 8.5), or if the server does not need to test | |||
DAV:getlastmodified 77 | authorization. | |||
DAV:lockdiscovery 77 | ||||
DAV:resourcetype 79 | ||||
DAV:source 80 | ||||
DAV:supportedlock 81 | ||||
Property 8 | ||||
propertybehaviour | ||||
XML element 71 | ||||
propertyupdate | ||||
XML element 72 | ||||
propfind | ||||
XML element 74 | ||||
PROPFIND method 24 | ||||
propname | ||||
XML element 74 | ||||
PROPPATCH method 33 | ||||
propstat | ||||
XML element 69 | ||||
PUT method 39 | ||||
R | Example - forcing auth challenge with write request | |||
remove | ||||
XML element 73 | ||||
Resource Types | ||||
DAV:collection 65 | ||||
response | ||||
XML element 69 | ||||
responsedescription | ||||
XML element 70 | ||||
S | >>Request | |||
set | ||||
XML element 73 | ||||
shared | ||||
XML element 68 | ||||
src | ||||
XML element 66 | ||||
status | ||||
XML element 70 | ||||
Status Codes | ||||
102 Processing 61-62 | ||||
207 Multi-Status 63-64 | ||||
422 Unprocessable Entity 63 | ||||
423 Locked 63 | ||||
424 Failed Dependency 63 | ||||
507 Insufficient Storage 63 | ||||
Status-URI header 61 | ||||
T | PUT /forceauth.txt HTTP/1.1 | |||
timeout | Host: www.example.com | |||
XML element 65 | If-Match: "xxx" | |||
Timeout header 61 | Content-Type: text/plain | |||
Content-Length: 0 | ||||
U | The second approach is to use an Authorization header (defined in | |||
UNLOCK method 55 | [RFC2617]) which is likely to be rejected by the server but which | |||
URI 7 | will then prompt a proper authentication challenge. For example, the | |||
URL 7 | client could start with a PROPFIND request containing an | |||
Authorization header containing a made-up Basic userid:password | ||||
string or with actual plausible credentials. This approach relies on | ||||
the server responding with a "401 Unauthorized" along with a | ||||
challenge if it receives an Authorization header with an unrecognized | ||||
username, invalid password, or if it doesn't even handle Basic | ||||
authentication. This seems likely to work because of the | ||||
requirements of RFC2617: | ||||
W | "If the origin server does not wish to accept the credentials sent | |||
write | with a request, it SHOULD return a 401 (Unauthorized) response. The | |||
XML element 68 | response MUST include a WWW-Authenticate header field containing at | |||
least one (possibly new) challenge applicable to the requested | ||||
resource." | ||||
Authors' Addresses | There's a slight problem with implementing that recommendation in | |||
some cases, because some servers do not even have challenge | ||||
information for certain resources. Thus, when there's no way to | ||||
authenticate to a resource or the resource is entirely publicly | ||||
available over all accepted methods, the server MAY ignore the | ||||
Authorization header, and the client presumably try again later. | ||||
Y. Y. Goland | Example - forcing auth challenge with Authorization header | |||
Microsoft Corporation | ||||
One Microsoft Way | ||||
Redmond, WA 98052-6399 | ||||
Email: yarong@microsoft.com | >>Request | |||
E. J. Whitehead, Jr. | PROPFIND /docs/ HTTP/1.1 | |||
Dept. Of Information and Computer Science, University of California, Irvine | Host: www.example.com | |||
Irvine, CA 92697-3425 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | |||
Content-type: application/xml; charset="utf-8" | ||||
Content-Length: xxxx | ||||
Email: ejw@ics.uci.edu | [body omitted] | |||
A. Faizi | Appendix F. Summary of changes from RFC2518 | |||
Netscape | ||||
685 East Middlefield Road | ||||
Mountain View, CA 94043 | ||||
Email: asad@netscape.com | This section lists major changes between this document and RFC2518, | |||
starting with those that are likely to result in implementation | ||||
changes. Servers will advertise support for all changes in this | ||||
specification by returning the compliance class "3" in the DAV | ||||
response header (see Sections 10.1 and 18.3). | ||||
S. R. Carter | F.1. Changes for both Client and Server Implementations | |||
Novell | ||||
1555 N. Technology Way | ||||
M/S ORM F111 | ||||
Orem, UT 84097-2399 | ||||
Email: srcarter@novell.com | Collections and Namespace Operations | |||
D. Jensen | ||||
Novell | ||||
1555 N. Technology Way | ||||
M/S ORM F111 | ||||
Orem, UT 84097-2399 | ||||
Email: dcjensen@novell.com | o The semantics of PROPFIND 'allprop' (Section 9.1) have been | |||
relaxed so that servers return results including, at a minimum, | ||||
the live properties defined in this specification, but not | ||||
necessarily return other live properties. The 'allprop' directive | ||||
therefore means something more like "return all properties that | ||||
are supposed to be returned when 'allprop' is requested" -- a set | ||||
of properties which may include custom properties and properties | ||||
defined in other specifications if those other specifications so | ||||
require. Related to this, 'allprop' requests can now be extended | ||||
with the 'include' syntax to include specific named properties, | ||||
thereby avoiding additional requests due to changed 'allprop' | ||||
semantics. | ||||
Full Copyright Statement | o Servers are now allowed to reject PROPFIND requests with Depth: | |||
Infinity. Clients that used this will need to be able to do a | ||||
series of Depth:1 requests instead. | ||||
Copyright (C) The Internet Society (1999). All Rights Reserved. | o Multistatus response bodies now can transport the value of HTTP's | |||
Location response header in the new 'location' element. Clients | ||||
may use this to avoid additional roundtrips to the server when | ||||
there is a 'response' element with a 3xx status (see | ||||
Section 14.24). | ||||
This document and translations of it may be copied and furnished to | o The definition of COPY has been relaxed so that it doesn't require | |||
others, and derivative works that comment on or otherwise explain it | servers to first delete the target resources anymore (this was a | |||
or assist in its implementation may be prepared, copied, published | known incompatibility with [RFC3253]). See Section 9.8. | |||
and distributed, in whole or in part, without restriction of any | ||||
kind, provided that the above copyright notice and this paragraph are | ||||
included on all such copies and derivative works. However, this | ||||
document itself may not be modified in any way, such as by removing | ||||
the copyright notice or references to the Internet Society or other | ||||
Internet organizations, except as needed for the purpose of | ||||
developing Internet standards in which case the procedures for | ||||
copyrights defined in the Internet Standards process must be | ||||
followed, or as required to translate it into languages other than | ||||
English. | ||||
The limited permissions granted above are perpetual and will not be | Headers and Marshalling | |||
revoked by the Internet Society or its successors or assigns. | ||||
This document and the information contained herein is provided on an | o The Destination and If request headers now allow absolute paths in | |||
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING | addition to full URIs (see Section 8.3). This may be useful for | |||
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING | clients operating through a reverse proxy that does rewrite the | |||
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION | Host request header, but not WebDAV-specific headers. | |||
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF | ||||
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | o This specification adopts the error marshalling extensions and the | |||
"precondition/postcondition" terminology defined in [RFC3253] (see | ||||
Section 16). Related to that, it adds the "error" XML element | ||||
inside multistatus response bodies (see Section 14.5, however note | ||||
that it uses a format different from the one recommend in | ||||
RFC3253). | ||||
o Senders and recipients are now required to support the UTF-16 | ||||
character encoding in XML message bodies (see Section 19). | ||||
o Clients are now required to send the Depth header on PROPFIND | ||||
requests, although servers are still encouraged to support clients | ||||
that don't. | ||||
Locking | ||||
o RFC2518's concept of "lock-null resources" (LNRs) has been | ||||
replaced by a simplified approach, the "locked empty resources" | ||||
(see Section 7.3). There are some aspects of lock-null resources | ||||
clients can not rely on anymore, namely the ability to use them to | ||||
create a locked collection or the fact that they disappear upon | ||||
UNLOCK when no PUT or MKCOL request was issued. Note that servers | ||||
are still allowed to implement LNRs as per RFC2518. | ||||
o There is no implicit refresh of locks anymore. Locks are only | ||||
refreshed upon explicit request (see Section 9.10.2). | ||||
o Clarified that the DAV:owner value supplied in the LOCK request | ||||
must be preserved by the server just like a dead property | ||||
(Section 14.17). Also added the DAV:lockroot element | ||||
(Section 14.12) which allows clients to discover the root of lock. | ||||
F.2. Changes for Server Implementations | ||||
Collections and Namespace Operations | ||||
o Due to interoperability problems, allowable formats for contents | ||||
of 'href' elements in multistatus responses have been limited (see | ||||
Section 8.3). | ||||
o Due to lack of implementation, support for the 'propertybehaviour' | ||||
request body for COPY and MOVE has been removed. Instead, | ||||
requirements for property preservation have been clarified (see | ||||
Sections 9.8 and 9.9). | ||||
Properties | ||||
o Strengthened server requirements for storage of property values, | ||||
in particular persistence of language information (xml:lang), | ||||
whitespace, and XML namespace information (see Section 4.3). | ||||
o Clarified requirements on which properties should be writeable by | ||||
the client; in particular, setting "DAV:displayname" should be | ||||
supported by servers (see Section 15). | ||||
o Only 'rfc1123-date' productions are legal as values for DAV: | ||||
getlastmodified (see Section 15.7). | ||||
Headers and Marshalling | ||||
o Servers are now required to do authorization checks before | ||||
processing conditional headers (see Section 8.5). | ||||
Locking | ||||
o Strengthened requirement to check identity of lock creator when | ||||
accessing locked resources (see Section 6.4). Clients should be | ||||
aware that lock tokens returned to other principals can only be | ||||
used to break a lock, if at all. | ||||
o Section 8.10.4 of [RFC2518] incorrectly required servers to return | ||||
a 409 status where a 207 status was really appropriate. This has | ||||
been corrected (Section 9.10). | ||||
F.3. Other Changes | ||||
The definition of collection state has been fixed so it doesn't vary | ||||
anymore depending on the Request-URI (see Section 5.2). | ||||
The DAV:source property introduced in Section 4.6 of [RFC2518] was | ||||
removed due to lack of implementation experience. | ||||
The DAV header now allows non-IETF extensions through URIs in | ||||
addition to compliance class tokens. It also can now be used in | ||||
requests, although this specification does not define any associated | ||||
semantics for the compliance classes defined in here (see | ||||
Section 10.1). | ||||
In RFC2518, the definition of the Depth header (Section 9.2) required | ||||
that by default request headers would be applied to each resource in | ||||
scope. Based on implementation experience, the default has now been | ||||
reversed (see Section 10.2). | ||||
The definitions of HTTP status code 102 ([RFC2518], Section 10.1) and | ||||
the Status-URI response header (Section 9.7) have been removed due to | ||||
lack of implementation. | ||||
The TimeType format used in the Timeout request header and the | ||||
"timeout" XML element used to be extensible. Now, only the two | ||||
formats defined by this specification are allowed (see Section 10.7). | ||||
Appendix G. Change Log (to be removed by RFC Editor before publication) | ||||
G.1. Changes from -05 to -06 | ||||
Specified that a successful LOCK request to an unmapped URL creates a | ||||
new, empty locked resource. | ||||
Resolved UNLOCK_NEEDS_IF_HEADER by clarifying that only Lock-Token | ||||
header is needed on UNLOCK. | ||||
Added Section 16 on preconditions and postconditions and defined a | ||||
number of preconditions and postconditions. The 'lock-token- | ||||
submitted' precondition resolves the REPORT_OTHER_RESOURCE_LOCKED | ||||
issue. | ||||
Added example of matching lock token to URI in the case of a | ||||
collection lock in the If header section. | ||||
Removed ability for Destination header to take "abs_path" in order to | ||||
keep consistent with other places where client provides URLs (If | ||||
header, href element in request body) | ||||
Clarified the href element - that it generally contains HTTP URIs but | ||||
not always. | ||||
Attempted to fix the BNF describing the If header to allow commas | ||||
Clarified presence of Depth header on LOCK refresh requests. | ||||
G.2. Changes in -07 | ||||
Added text to "COPY and the Overwrite Header" section to resolve | ||||
issue OVERWRITE_DELETE_ALL_TOO_STRONG. | ||||
Added text to "HTTP URL Namespace Model" section to provide more | ||||
clarification and examples on what consistency means and what is not | ||||
required, to resolve issue CONSISTENCY. | ||||
Resolve DEFINE_PRINCIPAL by importing definition of principal from | ||||
RFC3744. | ||||
Resolve INTEROP_DELETE_AND_MULTISTATUS by adding appendix 3 | ||||
discussing backward-compatibility concerns. | ||||
Resolve DATE_FORMAT_GETLASTMODIFIED by allowing only rfc1123-date, | ||||
not HTTP-date for getlastmodified. | ||||
Resolve COPY_INTO_YOURSELF_CLARIFY by adding sentence to first para. | ||||
of COPY section. | ||||
Confirm that WHEN_TO_MULTISTATUS_FOR_DELETE_1 and | ||||
WHEN_TO_MULTISTATUS_FOR_DELETE_2 are resolved and tweak language in | ||||
DELETE section slightly to be clearly consistent. | ||||
More text clarifications to deal with several of the issues in | ||||
LOCK_ISSUES. This may not completely resolve that set but we need | ||||
feedback from the originator of the issues at this point. | ||||
Resolved COPY_INTO_YOURSELF_CLARIFY with new sentence in Copy For | ||||
Collections section. | ||||
Double checked that LEVEL_OR_CLASS is resolved by using class, not | ||||
level. | ||||
Further work to resolve IF_AND_AUTH and LOCK_SEMANTICS, clarifying | ||||
text on using locks and being authenticated. | ||||
Added notes on use of 503 status response to resolve issue | ||||
PROPFIND_INFINITY | ||||
Removed section on other uses of Metadata (and associated references) | ||||
Added reference to RFC4122 for lock tokens and removed section on | ||||
generating UUIDs | ||||
Explained that even with language variation, a property has only one | ||||
value (Section 4.5). | ||||
Added section on lock owner (7.1) and what to do if lock requested by | ||||
unauthenticated user | ||||
Removed Section 4.2 -- justification on why to have metadata, not | ||||
needed now | ||||
Removed paragraph in Section 5.2 about collections with resource type | ||||
"DAV:collection" but which are non-WebDAV compliant -- not | ||||
implemented. | ||||
G.3. Changes in -08 | ||||
Added security considerations section on scripts and cookie sessions, | ||||
suggested by Barry Lind | ||||
Clarified which error codes are defined and undefined in MultiStatus | ||||
Moved opaquelocktoken definition to an appendix and refer to RFC4122 | ||||
for use of 'urn:uuid:' URI scheme; fix all lock token examples to use | ||||
this. | ||||
Multi-status responses contain URLs which MUST either be absolute | ||||
(and begin with the Request-URI or MUST be relative with new | ||||
limitations. (bug 12) | ||||
Moved status code sections before example sections within PROPFIND | ||||
section for section ordering consistency. | ||||
Clarified use of Location header with Multi-Status | ||||
Bugzilla issue resolutions: bugs 9, 12, 14, 19, 20, 29, 30, 34, 36, | ||||
102 and 172. | ||||
G.4. Changes in -09 | ||||
Bugzilla editorial issues: bugs 30, 57, 63, 68, 88, 89, 168, 180, | ||||
182, 185, 187. | ||||
More clarity between URL namespaces and XML namespaces, particularly | ||||
at the beginning of paragraphs using the word namespace | ||||
More consistency in referring to properties with the namespace, as in | ||||
"DAV:lockdiscovery", and referring to XML element names in single | ||||
quotes, e.g. 'allprop' element. | ||||
Figure (example) formatting fixes | ||||
Bugzilla issues: bugs 24, 37, 39, 43, 45, 27, 25 | ||||
Replaced references to "non-null state" of resources with more clear | ||||
language about URLs that are mapped to resources, bug 25. Also added | ||||
definition of URL/URI mapping. Bug 40. | ||||
Bugzilla issues: bug 7, 8, 9, 41, 47, 51, 62, 93, 171, 172. Bugs 28 | ||||
and 94 were iterated on. | ||||
Bugzilla issues: 56, 59, 79, 99, 103, 175, 178. Part of bug 23. | ||||
Iteration on bug 10. | ||||
Iteration on bugs 10, 46 and 47. Bug 11. | ||||
Remove "102 Processing" response | ||||
Fix bug 46, 105, 107, 120, 140 and 201. | ||||
Another stab at bug 12 - relative v. absolute URLs in Multi-Status | ||||
response hrefs | ||||
Fix bug 6, 11, 15, 16, 28, 32, 42, 51, 52, 53, 58, 60, 62, 186, 189, | ||||
191, 199, 200 | ||||
Fix bug 96 | ||||
G.5. Changes in -10 | ||||
Clarify lock intro text on when a client might use another client's | ||||
lock token - suggestion by Geoff, Nov 15 | ||||
Removed Force-Authenticate header and instead added an appendix | ||||
explaining how existing mechanisms might resolve the need of clients | ||||
to get an authentication challenge (bug 18). | ||||
Bug 62, 113, 125, 131, 143, 144, 171, 193 | ||||
Bug 176, 177, 179, 181, 184, 206, 207, 208 | ||||
G.6. Changes in -11 | ||||
Bug 10, 50, 92, 213, 214, 215 | ||||
not recommend use of 414 for over-long Destination URI, bug 179 | ||||
Changes for bug 10, 31, 42, 44, 46, 47, 80, 86, 99, 124, 132, 143, | ||||
147, 152, 166, 177, 188, 216, 218 | ||||
Various changes discussed in conference call, including bug 10, 42, | ||||
44, 80, 97, 152. | ||||
Bugs 55, 85, 86 | ||||
G.7. Changes in -12 | ||||
Incorporated GULP (Lock model) into document, making a fair number of | ||||
changes to rationalize the new order of explaining things, keeping | ||||
text that explains a lock model concept in more detail but removing | ||||
text that is redundant or inconsistent. | ||||
Various bugs including 46, 48, 53, 97, 152, 179, 184, 188, 200, 210, | ||||
211, and 225. Moved URL Handling from Multi-Status section to | ||||
general request and response handling section as it now applies to | ||||
Destination and If as well as 'href' in Multi-Status. Moved GR&RH | ||||
section up one level to be the new Section 8. | ||||
Bug 53, 184, 210, 213, 217, 221 | ||||
Further rewriting of URL Handling section. Changes resulting from | ||||
discussion of empty locked resources and how servers should handle | ||||
Content-Type in that situation. Bug 48, 179. | ||||
Bug 227, 228 | ||||
G.8. Changes in -13 | ||||
Moved the timeout model text and clarified it (bug 229). | ||||
Fixed the definition of collection state (bug 227). | ||||
Made the depth header required on PROPFIND requests (bug 213). | ||||
Fixed inconsistencies in Destination header definition (bug 211). | ||||
Improved appendix on HTTP client compatibility (bug 100). | ||||
Fixed external references with unwieldy pointers (bug 72). | ||||
G.9. Changes in -14 | ||||
Changes section rewritten, if section rewritten | ||||
Collection definition and membership requirements changed (bug 227) | ||||
Bug 100 and 229 iterations, smallish editorial changes | ||||
G.10. Changes in -15 | ||||
Moved lock-null resource explanation to an appendix. | ||||
Reverted to RFC2518 behavior of refreshing lock with "If" header. | ||||
Removed section on locks and multiple bindings. | ||||
Removed requirement for clients to upate a property only once in a | ||||
PROPPATCH. | ||||
Updated displayname property description. | ||||
Copy-edit level changes e.g. "read-only" to "protected", and defining | ||||
what it means to protect a resource with a lock. | ||||
G.11. Changes in -16 | ||||
Fixed factual errors in Security Considerations authentication | ||||
section. | ||||
Fixed example of refreshing a lock -- didn't use "If" header as | ||||
required in the text. | ||||
Fixed example of using so-called 'all-prop' with the 'include' | ||||
directivenotifi, so that it would actually be a useful example, by | ||||
including live properties that wouldn't already be covered by 'all- | ||||
prop'. | ||||
Clarified requirement in section 7.7 paragraph 2 -- a clear | ||||
requirement for the server to meet, rather than passive voice "this | ||||
request MUST only be used". | ||||
Made explicit requirement for successful response format for | ||||
PROPPATCH (bug 238) | ||||
Some fixes for bugs 213, 241, 246, 248, 249, 250 -- all editorial | ||||
changes. | ||||
Tighten requirements in Security Considerations section for | ||||
authentication over secure channels. | ||||
G.12. Changes in -17 | ||||
Change reference for PROPFIND MultiStatus response format from | ||||
section 15 to section 9.2.1 | ||||
Add another "except" clause to statement requiring pre/postcondition | ||||
codes to appear in 'error' | ||||
Remove requirement to use TLS -- back to requiring channel to be | ||||
secure. | ||||
G.13. Changes in -18 | ||||
Text clarifications and typo fixes in response to IETF Last Call | ||||
comments | ||||
Removed suggestive/confusing text about lock notifications | ||||
Add section with guidance for clients dealing with both lock-null | ||||
resources and locked empty resources. | ||||
Allow servers to omit owner information in lockdiscovery property. | ||||
Clarify what 'allprop' means, mostly fixing misleading text in change | ||||
summary | ||||
Author's Address | ||||
Lisa Dusseault (editor) | ||||
CommerceNet | ||||
2064 Edgewood Dr. | ||||
Palo Alto, CA 94303 | ||||
US | ||||
Email: ldusseault@commerce.net | ||||
Full Copyright Statement | ||||
Copyright (C) The IETF Trust (2007). | ||||
This document is subject to the rights, licenses and restrictions | ||||
contained in BCP 78, and except as set forth therein, the authors | ||||
retain all their rights. | ||||
This document and the information contained herein are provided on an | ||||
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS | ||||
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND | ||||
THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS | ||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF | ||||
THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED | ||||
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | ||||
Intellectual Property | Intellectual Property | |||
The IETF takes no position regarding the validity or scope of any | The IETF takes no position regarding the validity or scope of any | |||
intellectual property or other rights that might be claimed to | Intellectual Property Rights or other rights that might be claimed to | |||
pertain to the implementation or use of the technology described in | pertain to the implementation or use of the technology described in | |||
this document or the extent to which any license under such rights | this document or the extent to which any license under such rights | |||
might or might not be available; neither does it represent that it | might or might not be available; nor does it represent that it has | |||
has made any effort to identify any such rights. Information on the | made any independent effort to identify any such rights. Information | |||
IETF's procedures with respect to rights in standards-track and | on the procedures with respect to rights in RFC documents can be | |||
standards-related documentation can be found in BCP 11. Copies of | found in BCP 78 and BCP 79. | |||
claims of rights made available for publication and any assurances of | ||||
licenses to be made available, or the result of an attempt made to | Copies of IPR disclosures made to the IETF Secretariat and any | |||
obtain a general license or permission for the use of such | assurances of licenses to be made available, or the result of an | |||
proprietary rights by implementors or users of this specification can | attempt made to obtain a general license or permission for the use of | |||
be obtained from the IETF Secretariat. | such proprietary rights by implementers or users of this | |||
specification can be obtained from the IETF on-line IPR repository at | ||||
http://www.ietf.org/ipr. | ||||
The IETF invites any interested party to bring to its attention any | The IETF invites any interested party to bring to its attention any | |||
copyrights, patents or patent applications, or other proprietary | copyrights, patents or patent applications, or other proprietary | |||
rights which may cover technology that may be required to practice | rights that may cover technology that may be required to implement | |||
this standard. Please address the information to the IETF Executive | this standard. Please address the information to the IETF at | |||
Director. | ietf-ipr@ietf.org. | |||
Acknowledgment | ||||
Funding for the RFC Editor function is currently provided by the | ||||
Internet Society. | ||||
End of changes. 827 change blocks. | ||||
2958 lines changed or deleted | 4455 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/ |