draft-ietf-webdav-protocol-05.txt   draft-ietf-webdav-protocol-06.txt 
WEBDAV Working Group Y.Y. Goland, Microsoft
WEBDAV Working Group Y.Y. Goland, Microsoft
INTERNET DRAFT E.J. Whitehead, Jr., UC Irvine INTERNET DRAFT E.J. Whitehead, Jr., UC Irvine
<draft-ietf-webdav-protocol-05> A. Faizi, Netscape <draft-ietf-webdav-protocol-06> A. Faizi, Netscape
S.R. Carter, Novell S.R. Carter, Novell
D. Jensen, Novell D. Jensen, Novell
Expires April, 1998 November 19, 1997 Expires July, 1998 January 18, 1998
Extensions for Distributed Authoring on the World Wide Web -- WEBDAV Extensions for Distributed Authoring on the World Wide Web -- WEBDAV
Status of this Memo Status of this Memo
This document is an Internet-Draft. Internet-Drafts are working This document is an Internet-Draft. Internet-Drafts are working
documents of the Internet Engineering Task Force (IETF), its areas, documents of the Internet Engineering Task Force (IETF), its areas,
and its working groups. Note that other groups may also distribute and its working groups. Note that other groups may also distribute
working documents as Internet-Drafts. working documents as Internet-Drafts.
skipping to change at line 42 skipping to change at page 1, line 43
with subject "subscribe" to <w3c-dist-auth-request@w3.org>. with subject "subscribe" to <w3c-dist-auth-request@w3.org>.
Discussions of the WEBDAV working group are archived at Discussions of the WEBDAV working group are archived at
<URL:http://www.w3.org/pub/WWW/Archives/Public/w3c-dist-auth>. <URL:http://www.w3.org/pub/WWW/Archives/Public/w3c-dist-auth>.
Abstract Abstract
This document specifies a set of methods, headers, and content-types This document specifies 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, namespace
manipulation, resource locking (collision avoidance), and efficient manipulation, and resource locking (collision avoidance).
transmission of resource changes.
Changes Changes
1.1. Changes since draft-ietf-webdav-protocol-04.txt Changes since draft-ietf-webdav-protocol-06.txt
[Editor's note: This section will not appear in the final form of [Editor's note: This section will not appear in the final form of
this document. Its purpose is to provide a concise list of changes this document. Its purpose is to provide a concise list of changes
from the previous revision of the draft for use by reviewers.] from the previous revision of the draft for use by reviewers.]
Added this change section. Rationale for many of the changes made in this revision of the draft
can be found in the mailing list archives at:
Removed scoping for namespaces so the namespace for http://lists.w3.org/Archives/Public/w3c-dist-auth/1997OctDec/0160.ht
every element is explicitly stated. ml.
Changed the syntax from <?XML:Namespace.../> to <?namespace...?>. Where the 200 OK status code was used to indicate a successful
response without a response entity body, 204 No Content is now used.
Because PEP uses 420 and 421 status codes, and since PEP has been
submitted as an Experimental RFC, the WebDAV 420 status code has
been changed to 422, and the WebDAV 421 status code has been changed
to 423.
Removed propfindresult, this was left over from the old search The 423 Destination Locked status code has been changed to 423
format. Locked, and now covers all cases where an operand was locked,
preventing the execution of the method.
Changed all the DAV XML element names to lower case. Removed the Destroy header, since it is not needed in this draft,
but will be needed in the versioning draft.
Changed the property format to use Name and Namespace rather than The Enforce-Live-Properties header was renamed to Property-Behavior,
name and schema. to more closely represent the meaning of the header now that the
"omit" functionality is included. A keepalive field was added to the
Property-Behavior header to make it more meaningful.
Removed proploc attribute and removed section on GETting, DELETEing, Removed the INDEX method, since the functionality of INDEX can now
and PUTing properties since we do not provide a mechanism for be performed by the PROPFIND method. PROPFIND provides more
getting a URI for properties. Also removed the requirement that flexibility in specifying the type and amount of property
properties be URI addressable. information returned than does INDEX, which is important for
returning information on a large number of resources.
Removed quoted string choice from owner header, it is just XML. Clarified that performing a MOVE as a COPY, then DELETE, performed
atomically, only applies to non-collection resources.
Made all the HTTP error codes use the same format. Clarified the semantics of errors that are encountered in infinite
depth move and copy of a hierarchy of resources. For errors copying
internal nodes of the hierarchy tree (i.e., collections), the
operation skips that subtree, and moves on to the next subtree. If
an error is encountered moving/copying a leaf of the tree, then skip
that resource, and move on to the next leaf.
Changed the name of the create element in PROPPATCH to set, the new Removed the PATCH method. This will be resubmitted as the document
name seems to cause less confusion. draft-ietf-webdav-patch-00.
Moved all headers in the draft to a single section. Added language that states that if a PROPPATCH is invoked on a null
resource (e.g., a deleted resource), an empty resource is created,
and the PROPPATCH directives are performed on this new resource.
Deleted the state token section of the draft and moved the state Added a forward reference to the source link definition (Section
token headers to the header section of the draft. Removed the state 13.11) in Section 4.4.
token header.
Changed the write lock section to state that a Lock-Token request Changed all Values= to Values:. Also changed all "values" to
header, not a state-token request header, is to be submitted on "value".
request for write locked resources.
Created a "generic" XML element section for XML elements that get References to state tokens are now restricted to sections 9.7 and
repeatedly re-used throughout the spec. I moved LINK XML element to 9.8.
this section.
Made multistatus and Schema discovery their own level one sections. The property-behavior header has been turned into the
propertybehavior XML element because it contained a list of URIs
which can thus have unbounded size. The lock-info header has been
turned into the lockinfo XML element for the same reason. I have
also made the same change of the Propfind header into the Propfind
XML element. We can put the property behavior header into the body
because neither COPY nor MOVE have bodies. However we can't put
lock-token, if-state-match, etc. in the body because they may need
to be used with PUT. However I don't consider this a big deal
because I sincerely doubt that there will be cases where lock-token
or if-state-match will see large numbers of entries.
Collected all the properties together. Also changed omit to mean "copy properties with best effort but
failure is acceptable."
Removed all references to the possibility of properties have their Added the external members property.
own URIs. This includes removing the property identifier section.
Separated the section on web collections and namespaces into two Added language to 6.4 making it clear that any new resources created
separate sections. as the child of a write locked collection is added to the lock.
Collected all the new response codes together into their own Made the lock-token response header from a single URL to multiple
section. URLs. But all the URLs MUST refer to the exact same lock.
Changed the XML multiresponse element name to multistatus. <?XML version="1.0"> changed to the correct form: <?xml
version="1.0"?>
Added a stand alone section on levels of DAV compliance. I also went Changed the delete rule for collections to read that if a delete in
method by method, property by property, to specify compliance a collection member fails then it is the ancestors, not the progeny,
requirements. who can not be deleted in order to maintain the namespace.
Added an introduction. Updated our reference to the XML spec.
Changed all the "True" and "False" to "T" and "F". Added LOCK and UNLOCK to the list of methods covered by the write
lock. This is necessary so that a lock-token will have to be
submitted in order to make changes, otherwise we defeat the whole
purpose of requiring the lock-token.
Altered the first two paragraphs of the Property Names section to Changed the title of section 6.6 from Re-Issuing Write Locks to
make the relationship between a property's name and its schema a Refreshing Write Locks, made it illegal to make the same lock
little clearer. I also added some text in the same section defining request twice (you know you are making the same request because you
a property name as a namespace and element. had to include the lock-token to make it!) and instead made it legal
to submit a LOCK method with no body but with a lock-token header.
I also added a refresh example.
Added a second paragraph to property model for http resources - Put in a note that an empty request body for PROPFIND means to
overview. This paragraph clarifies why XML was chosen. return all names and values of properties on the resources.
Added a 409 Conflict error to move to cover attempts to move a I have added a section on XML processing errors. I know, I know, it
collection with members. shouldn't be in the standard. I will move it to our compliance draft
as soon as we prepare the first version.
Changed the collection requirement to read the collections SHOULD Removed addlocks and replaced with the depth header and the depth
end with "/". Also added a SHOULD about returning a location header element.
if the client submits a URL for a collection without a trailing "/".
Moved the owner header into the body due to size concerns. Changed all the as in namespace elements to all lower case.
Replaced the iscollection xml element with resourcetype. Moved all XML element declarations to the same section. Removed the
parent description.
Moved the DAV property to the DAV header that is returned with Updated the depth section to make it more generic, changed the
OPTIONS. wording for how COPY/MOVE are handled with write locks, require that
ALL propfind responses include href, require that if a property is
not found in a propfind then a 404 Not Found must be returned, and
made explicit that PROPFIND responses on resources with internal
members are returned as a flat list with no significance to its
ordering.
Folded the tree draft into this draft. Changed the DELETE, COPY, Removed reference to efficient update in the introduction since
and MOVE sections to include their effect on collections as taken PATCH is now gone.
from the tree draft. Created a Depth header section and put in the
general rules that were in the introduction to the tree draft. I
also added the 102 response and response-status header.
Removed the versioning section. Rewrote the write lock and null resource section to deal with the
question of the state of the resource when it is locked and null.
Put all the methods into a single section. Changed www.ietf.org to www.iana.org.
Replaced the PROPFIND request body with a propfind header. Now the Changed the response element and added the new propstat element.
response can be cached just using vary. With the prohibition that an HREF can only appear once in a
multistatus response we can guarantee linear processing costs.
Nuked resinfo for INDEX and combined it with multistatus which is Added Intellectual Property section, as required by RFC 2026.
now used for both INDEX and PROPFIND. Stripped down INDEX as
agreed.
Removed the problem definition and proposed solution sections. We Added IANA Considerations section.
can always cut and paste them together from the older version if we
feel we need them but this draft is supposed to be a dry run for
last call and last call documents do not have problem
definition/proposed solution sections.
Killed the section on schema discovery, it is controversial and we Added Authorization headers to LOCK and UNLOCK examples.
aren't going to be able to require it. We should specify it in a
different spec.
Added a section on notational conventions used within the document. Changed lock tokens in examples to use string format of UUID.
Moved the terminology section to the end of the document to provide Since the latest HTTP revision defines a 418 and 419 status code,
better flow from the high-level introduction to the specific the 418 status code has been changed to 422, 419 to 423, 422 to 424,
introduction sections. and 423 to 425.
Increased the numeric value of the 4xx status codes introduced in Changed implementation of the get* (e.g., getcontentlength)
this specification to avoid conflicts with the new revision of the properties to strength MUST.
HTTP/1.1 specification, which introduces two new 4xx status codes.
Wrote internationalization concerns section. Changed definition of XML elements and DAV properties to use XML
element definitions, rather than BNF.
Added XML version number to all examples. Renumbered all sections
Contents Contents
STATUS OF THIS MEMO...................................................1 STATUS OF THIS MEMO..................................................1
ABSTRACT..............................................................1 ABSTRACT.............................................................1
CHANGES...............................................................1 CHANGES..............................................................1
Changes since draft-ietf-webdav-protocol-06.txt......................1
1.1. Changes since draft-ietf-webdav-protocol-04.txt..................1 CONTENTS.............................................................5
CONTENTS..............................................................5 1 INTRODUCTION.......................................................9
2. INTRODUCTION.......................................................8 2 DATA MODEL FOR RESOURCE PROPERTIES................................10
3. DATA MODEL FOR RESOURCE PROPERTIES.................................9 2.1 The Resource Property Model....................................10
3.1. The Resource Property Model......................................9 2.2 Existing Metadata Proposals....................................10
3.2. Existing Metadata Proposals.....................................10 2.3 Properties and HTTP Headers....................................11
3.3. Properties and HTTP Headers.....................................10 2.4 Property Values................................................11
3.4. Property Values.................................................10 2.5 Property Names.................................................12
3 COLLECTIONS OF WEB RESOURCES......................................12
3.5. Property Names..................................................11 3.1 Collection Resources...........................................12
4. COLLECTIONS OF WEB RESOURCES......................................11 3.2 Creation and Retrieval of Collection Resources.................13
4.1. Collection Resources............................................11 3.3 HTTP URL Namespace Model.......................................13
4.2. Creation and Retrieval of Collection Resources..................12 3.4 Source Resources and Output Resources..........................14
4.3. HTTP URL Namespace Model........................................13 4 LOCKING...........................................................15
4.4. Source Resources and Output Resources...........................13 4.1 Exclusive Vs. Shared Locks.....................................15
5. LOCKING...........................................................14 4.2 Required Support...............................................16
4.3 Lock Tokens....................................................16
5.1. Exclusive Vs. Shared Locks......................................14 4.4 opaquelocktoken Lock Token URI Scheme..........................17
5.2. Required Support................................................15 4.5 Lock Capability Discovery......................................17
5.3. Lock Tokens.....................................................16 4.6 Active Lock Discovery..........................................18
5.4. opaquelocktoken Lock Token URI Scheme...........................16 5 WRITE LOCK........................................................18
5.5. Lock Capability Discovery.......................................16 5.1 Methods Restricted by Write Locks..............................18
5.6. Active Lock Discovery...........................................17 5.2 Write Locks and Properties.....................................18
6. WRITE LOCK........................................................17 5.3 Write Locks and Null Resources.................................18
6.1. Methods Restricted by Write Locks...............................17 5.4 Write Locks and Collections....................................19
5.5 Write Locks and COPY/MOVE......................................19
6.2. Write Locks and Properties......................................17 5.6 Refreshing Write Locks.........................................19
6.3. Write Locks and Null Resources..................................17 5.7 Write Locks and The Lock-Token Request Header..................20
6.4. Write Locks and Collections.....................................18 5.7.1 Write Lock Token Example...................................20
6.5. Write Locks and COPY/MOVE.......................................18 6 NOTATIONAL CONVENTIONS............................................21
6.6. Re-issuing Write Locks..........................................18 7 HTTP METHODS FOR DISTRIBUTED AUTHORING............................21
6.7. Write Locks and The Lock-Token Request Header...................18 7.1 PROPFIND.......................................................21
7. NOTATIONAL CONVENTIONS............................................19 7.1.1 Example: Retrieving Named Properties.......................22
7.1.2 Example: Using allprop to Retrieve All Properties..........23
8. HTTP METHODS FOR DISTRIBUTED AUTHORING............................19 7.1.3 Example: Using propname to Retrieve all Property Names.....26
8.1. PROPFIND........................................................19 7.2 PROPPATCH......................................................28
8.2. PROPPATCH.......................................................23 7.2.1 Status Codes...............................................28
8.3. MKCOL Method....................................................25 7.2.2 Example....................................................28
8.4. INDEX Method....................................................26 7.3 MKCOL Method...................................................30
8.5. DELREF Method...................................................28 7.3.1 Request....................................................30
8.6. ADDREF Method...................................................28 7.3.2 Response Codes.............................................30
8.7. GET, HEAD for Collections.......................................29 7.3.3 Example....................................................31
7.4 ADDREF Method..................................................31
8.8. POST for Collections............................................29 7.4.1 The Request................................................31
8.9. DELETE..........................................................29 7.4.2 Example....................................................31
8.10. PUT............................................................31 7.5 DELREF Method..................................................32
7.5.1 The Request................................................32
8.11. COPY Method....................................................31 7.5.2 Example....................................................32
8.12. MOVE Method....................................................35 7.6 GET, HEAD for Collections......................................32
8.13. LOCK Method....................................................38 7.7 POST for Collections...........................................33
7.8 DELETE.........................................................33
8.14. UNLOCK Method..................................................42 7.8.1 DELETE for Non-Collection Resources........................33
8.15. PATCH Method...................................................43 7.8.2 DELETE for Collections.....................................33
9. DAV HEADERS.......................................................47 7.9 PUT............................................................34
9.1. Collection-Member Header........................................47 7.9.1 PUT for Non-Collection Resources...........................34
9.2. DAV Header......................................................47 7.9.2 PUT for Collections........................................35
9.3. Depth Header....................................................47 7.10 COPY Method....................................................35
9.4. Destination Header..............................................48 7.10.1 COPY for HTTP/1.1 resources................................35
9.5. Destroy Header..................................................48 7.10.2 COPY for Properties........................................35
7.10.3 COPY for Collections.......................................36
9.6. Enforce-Live-Properties Header..................................49 7.10.4 Type Interactions..........................................37
9.7. If-None-State-Match.............................................49 7.10.5 Status Codes...............................................37
9.8. If-State-Match..................................................50 7.10.6 Overwrite Example..........................................38
9.9. Lock-Info Request Header........................................50 7.10.7 No Overwrite Example.......................................38
9.10. Lock-Token Request Header......................................51 7.10.8 Collection Example.........................................38
9.11. Lock-Token Response Header.....................................51 7.11 MOVE Method....................................................39
9.12. Overwrite Header...............................................52 7.11.1 MOVE for Collections.......................................40
7.11.2 Status Codes...............................................40
9.13. Propfind Request Header........................................52 7.11.3 Non-Collection Example.....................................41
9.14. Status-URI Response Header.....................................52 7.11.4 Collection Example.........................................41
9.15. Timeout Header.................................................52 7.12 LOCK Method....................................................42
10. RESPONSE CODE EXTENSIONS TO RFC 2068.............................54 7.12.1 Operation..................................................43
10.1. 102 Processing.................................................54 7.12.2 The Effect of Locks on Properties and Collections..........43
10.2. 207 Multi-Status...............................................54 7.12.3 Locking Replicated Resources...............................43
10.3. 418 Unprocessable Entity.......................................54 7.12.4 Depth and Locking..........................................43
10.4. 419 Insufficient Space on Resource.............................54 7.12.5 Interaction with other Methods.............................44
7.12.6 Lock Compatibility Table...................................44
10.5. 420 Method Failure.............................................54 7.12.7 Lock Response..............................................44
11. MULTI-STATUS RESPONSE............................................54 7.12.8 Status Codes...............................................44
11.1. multistatus XML Element........................................55 7.12.9 Example - Simple Lock Request..............................45
11.2. response XML Element...........................................55 7.12.10 Example - Refreshing a Write Lock.........................46
11.3. status XML Element.............................................55 7.12.11 Example - Multi-Resource Lock Request.....................47
11.4. responsedescription XML Element................................55 7.13 UNLOCK Method..................................................48
12. GENERIC DAV XML ELEMENTS.........................................55 7.13.1 Example....................................................48
8 HTTP HEADERS FOR DISTRIBUTED AUTHORING............................49
12.1. href XML Element...............................................56
12.2. link XML Element...............................................56
12.3. prop XML element...............................................57
13. DAV PROPERTIES...................................................57
13.1. creationdate Property..........................................57
13.2. displayname Property...........................................57
13.3. get-content-language Property..................................58
13.4. get-content-length Property....................................58
13.5. get-content-type Property......................................58
13.6. get-etag Property..............................................58
13.7. get-last-modified Property.....................................59
13.8. index-content-language Property................................59
13.9. index-content-length Property..................................59
13.10. index-content-type Property...................................59
13.11. index-etag Property...........................................59
13.12. index-last-modified Property..................................60
13.13. lockdiscovery Property........................................60
13.14. resourcetype Property.........................................62
13.15. Source Link Property Type.....................................62
13.16. supportedlock Property........................................63
14. DAV COMPLIANCE LEVELS............................................64
14.1. Level 1........................................................64
14.2. Level 2........................................................64
15. INTERNATIONALIZATION SUPPORT.....................................65 8.1 Collection-Member Header.......................................49
16. SECURITY CONSIDERATIONS..........................................66 8.2 DAV Header.....................................................49
17. TERMINOLOGY......................................................66 8.3 Depth Header...................................................49
18. COPYRIGHT........................................................66 8.4 Destination Header.............................................50
19. ACKNOWLEDGEMENTS.................................................67 8.5 If-None-State-Match............................................50
20. REFERENCES.......................................................69 8.6 If-State-Match.................................................51
21. AUTHORS' ADDRESSES...............................................71 8.7 Lock-Token Request Header......................................51
8.8 Lock-Token Response Header.....................................52
8.9 Overwrite Header...............................................53
8.10 Status-URI Response Header.....................................53
8.11 Timeout Header.................................................53
9 STATUS CODE EXTENSIONS TO HTTP/1.1................................54
9.1 102 Processing.................................................54
9.2 207 Multi-Status...............................................55
9.3 422 Unprocessable Entity.......................................55
9.4 423 Insufficient Space on Resource.............................55
9.5 424 Method Failure.............................................55
9.6 425 Locked.....................................................55
10 MULTI-STATUS RESPONSE...........................................55
11 XML ELEMENT DEFINITIONS.........................................55
11.1 activelock XML Element.........................................56
11.1.1 depth XML Element..........................................56
11.1.2 locktoken XML Element......................................56
11.1.3 timeout XML Element........................................56
11.2 collection XML Element.........................................56
11.3 href XML Element...............................................56
11.4 link XML Element...............................................57
11.4.1 dst XML Element............................................57
11.4.2 src XML Element............................................57
11.5 lockentry XML Element..........................................57
11.6 lockinfo XML Element...........................................57
11.7 lockscope XML Element..........................................58
11.7.1 exclusive XML Element......................................58
11.7.2 shared XML Element.........................................58
11.8 locktype XML Element...........................................58
11.8.1 write XML Element..........................................58
11.9 multistatus XML Element........................................58
11.9.1 response XML Element.......................................59
11.9.2 responsedescription XML Element............................59
11.10 owner XML Element.............................................60
11.11 prop XML element..............................................60
11.12 propertybehavior XML element..................................60
11.12.1 keepalive XML element.....................................60
11.12.2 omit XML element..........................................61
11.13 propertyupdate XML element....................................61
11.13.1 remove XML element........................................61
11.13.2 set XML element...........................................62
11.14 propfind XML Element..........................................62
11.14.1 allprop XML Element.......................................62
11.14.2 propname XML Element......................................62
12 DAV PROPERTIES..................................................62
12.1 creationdate Property..........................................63
12.2 displayname Property...........................................63
12.3 externalmembers Property.......................................63
12.4 getcontentlanguage Property....................................63
12.5 getcontentlength Property......................................64
12.6 getcontenttype Property........................................64
12.7 getetag Property...............................................64
12.8 getlastmodified Property.......................................64
12.9 lockdiscovery Property.........................................65
12.9.1 Example....................................................65
12.10 resourcetype Property.........................................66
12.11 source Property...............................................66
12.11.1 Example...................................................67
12.12 supportedlock Property........................................67
12.12.1 Example...................................................68
13 DAV COMPLIANCE CLASSES..........................................68
13.1 Class 1........................................................69
13.2 Class 2........................................................69
14 INTERNATIONALIZATION CONSIDERATIONS.............................69
15 SECURITY CONSIDERATIONS.........................................70
15.1 Authentication of Clients......................................71
15.2 Denial of Service..............................................71
15.3 Security through Obscurity.....................................72
15.4 Privacy Issues Connected to Locks..............................72
15.5 Privacy Issues Connected to Properties.........................72
15.6 Reduction of Security due to Source Link.......................72
16 IANA CONSIDERATIONS.............................................73
17 TERMINOLOGY.....................................................73
18 COPYRIGHT.......................................................74
19 INTELLECTUAL PROPERTY...........................................74
20 ACKNOWLEDGEMENTS................................................75
21 REFERENCES......................................................76
22 AUTHORS' ADDRESSES..............................................78
23 APPENDICES......................................................79
23.1 Appendix 1 - WebDAV Document Type Definition...................79
23.2 Appendix 2 - ISO 8601 Date and Time Profile....................80
23.3 Appendix 3 - Notes on Processing XML Elements..................81
23.3.1 XML Syntax Error Example...................................81
23.3.2 Unknown XML Element Example................................81
2. 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 its author, creation date, etc. Also, the about Web pages, such as their authors, creation dates, etc. Also,
ability to link pages of any media type to related pages. the ability to link pages of any media type to related pages.
Collections: The ability to create sets of related documents, and to Collections: The ability to create sets of related documents, and to
receive a listing of pages at a particular hierarchy level (like a receive a listing of pages at a particular hierarchy level (like a
directory listing in a file system). directory listing in a file 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 their changes without merging the other author's changes writes changes without merging the other author's changes
Namespace Operations: The ability to copy and move Web resources Namespace Operations: The ability to copy and move Web resources
Efficient Update: The ability to send changes which are proportional
to the size of the change rather than retransmitting the entire
resource.
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" [Slein et al., 1997]. Versioning Protocol for the World Wide Web" [Slein et al., 1997].
The sections below provide a detailed introduction to resource The sections below provide a detailed introduction to resource
properties (Section 3), collections of resources (Section 4), and properties (Section 2), collections of resources (Section 3), and
locking operations (Section 5). These sections introduce the locking operations (Section 4). These sections introduce the
abstractions manipulated by the WebDAV-specific HTTP methods abstractions manipulated by the WebDAV-specific HTTP methods
described in Section 8, "HTTP Methods for Distributed Authoring". described in Section 7, "HTTP Methods for Distributed Authoring".
In HTTP/1.1, method parameter information was exclusively encoded in In HTTP/1.1, method parameter information was exclusively encoded in
HTTP headers. Unlike HTTP/1.1, WebDAV, encodes method parameter HTTP headers. Unlike HTTP/1.1, WebDAV, encodes method parameter
information either in an Extensible Markup Language (XML) [Bray, information either in an Extensible Markup Language (XML) [Bray,
Sperberg-McQueen, 1997] request entity body, or in an HTTP header. Paoli, Sperberg-McQueen, 1998] request entity body, or in an HTTP
The use of XML to encode method parameters was motivated by the header. The use of XML to encode method parameters was motivated by
ability to add extra XML elements to existing structures, providing the ability to add extra XML elements to existing structures,
extensibility, and by XML's ability to encode information in ISO providing extensibility, and by XML's ability to encode information
10646 character sets, providing internationalization support. As a in ISO 10646 character sets, providing internationalization support.
rule of thumb, parameters are encoded in XML entity bodies when they As a rule of thumb, parameters are encoded in XML entity bodies when
have unbounded length, or when they may be shown to a human user and they have unbounded length, or when they may be shown to a human
hence require encoding in an ISO 10646 character set. Otherwise, user and hence require encoding in an ISO 10646 character set.
parameters are encoded within an HTTP header. Section 9 describes Otherwise, parameters are encoded within HTTP headers. Section 8
the new HTTP headers used with WebDAV methods. describes the new HTTP headers used with WebDAV methods.
In addition to encoding method parameters, XML is used in WebDAV to In addition to encoding method parameters, XML is used in WebDAV to
encode the responses from methods, providing the extensibility and encode the responses from methods, providing the extensibility and
internationalization advantages of XML for method output, as well as internationalization advantages of XML for method output, as well as
input. XML elements used in this specification are defined in input. XML elements used in this specification are defined in
Section 12. Section 11.
While the response codes provided by HTTP/1.1 are sufficient to While the status codes provided by HTTP/1.1 are sufficient to
describe the preponderance of error conditions encountered by WebDAV describe most error conditions encountered by WebDAV methods, there
methods, there are some errors that do not fall neatly into the are some errors that do not fall neatly into the existing
existing categories. New status codes developed for the WebDAV categories. New status codes developed for the WebDAV methods are
methods are defined in Section 10. Since some WebDAV methods may defined in Section 9. Since some WebDAV methods may operate over
operate over many resources, the multiresponse status type has been many resources, the Multi-Status status type has been introduced to
introduced to return status information for multiple resources. return status information for multiple resources. Multi-Status
Multiresponse status is described in Section 11. response is described in Section 10.
The properties mechanism is employed by WebDAV to store information WebDAV employs the property mechanism to store information about the
about the current state of the resource. For example, when a lock current state of the resource. For example, when a lock is taken
is taken out on a resource, a lock information property describes out on a resource, a lock information property describes the current
the current state of the lock. Section 13 defines the properties state of the lock. Section 12 defines the properties used within the
used within the WebDAV specification. WebDAV specification.
Finishing off the specification are sections on what it means to be Finishing off the specification are sections on what it means to be
compliant with this specification (Section 14), on compliant with this specification (Section 13), on
internationalization support (Section 15), and on security (Section internationalization support (Section 14), and on security (Section
16). 15).
3. Data Model for Resource Properties 2 Data Model for Resource Properties
3.1. The Resource Property Model 2.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 their subject, and an 'author' property might allow for the
discovery of what authors have written which documents. discovery 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 property identifies the property's syntax and semantics, and
provides an address by which to refer to that syntax and semantics. provides an address by which to refer to that syntax and semantics.
There are two categories of properties: "live" and "non-live". A There are two categories of properties: "live" and "dead". A live
live property has its syntax and semantics enforced by the server. property has its syntax and semantics enforced by the server. Live
This represents the two cases of a) the value of a property is read- properties include cases where a) the value of a property is read-
only, maintained by the server, and b) the value of the property is only, maintained by the server, and b) the value of the property is
maintained by the client, but server performs syntax checking on maintained by the client, but the server performs syntax checking on
submitted values. A non-live property has its syntax and semantics submitted values. A dead property has its syntax and semantics
enforced by the client; the server merely records the value of the enforced by the client; the server merely records the value of the
property verbatim. property verbatim.
3.2. Existing Metadata Proposals 2.2 Existing Metadata Proposals
Properties have long played an essential role in the maintenance of Properties have long played an essential role in the maintenance of
large document repositories, and many current proposals contain some large document repositories, and many current proposals contain some
notion of a property, or discuss web metadata more generally. These notion of a property, or discuss web metadata more generally. These
include PICS [Miller et al., 1996], PICS-NG, the Rel/Rev draft include PICS [Miller et al., 1996], PICS-NG, XML [Bray, Paoli,
[Maloney, 1996], Web Collections, XML [Bray, Sperberg-McQueen, Sperberg-McQueen, 1998], Web Collections, and several proposals on
1997], several proposals on representing relationships within HTML, representing relationships within HTML. Work on PICS-NG and Web
digital signature manifests (DCMF), and a position paper on Web
metadata architecture [Berners-Lee, 1997]. Work on PICS-NG and Web
Collections has been subsumed by the Resource Definition Framework Collections has been subsumed by the Resource Definition Framework
(RDF) metadata activity of the World Wide Web Consortium, which (RDF) metadata activity of the World Wide Web Consortium. RDF
consists of a network-based data model and an XML representation of consists of a network-based data model and an XML representation of
that model. that model.
Some proposals come from a digital library perspective. These Some proposals come from a digital library perspective. These
include the Dublin Core [Weibel et al., 1995] metadata set and the include the Dublin Core [Weibel et al., 1995] metadata set and the
Warwick Framework [Lagoze, 1996], a container architecture for Warwick Framework [Lagoze, 1996], a container architecture for
different metadata schemas. The literature includes many examples different metadata schemas. The literature includes many examples
of metadata, including MARC [MARC, 1994], a bibliographic metadata of metadata, including MARC [MARC, 1994], a bibliographic metadata
format, and RFC 1807 [Lasher, Cohen, 1995], a technical report format, and RFC 1807 [Lasher, Cohen, 1995], a technical report
bibliographic format employed by the Dienst system. Additionally, bibliographic format employed by the Dienst system. Additionally,
the proceedings from the first IEEE Metadata conference describe the proceedings from the first IEEE Metadata conference describe
many community-specific metadata sets. many community-specific metadata sets.
Participants of the 1996 Metadata II Workshop in Warwick, UK Participants of the 1996 Metadata II Workshop in Warwick, UK
[Lagoze, 1996], noted that, "new metadata sets will develop as the [Lagoze, 1996], noted that "new metadata sets will develop as the
networked infrastructure matures" and "different communities will networked infrastructure matures" and "different communities will
propose, design, and be responsible for different types of propose, design, and be responsible for different types of
metadata." These observations can be corroborated by noting that metadata." These observations can be corroborated by noting that
many community-specific sets of metadata already exist, and there is many community-specific sets of metadata already exist, and there is
significant motivation for the development of new forms of metadata significant motivation for the development of new forms of metadata
as many communities increasingly make their data available in as many communities increasingly make their data available in
digital form, requiring a metadata format to assist data location digital form, requiring a metadata format to assist data location
and cataloging. and cataloging.
3.3. Properties and HTTP Headers 2.3 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 headers. However, in distributed authoring environments a
relatively large number of properties are needed to describe the relatively large number of properties are needed to describe the
state of a resource, and setting/returning them all through HTTP state of a resource, and setting/returning them all through HTTP
headers is inefficient. Thus a mechanism is needed which allows a headers is inefficient. Thus a mechanism is needed which allows a
principal to identify a set of properties in which the principal is principal to identify a set of properties in which the principal is
interested and to then set or retrieve just those properties. interested and to set or retrieve just those properties.
3.4. Property Values 2.4 Property Values
The value of a property is expressed as a well-formed XML document. The value of a property is expressed as a well-formed XML document.
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 because they will adding new elements. Older clients will not break when they
still have the data specified in the original schema and will ignore encounter extensions because they will still have the data specified
elements they do not understand. XML's support for multiple in the original schema and will ignore elements they do not
character sets allows human-readable properties to be encoded and understand. XML's support for multiple character sets allows any
read in a character set familiar to the user. human-readable property to be encoded and read in a character set
familiar to the user.
3.5. Property Names 2.5 Property Names
A property name is a universally unique identifier that is A property name is a universally unique identifier that is
associated with a schema that provides information about the syntax associated with a schema that provides information about the syntax
and semantics of the property. and 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, so long as that property is "live" on the resources in resources, so long as that property is "live" on the resources in
question. question.
The XML namespace mechanism, which is based on URIs, is used to name The XML namespace mechanism, which is based on URIs, is used to name
properties because it provides a mechanism to prevent namespace properties because it prevents namespace collisions and provides for
collisions and for varying degrees of administrative control. 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. Collections of Web Resources 3 Collections of Web Resources
This section provides a description of a new type of Web resource, This section provides a description of a new type of Web resource,
the collection, and discusses its interactions with the HTTP URL the collection, and discusses its interactions with the HTTP Uniform
namespace. The purpose of a collection resource is to model Resource Locator (URL) namespace. The purpose of a collection
collection-like objects (e.g., filesystem directories) within a resource is to model collection-like objects (e.g., filesystem
server's namespace. directories) within a server's namespace.
All DAV compliant resources MUST support the HTTP URL namespace All DAV compliant resources MUST support the HTTP URL namespace
model specified herein. model specified herein.
4.1. Collection Resources 3.1 Collection Resources
A collection is a resource whose state consists of an unordered list A collection is a resource whose state consists of an unordered list
of internal members, an unordered list of external members, and a of internal members, an unordered list of external members, and a
set of properties. An internal member resource MUST have a URI that set of properties. An internal member resource MUST have a URI that
is immediately relative to the base URI of the collection, that is, is immediately relative to the base URI of the collection. That is,
a relative URI in which "../" is illegal, which MUST begin with "./" the internal member's URI is equal to the parent collection's URI
and which SHOULD contain a "/" at the end of the URI if the internal plus an additional segment where segment is defined in Section 3.2.1
member resource is itself a collection. of RFC 2068 [Fielding et al., 1996].
An external member resource MUST be an absolute URI that is not an An external member resource is a resource that could not be an
internal URI. Any given internal or external URI MUST only belong internal member resource. Any given internal or external Member MUST
to the collection once, i.e., it is illegal to have multiple only belong to the collection once, i.e., it is illegal to have
instances of the same URI in a collection. Properties defined on multiple instances of the same URI in a collection. Properties
collections behave exactly as do properties on non-collection defined on collections behave exactly as do properties on non-
resources. collection resources.
There is a standing convention that when a collection is referred to There is a standing convention that when a collection is referred to
by its name without a trailing slash, the trailing slash is by its name without a trailing slash, the trailing slash is
automatically appended. Due to this, a resource MAY accept a URI automatically appended. Due to this, a resource MAY accept a URI
without a trailing "/" to point to a collection. In this case it without a trailing "/" to point to a collection. In this case it
SHOULD return a location header in the response pointing to the URL SHOULD return a location header in the response pointing to the URL
ending with the "/". For example, if a client performs an INDEX on 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 (no trailing slash), the resource
http://foo.bar/blah/ (trailing slash) MAY respond as if the http://foo.bar/blah/ (trailing slash) MAY respond as if the
operation were invoked on it, and SHOULD return a location header operation were invoked on it, and SHOULD return a location header
with http://foo.bar/blah/ in it. with http://foo.bar/blah/ in it. In general clients SHOULD use the
"/" form of collection names.
4.2. Creation and Retrieval of Collection Resources 3.2 Creation and Retrieval of Collection Resources
This document specifies the MKCOL method to create new collection This document specifies the MKCOL method to create new collection
resources, rather than using the existing HTTP/1.1 PUT or POST resources, rather than using the existing HTTP/1.1 PUT or POST
method, for the following reasons method, for the following reasons
In HTTP/1.1, the PUT method is defined to store the request body at In HTTP/1.1, the PUT method is defined to store the request body at
the location specified by the Request-URI. While a description the location specified by the Request-URI. While a description
format for a collection can readily be constructed for use with PUT, format for a collection can readily be constructed for use with PUT,
the implications of sending such a description to the server are the implications of sending such a description to the server are
undesirable. For example, if a description of a collection that undesirable. For example, if a description of a collection that
omitted some existing resources were PUT to a server, this might be omitted some existing resources were PUT to a server, this might be
interpreted as a command to remove those members. This would extend interpreted as a command to remove those members. This would extend
PUT to perform DELETE functionality, which is undesirable since it PUT to perform DELETE functionality, which is undesirable since it
changes the semantics of PUT, and makes it difficult to control changes the semantics of PUT, and makes it difficult to control
DELETE functionality with an access control scheme based on methods. DELETE functionality with an access control scheme based on methods.
While the POST method is sufficiently open-ended that a _create a While the POST method is sufficiently open-ended that a "create a
collection_ POST command could be constructed, this is undesirable collection" POST command could be constructed, this is undesirable
because it would be difficult to separate access control for because it would be difficult to separate access control for
collection creation from other uses of POST. collection creation from other uses of POST.
This document specifies the INDEX method for listing the contents of
a collection, rather than relying on the existing HTTP/1.1 GET
method. This is to avoid conflict with the de-facto standard
practice of redirecting a GET request on a directory to its
index.html resource.
The exact definition of the behavior of GET and PUT on collections The exact definition of the behavior of GET and PUT on collections
is defined later in this document. is defined later in this document.
4.3. HTTP URL Namespace Model 3.3 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. DAV compliant hierarchy is delimited with the "/" character. DAV compliant
resources MUST maintain the consistency of the HTTP URL namespace. resources MUST maintain the consistency of the HTTP URL namespace.
Any attempt to create a resource (excepting the root member of a Any attempt to create a resource (excepting the root member of a
namespace) that would not be the internal member of a collection namespace) that would not be the internal member of a collection
MUST fail. For example, if the collection http://www.foo.bar.org/a/ MUST fail. For example, if the collection http://www.foo.bar.org/a/
exists, but http://www.foo.bar.org/a/b/does not exist, an attempt to exists, but http://www.foo.bar.org/a/b/does not exist, an attempt to
create http://www.foo.bar.org/a/b/c must fail. create http://www.foo.bar.org/a/b/c must fail.
4.4. Source Resources and Output Resources 3.4 Source Resources and Output Resources
For many resources, the entity returned by a GET method exactly For many resources, the entity returned by a GET method exactly
matches the persistent state of the resource, for example, a GIF matches the persistent state of the resource, for example, a GIF
file stored on a disk. For this simple case, the URL at which a file stored on a disk. For this simple case, the URL at which a
resource is accessed is identical to the URL at which the source resource is accessed is identical to the URL at which the source
(the persistent state) of the resource is accessed. This is also (the persistent state) of the resource is accessed. This is also
the case for HTML source files that are not processed by the server the case for HTML source files that are not processed by the server
prior to transmission. prior to transmission.
However, the server can sometimes process HTML resources before they However, the server can sometimes process HTML resources before they
skipping to change at line 619 skipping to change at page 14, line 51
given a location in the URI namespace. This source location should given a location in the URI namespace. This source location should
not be one of the locations at which the generated output is not be one of the locations at which the generated output is
retrievable, since in general it is impossible for the server to retrievable, since in general it is impossible for the server to
differentiate requests for source resources from requests for differentiate requests for source resources from requests for
process output resources. There is often a many-to-many process output resources. There is often a many-to-many
relationship between source resources and output resources. relationship between source resources and output resources.
On WebDAV compliant servers, for all output resources which have a On WebDAV compliant servers, for all output resources which have a
single source resource (and that source resource has a URI), the URI single source resource (and that source resource has a URI), the URI
of the source resource SHOULD be stored in a link on the output of the source resource SHOULD be stored in a link on the output
resource with type http://www.ietf.org/standards/dav/source. Note resource with type http://www.iana.org/standards/dav/source (see
that by storing the source URIs in links on the output resources, Section 12.11 for a description of the source link). Note that by
the burden of discovering the source is placed on the authoring storing the source URIs in links on the output resources, the burden
client. of discovering the source is placed on the authoring client.
5. Locking 4 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 provide a reasonable guarantee that another principal will not
modify a resource while it is being edited. In this way, a client modify a resource while it is being edited. In this way, a client
can prevent the "lost update" problem. can 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. Furthermore, this document and the type of access to be granted. This document defines locking
only provides the definition of locking for one lock access type, for only one access type, write. However, the syntax is extensible,
the write lock. However, the syntax is extensible, and permits the and permits the eventual specification of locking for other access
eventual specification of other access types. types.
5.1. Exclusive Vs. Shared Locks 4.1 Exclusive Vs. Shared Locks
The most basic form of lock is an exclusive lock. This is a lock The most basic form of lock is an exclusive lock. This is a lock
where the access right in question is only granted to a single where the access right in question is only granted to a single
principal. The need for this arbitration results from a desire to principal. The need for this arbitration results from a desire to
avoid having to constantly merge results. avoid having to constantly merge results.
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 right. Shared locks are provided for this case. A their access right. Shared locks are provided for this case. A
skipping to change at line 670 skipping to change at page 15, line 51
set. set.
Starting with every possible principal on the Internet, in most Starting with every possible principal on the Internet, in most
situations the vast majority of these principals will not have write situations the vast majority of these principals will not have write
access to a given resource. Of the small number who do have write access to a given resource. Of the small number who do have write
access, some principals may decide to guarantee their edits are free access, some principals may decide to guarantee their edits are free
from overwrite conflicts by using exclusive write locks. Others may from overwrite conflicts by using exclusive write locks. Others may
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 is potentially working on the collaborators that a principal may be working on the resource.
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 is potentially working on a to let collaborators know who else may be working on a resource.
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 write locks are often authoring systems has indicated that exclusive write locks are often
too rigid. An exclusive write lock is used to enforce a particular too rigid. An exclusive write lock is used to enforce a particular
editing process: take out exclusive write lock, read the resource, editing process: take out exclusive write lock, read the resource,
perform edits, write the resource, release the lock. This editing perform edits, write the resource, release the lock. This editing
process has the problem that locks are not always properly released, process has the problem that locks are not always properly released,
for example when a program crashes, or when a lock owner leaves for example when a program crashes, or when a lock owner leaves
without unlocking a resource. While both timeouts and without unlocking a resource. While both timeouts and
administrative action can be used to remove an offending lock, administrative action can be used to remove an offending lock,
neither mechanism may be available when needed; the timeout may be neither mechanism may be available when needed; the timeout may be
long or the administrator may not be available. long or the administrator may not be available.
Despite their potential problems, exclusive write locks are Despite their potential problems, exclusive write locks are
extremely useful, since often a guarantee of freedom from overwrite extremely useful, since often a guarantee of freedom from overwrite
conflicts is what is needed. This specification provides both conflicts is what is needed. This specification provides both
exclusive write locks and the less strict mechanism of shared locks. exclusive write locks and the less strict mechanism of shared locks.
5.2. Required Support 4.2 Required Support
A WebDAV compliant server is not required to support locking in any A WebDAV compliant server is not required to support locking in any
form. If the server does support locking it MAY choose to support form. If the server 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 reason for this flexibility is that locking policy strikes to
the very heart of the resource management and versioning systems the very heart of the resource management and versioning systems
employed by various storage repositories. These repositories employed by various storage repositories. These repositories
require control over what sort of locking will be made available. require control over what sort of locking will be made available.
For example, some repositories only support shared write locks while For example, some repositories only support shared write locks while
others only provide support for exclusive write locks while yet others only provide support for exclusive write locks while yet
others use no locking at all. As each system is sufficiently others use no locking at all. As each system is sufficiently
different to merit exclusion of certain locking features, this different to merit exclusion of certain locking features, this
specification leaves locking as the sole axis of negotiation within specification leaves locking as the sole axis of negotiation within
WebDAV. WebDAV.
5.3. Lock Tokens 4.3 Lock Tokens
A lock token is a URI that identifies a particular lock. A lock A lock token is a URI that identifies a particular lock. A lock
token is returned by every successful LOCK operation in the lock- token is returned by every successful LOCK operation in the Lock-
token response header, and can also be discovered through lock Token response header, and can also be discovered through lock
discovery on a resource. discovery on a resource.
Lock token URIs are required to be unique across all resources for Lock token URIs are required to be unique across all resources for
all time. This uniqueness constraint allows lock tokens to be all time. This uniqueness constraint allows lock tokens to be
submitted across resources and servers without fear of confusion. submitted across resources and servers without fear of confusion.
This specification provides a lock token URI scheme called This specification provides a lock token URI scheme called
opaquelocktoken that meets the uniqueness requirements. However opaquelocktoken that meets the uniqueness requirements. However
resources are free to return any URI scheme so long as it meets the resources are free to return any URI scheme so long as it meets the
uniqueness requirements. uniqueness requirements.
5.4. opaquelocktoken Lock Token URI Scheme 4.4 opaquelocktoken Lock Token URI Scheme
The opaquelocktoken URI scheme is designed to be unique across all The opaquelocktoken URI scheme is designed to be unique across all
resources for all time. Due to this uniqueness quality, a client resources for all time. Due to this uniqueness quality, a client
MAY submit an opaque lock token in a Lock-Token request header and MAY submit an opaque lock token in a Lock-Token request header and
an if-state[-not]-match header on a resource other than the one that an If-[None]-State-Match header on a resource other than the one
returned it. that returned it.
All resources MUST recognize the opaquelocktoken scheme and, at All resources MUST recognize the opaquelocktoken scheme and, at
minimum, recognize that the lock token was not generated by the minimum, recognize that the lock token was not generated by the
resource. Note, however, that resources are not required to resource. Note, however, that resources are not required to
generate opaquelocktokens in LOCK method responses. generate opaquelocktokens in LOCK method responses.
In order to guarantee uniqueness across all resources for all time In order to guarantee uniqueness across all resources for all time
the opaquelocktoken requires the use of the GUID mechanism. the opaquelocktoken requires the use of the Universally Unique
Identifier (UUID, also known as a Globally Unique Identifier, or
GUID) mechanism, as described in [Leach, Salz, 1998].
Opaquelocktoken generators, however, have a choice of how they Opaquelocktoken generators, however, have a choice of how they
create these tokens. They can either generate a new GUID for every create these tokens. They can either generate a new UUID for every
lock token they create, which is potentially very expensive, or they lock token they create, which is potentially very expensive, or they
can create a single GUID and then add extension characters. If the can create a single UUID and then add extension characters. If the
second method is selected then the program generating the extensions second method is selected then the program generating the extensions
MUST guarantee that the same extension will never be used twice with MUST guarantee that the same extension will never be used twice with
the associated GUID. the associated UUID.
Opaque-Lock-Token = "opaquelocktoken" ":" GUID [Extension] OpaqueLockToken-URI = "opaquelocktoken:" UUID [Extension] ; The
GUID = ; As defined in [Leach, Salz, 1997] UUID production is the string form of a UUID, as defined in [Leach,
Extension = *urlc ;urlc is defined in [Berners-Lee et al., 1997] Salz, 1998]. Note that white space (LWS) is not allowed between
(draft-fielding-url-syntax-07.txt) elements of this production.
5.5. Lock Capability Discovery Extension = path ; path is defined in Section 3.2.1 of RFC 2068
[Fielding et al., 1996]
4.5 Lock Capability Discovery
Since server lock support is optional, a client trying to lock a 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, resource on a server can either try the lock and hope for the best,
or perform some form of discovery to determine what lock or perform some form of discovery to determine what lock
capabilities the server supports. This is known as lock capability capabilities the server supports. This is known as lock capability
discovery. Lock capability discovery differs from discovery of discovery. Lock capability discovery differs from discovery of
supported access control types, since there may be access control supported access control types, since there may be access control
types without corresponding lock types. A client can determine what types without corresponding lock types. A client can determine what
lock types the server supports by retrieving the supportedlock lock types the server supports by retrieving the supportedlock
property. property.
Any DAV compliant resource that supports the LOCK method MUST Any DAV compliant resource that supports the LOCK method MUST
support the supportedlock property. support the supportedlock property.
5.6. Active Lock Discovery 4.6 Active Lock Discovery
If another principal locks a resource that a principal wishes to 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 access, it is useful for the second principal to be able to find out
who the first principal is. For this purpose the lockdiscovery who the first principal is. For this purpose the lockdiscovery
property is provided. This property lists all outstanding locks, property is provided. This property lists all outstanding locks,
describes their type, and provides their lock token. describes their type, and provides their lock token.
Any DAV compliant resource that supports the LOCK method MUST Any DAV compliant resource that supports the LOCK method MUST
support the lockdiscovery property. support the lockdiscovery property.
6. Write Lock 5 Write Lock
This section describes the semantics specific to the write access This section describes the semantics specific to the write access
type for locks. The write lock is a specific instance of a lock type for locks. The write lock is a specific instance of a lock
type, and is the only lock type described in this specification. A type, and is the only lock type described in this specification. A
DAV compliant resource MAY support the write lock. DAV compliant resource MAY support the write lock.
6.1. Methods Restricted by Write Locks 5.1 Methods Restricted by Write Locks
A write lock prevents a principal without the lock from successfully A write lock prevents a principal without the lock from successfully
executing a PUT, POST, PATCH, PROPPATCH, MOVE, DELETE, MKCOL, ADDREF executing a PUT, POST, PROPPATCH, LOCK, UNLOCK, MOVE, DELETE, MKCOL,
or DELREF on the locked resource. All other current methods, GET in ADDREF or DELREF on the locked resource. All other current methods,
particular, function independent of the lock. GET in particular, function independent of the lock.
Note, however, that as new methods are created it will be necessary Note, however, that as new methods are created it will be necessary
to specify how they interact with a write lock. to specify how they interact with a write lock.
6.2. Write Locks and Properties 5.2 Write Locks and Properties
While those without a write lock may not alter a property on a While those without a write lock may not alter a property on a
resource it is still possible for the values of live properties to resource it is still possible for the values of live properties to
change, even while locked, due to the requirements of their schemas. change, even while locked, due to the requirements of their schemas.
Only dead properties and live properties defined to respect locks Only dead properties and live properties defined to respect locks
are guaranteed not to change while write locked. are guaranteed not to change while write locked.
6.3. Write Locks and Null Resources 5.3 Write Locks and Null Resources
It is possible to assert a write lock on a null resource in order to It is possible to assert a write lock on a null resource in order to
lock the name. Please note, however, that locking a null resource lock the name. A write locked null resource acts in all ways as a
effectively makes the resource non-null, as the resource now has null resource other than it MUST respond to a PROPFIND request and
lock related properties defined on it. MUST support the lockdiscovery and supportedlock properties.
6.4. Write Locks and Collections Until a method such as PUT or MKCOL is executed, the resource stays
in the null state with the exception of the behavior stated above.
If the resource is unlocked without a PUT, MKCOL, or similar method
having been executed, the resource is no longer required to support
the PROPFIND method or the lockdiscovery and supportedlock
properties.
5.4 Write Locks and Collections
A write lock on a collection prevents the addition or removal of A write lock on a collection prevents the addition or removal of
members of the collection. As a consequence, when a principal members of the collection by non-lock owners. As a consequence,
issues a request to create a new internal member of a collection when a principal issues a request to create a new internal member of
using PUT or POST, or to remove an existing internal member of a a write locked collection using PUT or POST, or to remove an
collection using DELETE, this request MUST fail if the principal existing internal member of a write locked collection using DELETE,
does not have a write lock on the 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 However, if a write lock request is issued to a collection
containing internal member resources that are currently locked in a containing internal member resources that are currently locked in a
manner which conflicts with the write lock, the request MUST fail manner which conflicts with the write lock, the request MUST fail
with a 409 Conflict status code. with a 425 Locked status code.
6.5. Write Locks and COPY/MOVE If a lock owner causes a resource to be added as an internal member
of a locked collection then the new resource is automatically added
to the lock. This is the only mechanism that allows a resource to
The owner of a write lock MUST NOT execute a MOVE method on a be added to a write lock. Thus, for example, if the collection
resource he has locked. This specification intentionally does not /a/b/ is write locked and the resource /c is moved to /a/b/c then
define what happens if a MOVE method request is made on a locked /a/b/c will be added to the write lock.
resource by the lock's owner.
5.5 Write Locks and COPY/MOVE
A COPY method invocation MUST NOT duplicate any write locks active A COPY method invocation MUST NOT duplicate any write locks active
on the source. on the source. However, as previously noted, if the COPY copies the
resource into a collection that is depth locked then the resource
will be added to the lock.
6.6. Re-issuing Write Locks A MOVE does not move the write lock with the resource. There are two
exceptions to this rule. First, as noted in section 5.4, if the MOVE
makes the resource a child of a collection that is depth locked then
the resource will be under the same lock. Second, if a depth locked
resource is moved to a destination that is within the scope of the
same depth lock (e.g., within the namespace tree covered by the
lock), the moved resource is still a member of the lock. In both
cases a Lock-Token header MUST be submitted containing a lock token
for the lock on the source, if locked, and on the destination.
If a principal already owns a write lock on a resource, any future 5.6 Refreshing Write Locks
requests for the same type of write lock, on the same resource,
while the principal's previous write lock is in effect, MUST result
in a successful response with the same lock token as provided for
the currently existing lock. Two lock requests are defined to be
identical if their Lock-Info headers are identical.
6.7. Write Locks and The Lock-Token Request Header A client MUST NOT submit the same write lock request twice. Note
that a client is always aware it is resubmitting the same lock
request because it must include the Lock-Token header in order to
make the request for a resource that is already locked.
However, a client MAY submit a LOCK method with a Lock-Token header
but without a body. This form of LOCK MAY only be used to "refresh"
a lock. Currently, refreshing a lock only means that any timers
associated with the lock are re-set.
A server MAY return a Timeout header with a lock refresh that is
different than the Timeout header returned when the lock was
originally requested. Additionally clients MAY submit Timeout
headers of arbitrary value with their lock refresh requests.
Servers, as always, MAY ignore Timeout headers submitted by the
client.
If an error is received in response to a refresh LOCK request the
client MUST assume that the lock was not refreshed.
5.7 Write Locks and The Lock-Token Request Header
If a user agent is not required to have knowledge about a lock when If a user agent is not required to have knowledge about a lock when
requesting an operation on a locked resource, the following scenario 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 might occur. 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 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 lock taken out by Program A, yet performs a PUT to the locked
resource. In this scenario, the PUT succeeds because locks are resource. In this scenario, the PUT succeeds because locks are
associated with a principal, not a program, and thus program B, associated with a principal, not a program, and thus program B,
because it is acting with principal A's credential, is allowed to because it is acting with principal A's credential, is allowed to
perform the PUT. However, had program B known about the lock, it perform the PUT. However, had program B known about the lock, it
would not have overwritten the resource, preferring instead to would not have overwritten the resource, preferring instead to
present a dialog box describing the conflict to the user. Due 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 from accidentally ignoring locks taken out by other programs with
the same authorization. the same authorization.
In order to prevent these collisions the lock token request header In order to prevent these collisions the Lock-Token request header,
is introduced. Please refer to the Lock Token Request Header defined in Section 8.7, is introduced.
section for details and requirements.
6.7.1. Write Lock Token Example 5.7.1 Write Lock Token Example
>>Request
COPY /~fielding/index.html HTTP/1.1 COPY /~fielding/index.html HTTP/1.1
Host: www.ics.uci.edu Host: www.ics.uci.edu
Destination: http://www.ics.uci.edu/users/f/fielding/index.html Destination: http://www.ics.uci.edu/users/f/fielding/index.html
Lock-Token: <opaquelocktoken:123AbcEfg1284h23h2> Lock-Token: <opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>
<opaquelocktoken:AAAASDFcalkjfdas12312> Authorization: Digest username="fielding",
realm="fielding@ics.uci.edu", nonce="...",
uri="/~fielding/index.html", response="...",
opaque="..."
HTTP/1.1 200 OK >>Response
In this example, both the source and destination are locked so two HTTP/1.1 204 No Content
lock tokens must be submitted. If only one of the two resources was
locked, then only one token would have to be submitted.
7. Notational Conventions In this example, even though both the source and destination are
locked, only one lock token must be submitted, for the lock on the
destination. This is due to the source resource not being modified
during a COPY, and hence unaffected by the write lock. The
Authorization header provides the Digest authentication credentials
for the principal making the request (note that the nonce, response,
and opaque fields have not been calculated for this example). The
source and the destination resources are both located within the
same authentication realm, therefore only one set of Authorization
credentials needs to be submitted.
6 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 protocol, the augmented BNF used herein to describe protocol
elements is exactly the same as described in Section 2.1 of RFC elements is exactly the same as described in Section 2.1 of
2068, _Hypertext Transfer Protocol -- HTTP/1.1_ [Fielding et al., [Fielding et al., 1997]. Since this augmented BNF uses the basic
1997]. Since this augmented BNF uses the basic production rules production rules provided in Section 2.2 of [Fielding et al., 1997],
provided in Section 2.2 of RFC 2068, these rules apply to this these rules apply to this document as well.
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 [Bradner, document are to be interpreted as described in RFC 2119 [Bradner,
1997]. 1997].
8. HTTP Methods for Distributed Authoring 7 HTTP Methods for Distributed Authoring
8.1. PROPFIND 7.1 PROPFIND
The PROPFIND method retrieves properties defined on the Request-URI, The PROPFIND method retrieves properties defined on the Request-URI,
if it is a non-collection resource, or on the Request-URI and if the resource does not have any internal members, or on the
potentially its member resources, if the resource is a collection. Request-URI and potentially its member resources, if the resource
All DAV compliant resources MUST support the PROPFIND method. does have internal members. All DAV compliant resources MUST
support the PROPFIND method.
A client MAY submit a Depth header with a PROPFIND on a collection A client MAY submit a Depth header with a value of "0", "1", or
with a value of "0", "1" or "infinity". DAV compliant servers MUST "infinity" with a PROPFIND on a resource with internal members. DAV
support the "0", "1" and "infinity" behaviors. By default, the compliant servers MUST support the "0", "1" and "infinity"
PROPFIND method on a collection without a Depth header MUST act as behaviors. By default, the PROPFIND method without a Depth header
if a Depth = infinity header was included. MUST act as if a "Depth: infinity" header was included.
A client MUST submit a Propfind request header describing what A client MAY submit a propfind XML element in the body of the
information is being requested. It is possible to request request method describing what information is being requested. It
particular property values, all property values, or a list of the is possible to request particular property values, all property
names of the resource's properties. values, or a list of the names of the resource's properties. A
client MAY choose not to submit a request body. An empty request
body MUST be treated as a request for the names and values of all
properties.
The response is a text/xml message body that contains a multistatus The response is a text/xml message body that contains a multistatus
XML element that describes the results of the attempts to retrieve XML element that describes the results of the attempts to retrieve
the various properties. If a property was successfully retrieved the various properties. If a property was successfully retrieved
then its value MUST be returned in a prop XML element. If the scope then its value MUST be returned in a prop XML element.
of PROPFIND covers more than a single resource, as is the case with
Depth values of "1" and "infinity", each response XML element MUST
contain an href XML element which identifies the resource on which
the properties in the prop XML element are defined. In the case of
allprop and propname, if a principal does not have the right to know
if a particular property exists, an error MUST NOT be returned. The
results of this method SHOULD NOT be cached.
8.1.1. Example: Retrieving Named Properties If there is an error retrieving a property then a proper error
result must be included. Requests to retrieve the value of a
property which does not exist is an error and MUST be noted with a
response XML element which contains a 404 Not Found status value.
Consequently, the multistatus XML element for a resource with
members MUST include a response XML element for each member of the
resource, to whatever depth was requested. Each response XML element
MUST contain an href XML element that identifies the resource on
which the properties in the prop XML element are defined. Results
for a PROPFIND on a resource with internal members are returned as a
flat list whose order of entries is not significant.
In the case of allprop and propname, if a principal does not have
the right to know if a particular property exists then a 404 Not
Found MUST be returned.
The results of this method SHOULD NOT be cached.
7.1.1 Example: Retrieving Named Properties
>>Request
PROPFIND /files/ HTTP/1.1 PROPFIND /files/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Depth: 0 Depth: 0
Propfind: <http://www.foo.bar/boxschema/bigbox> <http://www.foo.bar/ Content-type: text/xml
boxschema/author> <http://www.foo.bar/boxschema/DingALing> <http://w Content-Length: xyz
ww.foo.bar/boxschema/Random>
<?xml version="1.0"?>
<?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<D:propfind>
<D:href>http://www.foo.bar/boxschema/bigbox</D:href>
<D:href>http://www.foo.bar/boxschema/author</D:href>
<D:href>http://www.foo.bar/boxschema/DingALing</D:href>
<D:href>http://www.foo.bar/boxschema/Random</D:href>
</D:propfind>
>>Response
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href ="http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href = "http://www.foo.bar/boxschema" AS = R"?> <?namespace href="http://www.foo.bar/boxschema" as="R"?>
<D:multistatus> <D:multistatus>
<D:response> <D:response>
<D:href>http://www.foo.bar/files/</D:href>
<D:propstat>
<D:prop> <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>J.J. Dingleheimerschmidt</R:Name> <R:Name>J.J. Johnson</R:Name>
</R:author> </R:author>
</D:prop> </D:prop>
<D:status>HTTP/1.1 200 OK</D:status> <D:status>HTTP/1.1 200 OK</D:status>
</D:response> </D:propstat>
<D:response> <D:propstat>
<D:prop><R:DingALing/><R:Random/></D:prop> <D:prop><R:DingALing/><R:Random/></D:prop>
<D:status>HTTP/1.1 403 Forbidden</D:status> <D:status>HTTP/1.1 403 Forbidden</D:status>
<D:responsedescription> The user does not have access to the <D:responsedescription> The user does not have access to
DingALing property. the DingALing property.
</D:responsedescription> </D:responsedescription>
</D:propstat>
</D:response> </D:response>
<D:responsedescription> There has been an access violation error. <D:responsedescription> There has been an access violation error.
</D:responsedescription> </D:responsedescription>
</D:multistatus> </D:multistatus>
In this example, PROPFIND is executed on the collection In this example, PROPFIND is executed on the collection
http://www.foo.bar/files/. The specified depth is zero, hence the http://www.foo.bar/files/. The specified depth is zero, hence the
PROPFIND applies only to the collection itself, and not to any of PROPFIND applies only to the collection itself, and not to any of
its members. The Propfind header specifies the name of four its members. The propfind XML element specifies the name of four
properties whose values are being requested. In this case only two properties whose values are being requested. In this case only two
properties were returned, since the principal issuing the request properties were returned, since the principal issuing the request
did not have sufficient access rights to see the third and fourth did not have sufficient access rights to see the third and fourth
properties. properties.
8.1.2. Example: Using allprop to Retrieve All Properties 7.1.2 Example: Using allprop to Retrieve All Properties
>>Request
PROPFIND /container/ HTTP/1.1 PROPFIND /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Depth: 1 Depth: 1
Propfind: allprop
HTTP/1.1 200 OK
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" As = "S"?> <?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href = "http://www.foo.bar/boxschema/" AS = R"?> <D:propfind>
<D:allprop/>
</D:propfind>
>>Response
HTTP/1.1 207 Multi-Status
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0"?>
<?namespace href="http://www.iana.org/standards/dav/" as="S"?>
<?namespace href="http://www.foo.bar/boxschema/" as="R"?>
<S:multistatus> <S:multistatus>
<S:response> <S:response>
<S:href>http://www.foo.bar/container/</S:href> <S:href>http://www.foo.bar/container/</S:href>
<S:propstat>
<S:prop> <S: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>Hadrian</R:Name>
</R:author> </R:author>
<S:creationdate>
1997-12-01T17:42:21-08:00
</S:creationdate>
<S:displayname>
Example collection
</S:displayname>
<S:externalmembers>
<S:href>http://www.acme.com/front/</S:href>
</S:externalmembers>
<S:resourcetype><S:collection/></S:resourcetype>
<S:supportedlock>
<S:lockentry>
<S:exclusive/><S:write/>
</S:lockentry>
<S:lockentry>
<S:shared/><S:write/>
</S:lockentry>
</S:supportedlock>
</S:prop> </S:prop>
<S:status>HTTP 1.1 200 OK</S:status> <S:status>HTTP 1.1 200 OK</S:status>
</S:propstat>
</S:response> </S:response>
<S:response> <S:response>
<S:href>http://www.foo.bar/container/index.html</S:href> <S:href>http://www.foo.bar/container/front.html</S:href>
<S:propstat>
<S:prop> <S:prop>
<R:bigbox> <R:bigbox>
<R:BoxType>Box type B</R:BoxType> <R:BoxType>Box type B</R:BoxType>
</R:bigbox> </R:bigbox>
<S:creationdate>
1997-12-01T18:27:21-08:00
</S:creationdate>
<S:displayname>
Example HTML resource
</S:displayname>
<S:getcontentlength>
4525
</S:getcontentlength>
<S:getcontenttype>
text/html
</S:getcontenttype>
<S:getetag>
zzyzx
</S:getetag>
<S:getlastmodified>
Monday, 12-Jan-98 09:25:56 GMT
</S:getlastmodified>
<S:resourcetype/>
<S:supportedlock>
<S:lockentry>
<S:exclusive/><S:write/>
</S:lockentry>
<S:lockentry>
<S:shared/><S:write/>
</S:lockentry>
</S:supportedlock>
</S:prop> </S:prop>
<S:status>HTTP 1.1 200 OK</S:status> <S:status>HTTP 1.1 200 OK</S:status>
</S:propstat>
</S:response> </S:response>
</S:multistatus> </S:multistatus>
In this example, PROPFIND was invoked on the resource In this example, PROPFIND was invoked on the resource
http://www.foo.bar/container/ with a Depth header of 1, meaning the http://www.foo.bar/container/ with a Depth header of 1, meaning the
request applies to the resource and its children, and a Propfind request applies to the resource and its children, and a propfind XML
header of "allprop", meaning the request should return the name and element containing the allprop XML element, meaning the request
value of all properties defined on each resource. should return the name and value of all properties defined on each
resource.
The resource http://www.foo.bar/container/ has two properties The resource http://www.foo.bar/container/ has seven properties
defined on it, named http://www.foo.bar/boxschema/bigbox, and defined on it, named http://www.foo.bar/boxschema/bigbox,
http://www.foo.bar/boxschema/author, while resource http://www.foo.bar/boxschema/author,
http://www.foo.bar/container/index.html has only a single resource http://www.iana.org/standards/dav/creationdate,
defined on it, named http://www.foo.bar/boxschema/bigbox, another http://www.iana.org/standards/dav/displayname,
instance of the "bigbox" property type. http://www.iana.org/standards/dav/externalmembers,
http://www.iana.org/standards/dav/resourcetype, and
http://www.iana.org/standards/dav/supportedlock. The last five
properties are WebDAV-specific, defined in Section 12. Since GET is
not supported on this resource, the get-* properties (e.g., get-
content-length) are not defined on this resource. The DAV-specific
properties assert that "container" was created on December 1, 1997,
at 5:42:21PM, in a time zone 8 hours west of GMT (creationdate), has
a name of "Example collection" (displayname), a single external
member resource, http://www.acme.com/front/ (externalmembers), a
collection resource type (resourcetype), and supports exclusive
write and shared write locks (supportedlock).
8.1.3. Example: Using propname to Retrieve all Property Names The resource http://www.foo.bar/container/front.html has nine
properties defined on it, named http://www.foo.bar/boxschema/bigbox
(another instance of the "bigbox" property type),
http://www.iana.org/standards/dav/creationdate,
http://www.iana.org/standards/dav/displayname,
http://www.iana.org/standards/dav/getcontentlength,
http://www.iana.org/standards/dav/getcontenttype,
http://www.iana.org/standards/dav/getetag,
http://www.iana.org/standards/dav/getlastmodified,
http://www.iana.org/standards/dav/resourcetype, and
http://www.iana.org/standards/dav/supportedlock. The DAV-specific
properties assert that "front.html" was created on December 1, 1997,
at 6:27:21PM, in a time zone 8 hours west of GMT (creationdate), has
a name of "Example HTML resource" (displayname), a content length of
4525 (getcontentlength), a MIME type of "text/html"
(getcontenttype), an entity tag of "zzyzx" (getetag), was last
modified on Monday, January 12, 1998, at 09:25:56 GMT
(getlastmodified), has an undefined resource type, meaning that it
is not a collection (resourcetype), and supports both exclusive
write and shared write locks (supportedlock).
7.1.3 Example: Using propname to Retrieve all Property Names
>>Request
PROPFIND /container/ HTTP/1.1 PROPFIND /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Propfind: propname Content-Type: text/xml
Content-Length: xxxxx
HTTP/1.1 200 OK <?xml version="1.0"?>
<?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<D:propfind>
<D:propname/>
</D:propfind>
>>Response
HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" As = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href = "http://www.foo.bar/boxschema/" AS = "R"?> <?namespace href="http://www.foo.bar/boxschema/" as="R"?>
<D:multistatus> <D:multistatus>
<D:response> <D:response>
<D:href>http://www.foo.bar/container/</D:href> <D:href>http://www.foo.bar/container/</D:href>
<D:propstat>
<D:prop> <D:prop>
<R:bigbox/> <R:bigbox/>
<R:author/> <R:author/>
<D:creationdate/>
<D:displayname/>
<D:externalmembers/>
<D:resourcetype/>
<D:supportedlock/>
</D:prop> </D:prop>
<D:status>HTTP 1.1 200 OK</D:status> <D:status>HTTP 1.1 200 OK</D:status>
</D:propstat>
</D:response> </D:response>
<D:response> <D:response>
<D:href>http://www.foo.bar/container/index.html</D:href> <D:href>http://www.foo.bar/container/front.html</D:href>
<D:propstat>
<D:prop> <D:prop>
<R:bigbox/> <R:bigbox/>
<D:creationdate/>
<D:displayname/>
<D:get-content-length/>
<D:get-content-type/>
<D:get-etag/>
<D:get-last-modified/>
<D:resourcetype/>
<D:supportedlock/>
</D:prop> </D:prop>
<D:status>HTTP 1.1 200 OK</D:status> <D:status>HTTP 1.1 200 OK</D:status>
</D:propstat>
</D:response> </D:response>
</D:multistatus> </D:multistatus>
In this example, PROPFIND is invoked on the collection resource In this example, PROPFIND is invoked on the collection resource
http://www.foo.bar/container/, with a Propfind header set to http://www.foo.bar/container/, with a propfind XML element
"propname", meaning the name of all properties should be returned. containing the propname XML element, meaning the name of all
Since no depth header is present, it assumes its default value of properties should be returned. Since no depth header is present, it
"infinity", meaning the name of the properties on the collection and assumes its default value of "infinity", meaning the name of the
all its progeny should be returned. properties on the collection and all its progeny should be returned.
Consistent with the previous example, resource Consistent with the previous example, resource
http://www.foo.bar/container/ has two properties defined on it, http://www.foo.bar/container/ has seven properties defined on it,
http://www.foo.bar/boxschema/bigbox, and http://www.foo.bar/boxschema/bigbox, and
http://www.foo.bar/boxschema/author. The resource http://www.foo.bar/boxschema/author,
http://www.iana.org/standards/dav/creationdate,
http://www.iana.org/standards/dav/displayname,
http://www.iana.org/standards/dav/externalmembers,
http://www.iana.org/standards/dav/resourcetype, and
http://www.iana.org/standards/dav/supportedlock. The resource
http://www.foo.bar/container/index.html, a member of the "container" http://www.foo.bar/container/index.html, a member of the "container"
collection, has only one property defined on it, collection, has nine properties defined on it,
http://www.foo.bar/boxschema/bigbox. http://www.foo.bar/boxschema/bigbox,
http://www.iana.org/standards/dav/creationdate,
http://www.iana.org/standards/dav/displayname,
http://www.iana.org/standards/dav/get-content-length,
http://www.iana.org/standards/dav/get-content-type,
http://www.iana.org/standards/dav/get-etag,
http://www.iana.org/standards/dav/get-last-modified,
http://www.iana.org/standards/dav/resourcetype, and
http://www.iana.org/standards/dav/supportedlock.
8.2. PROPPATCH 7.2 PROPPATCH
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 Request-URI. identified by 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 of the DAV schema.
Execution of the directives in this method is, of course, subject to Execution of the directives in this method is, of course, subject to
access control constraints. DAV compliant resources MUST support access control constraints. DAV compliant resources SHOULD support
the setting of arbitrary dead properties. the setting of arbitrary dead properties.
The request message body of a PROPPATCH method MUST contain at least The request message body of a PROPPATCH method MUST contain at least
one propertyupdate XML element. Instruction processing MUST occur one propertyupdate XML element. Instruction processing MUST occur in
in the order instructions are received (i.e., from top to bottom), the order instructions are received (i.e., from top to bottom).
and MUST be performed atomically. Instructions MUST either all be executed or none executed. Thus if
any error occurs during processing all executed instructions MUST be
8.2.1. propertyupdate XML element undone and a proper error result returned. Instruction processing
Name: propertyupdate
Namespace: http://www.ietf.org/standards/dav/
Purpose: To contain a request to alter the properties on a
resource.
Parent: None
Values= 1*(set | remove)
Description: This XML element is a container for the information
required to modify the properties on the resource. This XML element
is multi-valued.
8.2.2. set XML element
Name: set
Namespace: http://www.ietf.org/standards/dav/
Purpose: To set the DAV properties specified inside the set XML
element.
Parent: propertyupdate
Values= prop
Description: This XML element MUST contain only a prop XML element.
The elements contained by prop specify the name and value of
properties that are set on the Request-URI. If a property already
exists then its value is replaced.
8.2.3. remove XML element details can be found in the definition of the set and remove
instructions in Section 11.13.
Name: remove If PROPPATCH is invoked on a null resource (e.g., a deleted
Namespace: http://www.ietf.org/standards/dav/ resource), an empty resource is created, and the PROPPATCH
Purpose: To remove the DAV properties specified inside the remove directives are performed on this new resource.
XML element.
Parent: propertyupdate
Values= prop
Description: Remove specifies 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 elements in prop MUST be empty,
as only the names of properties to be removed are required.
8.2.4. Response Codes 7.2.1 Status Codes
200 OK - The command succeeded. As there can be a mixture of sets 200 OK - The command succeeded. As there can be a mixture of sets
and removes in a body, a 201 Create seems inappropriate. and removes in a body, a 201 Created seems inappropriate.
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.
405 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. This includes trying to set read-
only properties. only properties.
413 Request Entity Too Long - If a particular property is too long 413 Request Entity Too Long - If a particular property is too long
to be recorded then a composite XML error will be returned to be recorded then a composite XML error will be returned
indicating the offending property. indicating the offending property.
8.2.5. Example 7.2.2 Example
>>Request
PROPPATCH /bar.html HTTP/1.1 PROPPATCH /bar.html HTTP/1.1
Host: www.foo.com Host: www.foo.com
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href = "http://www.w3.com/standards/z39.50/" AS = "Z"?> <?namespace href="http://www.w3.com/standards/z39.50/" as="Z"?>
<D:propertyupdate> <D:propertyupdate>
<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
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href="http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href="http://www.w3.com/standards/z39.50/" AS = "Z"?> <?namespace href="http://www.w3.com/standards/z39.50/" as="Z"?>
<D:multistatus> <D:multistatus>
<D:response> <D:response>
<D:href>http://www.foo.com/bar</D:href>
<D:propstat>
<D:prop><Z:Authors/></D:prop> <D:prop><Z:Authors/></D:prop>
<D:status>HTTP/1.1 420 Method Failure</D:status> <D:status>HTTP/1.1 424 Method Failure</D:status>
</D:response> </D:propstat>
<D:response> <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:response> </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: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 http://www.w3.com/standards/z39.50/Authors property, and to
remove the property http://www.w3.com/standards/z39.50/Copyright- remove the property http://www.w3.com/standards/z39.50/Copyright-
Owner. Since the Copyright-Owner property could not be removed, no Owner. Since the Copyright-Owner property could not be removed, no
property modifications occur. The Method Failure response code for property modifications occur. The Method Failure status code for
the Authors property indicates this action would have succeeded if the Authors property indicates this action would have succeeded if
it were not for the conflict with removing the Copyright-Owner it were not for the conflict with removing the Copyright-Owner
property. property.
8.3. MKCOL Method 7.3 MKCOL Method
The MKCOL method is used to create a new collection. All DAV The MKCOL method is used to create a new collection. All DAV
compliant resources MUST support the MKCOL method. compliant resources MUST support the MKCOL method.
8.3.1. Request 7.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 Request-URI exists, then MKCOL must fail. the Request-URI. If the resource identified by the Request-URI is
During MKCOL processing, a server MUST make the Request-URI a member non-null then the MKCOL must fail. During MKCOL processing, a
of its parent collection. If no such ancestor exists, the method server MUST make the Request-URI a member of its parent collection.
MUST fail. When the MKCOL operation creates a new collection If no such ancestor exists, the method MUST fail. When the MKCOL
resource, all ancestors MUST already exist, or the method MUST fail operation creates a new collection resource, all ancestors MUST
with a 409 Conflict status code. For example, if a request to already exist, or the method MUST fail with a 409 Conflict status
create collection /a/b/c/d/ is made, and neither /a/b/ nor /a/b/c/ code. For example, if a request to create collection /a/b/c/d/ is
exists, the request MUST fail. made, and neither /a/b/ nor /a/b/c/ exists, the 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 has no members. collection has no members.
A MKCOL request message MAY contain a message body. The behavior of A MKCOL request message MAY contain a message body. The behavior of
a MKCOL request when the body is present is limited to creating a MKCOL request when the body is present is limited to creating
collections, members of a collection, bodies of members and collections, members of a collection, bodies of members and
properties on the collections or members. If the server receives a properties on the collections or members. If the server receives a
MKCOL request entity type it does not support or understand it MUST MKCOL request entity type it does not support or understand it MUST
respond with a 415 Unsupported Media Type status code. The exact respond with a 415 Unsupported Media Type status code. The exact
behavior of MKCOL for various request media types is undefined in behavior of MKCOL for various request media types is undefined in
this document, and will be specified in separate documents. this document, and will be specified in separate documents.
8.3.2. Response Codes 7.3.2 Response Codes
Responses from a MKCOL request are not cacheable, since MKCOL has Responses from a MKCOL request are not cacheable, since MKCOL has
non-idempotent semantics. non-idempotent semantics.
201 Created - The collection or structured resource was created in 201 Created - The collection or structured resource was created in
its entirety. its entirety.
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, and 2) The parent collection of the location in its namespace, and 2) The parent collection of the
skipping to change at line 1253 skipping to change at page 31, line 8
405 Method Not Allowed - MKCOL can only be executed on a 405 Method Not Allowed - MKCOL can only be executed on a
deleted/non-existent resource. deleted/non-existent resource.
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.
415 Unsupported Media Type- The server does not support the request 415 Unsupported Media Type- The server does not support the request
type of the body. type of the body.
419 Insufficient Space on Resource - The resource does not have 423 Insufficient Space on Resource - The 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.3.3. Example 7.3.3 Example
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.server.org.
>>Request
MKCOL /webdisc/xfiles/ HTTP/1.1 MKCOL /webdisc/xfiles/ HTTP/1.1
Host: www.server.org Host: www.server.org
HTTP/1.1 201 Created >>Response
8.4. INDEX Method
The INDEX method is used to enumerate the members of a resource.
All DAV compliant resources MUST support the INDEX method if they
have members.
8.4.1. The Request
For a collection, INDEX MUST return a list of its members. All
WebDAV compliant resources MUST support the text/xml response entity
described below. The INDEX result for a collection MAY also return
a list of the members of child collections, to any depth.
Collections that respond to an INDEX method with a text/xml entity
MUST contain a single multistatus XML element which contains a
response XML element for each member.
A resource that supports INDEX MUST return the resourcetype property
for each member.
Note that the prop XML element MAY contain additional properties.
8.4.2. Example
INDEX /user/yarong/dav_drafts/ HTTP/1.1
Host: www.microsoft.com
HTTP/1.1 200 OK
Content-Type: text/xml
Content-Length: xxx
Last-Modified: Thu, 11 Sep 1997 23:45:12 GMT
ETag: _fooyyybar_
<?XML version="1.0"> HTTP/1.1 201 Created
<?namespace href = _http://www.ietf.org/standards/dav/_ as = _D_?>
<D:multistatus>
<D:response>
<D:href>http://www.microsoft.com/user/yarong/dav_drafts/
</D:href>
<D:prop>
<D:resourcetype>
<D:collection/>
</D:resourcetype>
</D:prop>
<D:status>HTTP 1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>
http://www.microsoft.com/user/yarong/dav_drafts/base
</D:href>
<D:prop>
<D:resourcetype/>
</D:prop>
<D:status>HTTP 1.1 200 OK</D:status>
</D:response>
</D:multistatus>
8.5. ADDREF Method 7.4 ADDREF Method
The ADDREF method is used to add external members to a resource. The ADDREF method is used to add external members to a resource.
All DAV compliant collection resources MUST support the ADDREF All DAV compliant collection resources MUST support the ADDREF
method. All other DAV compliant resources MAY support the ADDREF method. All other DAV compliant resources MAY support the ADDREF
method as appropriate. method as appropriate.
8.5.1. The Request 7.4.1 The Request
The ADDREF method adds the URI specified in the Collection-Member The ADDREF method adds the URI specified in the Collection-Member
header as an external member to the collection specified by the header as an external member to the collection specified by the
Request-URI. The value in the Collection-Member header MUST be an Request-URI.
absolute URI meeting the requirements of an external member URI.
It is not an error if the URI specified in the Collection-Member It is not an error if the URI specified in the Collection-Member
header already exists as an external member of the collection. header already exists as an external member of the collection.
However, after processing the ADDREF there MUST be only one instance However, after processing the ADDREF there MUST be only one instance
of the URI in the collection. If the URI specified in the of the URI in the collection. If the URI specified in the
Collection-Member header already exists as an internal member of the Collection-Member header already exists as an internal member of the
collection, the ADDREF method MUST fail with a 412 Precondition collection, the ADDREF method MUST fail with a 412 Precondition
Failed status code. Failed status code.
8.5.2. Example More than one Collection-Member request header MUST NOT be used with
the ADDREF method.
7.4.2 Example
>>Request
ADDREF /~ejw/dav/ HTTP/1.1 ADDREF /~ejw/dav/ HTTP/1.1
Host: www.ics.uci.edu Host: www.ics.uci.edu
Collection-Member: http://www.ietf.org/standards/dav/ Collection-Member: http://www.iana.org/standards/dav/
HTTP/1.1 200 OK >>Response
This example adds the URI http://www.ietf.org/standards/dav/ as an HTTP/1.1 204 No Content
This example adds the URI http://www.iana.org/standards/dav/ as an
external member resource of the collection external member resource of the collection
http://www.ics.uci.edu/~ejw/dav/. http://www.ics.uci.edu/~ejw/dav/.
8.6. DELREF Method 7.5 DELREF Method
The DELREF method is used to remove external members from a The DELREF method is used to remove external members from a
resource. All DAV compliant collection resources MUST support the resource. All DAV compliant collection resources MUST support the
DELREF method. All other DAV compliant resources MUST support the DELREF method. All other DAV compliant resources MUST support the
DELREF method only if they support the ADDREF method. DELREF method only if they support the ADDREF method.
8.6.1. The Request 7.5.1 The Request
The DELREF method removes the URI specified in the Collection-Member The DELREF method removes the URI specified in the Collection-Member
header from the collection specified by the Request-URI. header from the collection specified by the Request-URI.
DELREFing a URI which is not a member of the collection is not an DELREFing a URI which is not a member of the collection is not an
error. DELREFing an internal member MUST fail with a 412 error. DELREFing an internal member MUST fail with a 412
Precondition Failed status code. Precondition Failed status code.
8.6.2. Example More than one Collection-Member request header MUST NOT be used with
the DELREF method.
7.5.2 Example
>>Request
DELREF /~ejw/dav/ HTTP/1.1 DELREF /~ejw/dav/ HTTP/1.1
Host: www.ics.udi.edu Host: www.ics.udi.edu
Collection-Member: http://www.ietf.org/standards/dav/ Collection-Member: http://www.iana.org/standards/dav/
HTTP/1.1 200 OK >>Response
This example removes the URI http://www.ietf.org/standards/dav/, an HTTP/1.1 204 No Content
This example removes the URI http://www.iana.org/standards/dav/, an
external member resource, from the collection external member resource, from the collection
http://www.ics.uci.edu/~ejw/dav/. http://www.ics.uci.edu/~ejw/dav/.
8.7. GET, HEAD for Collections 7.6 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_ [Fielding et al., of an entity) is identified by the Request-URI" [Fielding et al.,
1997]. GET when applied to a collection MAY return the contents of 1997]. GET when applied to a collection MAY return the contents of
an _index.html_ resource, a human-readable view of the contents of an "index.html" resource, a human-readable view of the contents of
the collection, or something else altogether, and hence it is the collection, or something else altogether. Hence it is possible
possible the result of a GET on a collection will bear no that the result of a GET on a collection will bear no correlation to
correlation to the state of the collection. the state of the 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.8. POST for Collections 7.7 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.9. DELETE 7.8 DELETE
8.9.1. DELETE Method for Non-Collection Resources 7.8.1 DELETE for Non-Collection Resources
If the DELETE method is issued to a non-collection resource which is If the DELETE method is issued to a non-collection resource which is
an internal member of a collection, then during DELETE processing a an internal member of a collection, then during DELETE processing a
server MUST remove the Request-URI from its parent collection. A server MUST remove the Request-URI from its parent collection. A
server MAY remove the URI of a deleted resource from any collections server MAY remove the URI of a deleted resource from any collections
of which the resource is an external member. of which the resource is an external member.
8.9.2. DELETE for Collections 7.8.2 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 on a header was used on it. A client MUST NOT submit a Depth header on a
DELETE on a collection with any value but Infinity. DELETE on a collection with any value but infinity.
DELETE instructs that the collection specified in the request-URI, DELETE instructs that the collection specified in the request-URI,
the records of its external member resources, and all its internal the records of its external member resources, and all its internal
member resources, are to be deleted. member resources, are to be deleted.
If any member cannot be deleted then all of the member's progeny If any member cannot be deleted then all of the member's ancestors
MUST NOT be deleted, so as to maintain the namespace. MUST NOT be deleted, so as to maintain the namespace.
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. In this case, a header of special interest resource to be deleted.
is the Destroy header, which specifies the method to be used to
delete all resources in the scope of the DELETE.
When the DELETE method has completed processing it MUST return a When the DELETE method has completed processing it MUST return a
consistent namespace. consistent namespace.
The response SHOULD be a Multi-Status response that describes the The response SHOULD be a Multi-Status response that describes the
result of the DELETE on each affected resource. result of the DELETE on each affected resource.
8.9.2.1. Example 7.8.2.1 Example
>>Request
DELETE /container/ HTTP/1.1 DELETE /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Destroy: NoUndelete
>>Response
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" As = "d"?> <?namespace href="http://www.iana.org/standards/dav/" as="d"?>
<d:multistatus> <d:multistatus>
<d:response> <d:response>
<d:href>http://www.foo.bar/container/resource1</d:href> <d:href>http://www.foo.bar/container/resource1</d:href>
<d:href>http://www.foo.bar/container/resource2</d:href> <d:href>http://www.foo.bar/container/resource2</d:href>
<d:status>HTTP/1.1 200 OK</d:status> <d:status>HTTP/1.1 200 OK</d:status>
</d:response> </d:response>
<d:response> <d:response>
<d:href>http://www.foo.bar/container/</d:href> <d:href>http://www.foo.bar/container/</d:href>
<d:status>HTTP/1.1 420 Method Failure</d:status> <d:status>HTTP/1.1 424 Method Failure</d:status>
</d:response> </d:response>
<d:response> <d:response>
<d:href>http://www.foo.bar/container/resource3</d:href> <d:href>http://www.foo.bar/container/resource3</d:href>
<d:status>HTTP/1.1 412 Precondition Failed</d:status> <d:status>HTTP/1.1 425 Locked</d:status>
</d:response> </d:response>
</d:multistatus> </d:multistatus>
In this example the attempt to delete In this example the attempt to delete
http://www.foo.bar/container/resource3 failed because the server was http://www.foo.bar/container/resource3 failed because it is locked,
unable to guarantee that resource3 would not be able to be and no lock token was submitted with the request. Consequently, the
undeleted. Consequently, the attempt to delete attempt to delete http://www.foo.bar/container/ also failed, but
http://www.foo.bar/container/ also failed, but resource1 and resource1 and resource2 were deleted. Even though a Depth header has
resource2 were deleted. Even though a Depth header has not been not been included, a depth of infinity is assumed because the method
included, a depth of infinity is assumed because the method is on a is on a collection. As this example illustrates, DELETE processing
collection. As this example illustrates, DELETE processing need not need not be atomic.
be atomic.
8.10. PUT 7.9 PUT
8.10.1. PUT for Non-Collection Resources 7.9.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. For example, if a server recomputed during PUT processing but are not otherwise effected.
recognizes the content type of the request body, it may be able to For example, if a server recognizes the content type of the request
automatically extract information that could be profitably exposed body, it may be able to automatically extract information that could
as properties. be 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 405 Method appropriately scoped parent collection MUST fail with a 409
Not Allowed. Conflict.
8.10.2. PUT for Collections 7.9.2 PUT for Collections
As defined in the HTTP/1.1 specification [Fielding et al., 1997], As defined in the HTTP/1.1 specification [Fielding et al., 1997],
the "PUT method requests that the enclosed entity be stored under the "PUT method requests that the enclosed entity be stored under
the supplied Request-URI." Since submission of an entity the supplied Request-URI." Since submission of an entity
representing a collection would implicitly encode creation and representing a collection would implicitly encode creation and
deletion of resources, this specification intentionally does not deletion of resources, this specification intentionally does not
define a transmission format for creating a collection using PUT. define a transmission format for creating a collection using PUT.
Instead, the MKCOL method is defined to create collections. If a Instead, the MKCOL method is defined to create collections. If a
PUT is invoked on a collection resource it MUST fail. PUT is invoked on a collection resource it MUST fail.
When the PUT operation creates a new non-collection resource all When the PUT operation creates a new non-collection resource all
ancestors MUST already exist. If all ancestors do not exist, the ancestors MUST already exist. If all ancestors do not exist, the
method MUST fail with a 409 Conflict status code. For example, if 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, resource /a/b/c/d.html is to be created and /a/b/c/ does not exist,
then the request must fail. then the request must fail.
8.11. COPY Method 7.10 COPY Method
The COPY method creates a duplicate of the specified resource. All
DAV compliant resources MUST support the COPY method.
Support for the COPY method does not guarantee the ability to copy a
resource. For example, separate programs may control resources on
the same server. As a result, it may not even be possible to copy a
resource to a location that appears to be on the same server.
8.11.1. The Request
The COPY method creates a duplicate of the source resource, given by The COPY method creates a duplicate of the source resource, given by
the Request-URI, in the destination resource, given by the the Request-URI, in the destination resource, given by the
Destination header. The Destination header MUST be present. The Destination header. The Destination header MUST be present. The
exact behavior of the COPY method depends on the type of the source exact behavior of the COPY method depends on the type of the source
resource. resource.
8.11.1.1. COPY for HTTP/1.1 resources Support for the COPY method does not guarantee the ability to copy a
resource. For example, separate programs may control resources on
the same server. As a result, it may not even be possible to copy a
resource to a location that appears to be on the same server.
7.10.1 COPY for HTTP/1.1 resources
When the source resource is not a collection the body of the When the source resource is not a collection the body of the
destination resource MUST be octet-for-octet identical to the body destination resource MUST be octet-for-octet identical to the body
of the source resource. Alterations to the destination resource do of the source resource. Subsequent alterations to the destination
not modify the source resource. Alterations to the source resource resource will not modify the source resource. Subsequent
do not modify the destination resource. Thus, all copies are alterations to the source resource will not modify the destination
performed _by-value_. resource. Thus, all copies are performed "by-value".
All properties on the source resource MUST be duplicated on the All properties on the source resource MUST be duplicated on the
destination resource, subject to modifying headers, following the destination resource, subject to modifying headers and XML elements,
definition for copying properties. following the definition for copying properties.
8.11.1.2. COPY for Properties
7.10.2 COPY for Properties
The following section defines how properties on a resource are The following section defines how properties on a resource are
handled during a COPY operation. handled during a COPY operation.
Live properties SHOULD be duplicated as identically behaving live Live properties SHOULD be duplicated as identically behaving live
properties at the destination resource. Since they are live properties at the destination resource. If a property cannot be
properties, the server determines the syntax and semantics of these
properties. Properties named by the Enforce-Live-Properties header
MUST be live on the destination resource, or the method MUST fail.
If a property is not named by Enforce-Live-Properties and cannot be
copied live, then its value MUST be duplicated, octet-for-octet, in copied live, then its value MUST be duplicated, octet-for-octet, in
an identically named, dead property on the destination resource. an identically named, dead property on the destination resource.
The propertybehavior XML element can specify that properties are
copied on best effort, that all live properties MUST be successfully
copied or the method MUST fail, or that a specified list of live
properties MUST be successfully copied or the method must fail. The
propertybehavior XML element is defined in Section 11.12.
If a property on the source already exists on the destination If a property on the source already exists on the destination
resource and the Overwrite header is set to "T" then the property at resource and the Overwrite header is set to "T" then the property at
the destination MUST be overwritten with the property from the the destination MUST be overwritten with the property from the
source. If the Overwrite header is "F" and the previous situation source. If the Overwrite header is "F" and the previous situation
exists, then the COPY MUST fail with a 409 Conflict. exists, then the COPY MUST fail with a 412 Precondition Failed.
8.11.1.3. COPY for Collections 7.10.3 COPY for Collections
The COPY method on a collection without a Depth header MUST act as The COPY method on a collection without a Depth header MUST act as
if a Depth = infinity header was included. A client MAY submit a if a Depth header with value "infinity" was included. A client MAY
Depth header on a COPY on a collection with a value of "0" or submit a Depth header on a COPY on a collection with a value of "0"
"infinity". DAV compliant servers MUST support the "0" and or "infinity". DAV compliant servers MUST support the "0" and
"infinity" behaviors. "infinity" behaviors.
A COPY of depth infinity instructs that the collection specified in A COPY of depth infinity instructs that the collection specified in
the Request-URI, the records of its external member resources, and the Request-URI and the records of its external member resources is
all its internal member resources, are to be copied to a location to be copied to the location specified in the Destination header,
relative to the Destination header. and all its internal member resources are to be copied to a
location relative to it, recursively through all levels of the
collection hierarchy.
A COPY of depth "0" only instructs that the collection, the A COPY of depth "0" only instructs that the collection, the
properties, and its external members, not its internal members, are properties, and the records of its external members, not its
to be copied. internal members, are to be copied.
Any headers included with a COPY are to be applied in processing Any headers included with a COPY are to be applied in processing
every resource to be copied. every resource to be copied.
The exception to this rule is the Destination header. This header The exception to this rule is the Destination header. This header
only specifies the destination for the Request-URI. When applied to only specifies the destination for the Request-URI. When applied to
members of the collection specified in the request-URI the value of members of the collection specified in the request-URI the value of
Destination is to be modified to reflect the current location in the Destination is to be modified to reflect the current location in the
hierarchy. So, if the request-URI is "a" and the destination is "b" hierarchy. So, if the request-URI is "a" and the destination is "b"
then when a/c/d is processed it MUST use a destination of b/c/d. then when a/c/d is processed it MUST use a destination of 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. Thus if it is not possible consistent namespace at the destination. However, if an error
to COPY a collection with internal members, the internal members may occurs while copying an internal member collection, all members of
still be copied but a collection will have to be created at the this collection MUST NOT be copied. In this case, after detecting
destination to contain them. the error, the COPY operation SHOULD try to finish as much of the
original copy operation as possible. So, for example, if an
infinite depth copy operation is performed on 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 /a/c/. Similarly,
after encountering an error copying a non-collection resource as
part of an infinite depth copy, the server SHOULD try to finish as
much of the original copy operation as possible.
The response is a Multi-Status response that describes the result of The response is a Multi-Status status code with an entity body that
the COPY on each affected resource. The response is given for the describes the result of the COPY on each affected resource. The
resource that was to be copied, not the resource that was created as href XML element in the response refers to the resource that was to
a result of the copy. In other words, each entry indicates whether be copied, not the resource that was created as a result of the
the copy on the resource specified in the href succeeded or failed copy. In other words, each entry indicates whether the copy on the
and why. resource specified in the href XML element succeeded or failed and
why.
The exception to this rule is for errors that occurred on the The exception to this rule is for errors that occurred on the
destination. For example, if the destination was locked the destination. For example, if the destination was locked the
response would indicate the destination URL and a 421 Destination response would indicate the destination URL and a 425 Locked error.
Locked error.
8.11.1.4. Type Interactions 7.10.4 Type Interactions
If the destination resource identifies a collection and the If the destination resource identifies a collection and the
Overwrite header is _T_, prior to performing the copy the server Overwrite header is "T", prior to performing the copy the server
MUST perform a DELETE operation on the collection. MUST perform a DELETE operation on the collection.
8.11.2. Response Codes 7.10.5 Status Codes
200 OK - The source resource was successfully copied to a pre-
existing destination resource.
201 Created - The source resource was successfully copied. The copy 201 Created - The source resource was successfully copied. The copy
operation resulted in the creation of a new resource. operation resulted in the creation of a new resource.
204 No Content - The source resource was successfully copied to a
pre-existing destination resource. Since there is no entity body in
the response, 204 No Content is used instead of 200 OK.
412 Precondition Failed - This status code MUST be returned if the 412 Precondition Failed - This status code MUST be returned if the
server was unable to maintain the liveness of the properties listed server was unable to maintain the liveness of the properties listed
in the Enforce-Live-Properties header, or if the Overwrite header is in the propertybehavior XML element, or if the Overwrite header is
"F", and the state of the destination resource is non-null. "F", and the state of the destination resource is non-null.
419 Insufficient Space on Resource - The destination resource does 423 Insufficient Space on Resource - The destination resource does
not have sufficient space to record the state of the resource after not have sufficient space to record the state of the resource after
the execution of this method. the execution of this method.
421 Destination Locked _ The destination resource was locked and 425 Locked - The destination resource was locked and either a valid
either a valid Lock-Token header was not submitted, or the Lock- Lock-Token header was not submitted, or the Lock-Token header
Token header identifies a lock held by another principal. identifies a lock held by another principal.
500 Server Error - The resource was in such a state that it could 502 Bad Gateway - This may occur when the destination is on another
not be copied. This may occur if the Destination header specifies a server and the destination server refuses to accept the resource.
resource that is outside the namespace the resource is able to
interact with.
8.11.3. Overwrite Example 7.10.6 Overwrite Example
This example shows resource This example shows resource
http://www.ics.uci.edu/~fielding/index.html being copied to the http://www.ics.uci.edu/~fielding/index.html being copied to the
location http://www.ics.uci.edu/users/f/fielding/index.html. The location http://www.ics.uci.edu/users/f/fielding/index.html. The
contents of the destination resource were overwritten, if non-null. 204 No Content status code indicates the existing resource at the
destination was overwritten.
>>Request
COPY /~fielding/index.html HTTP/1.1 COPY /~fielding/index.html HTTP/1.1
Host: www.ics.uci.edu Host: www.ics.uci.edu
Destination: http://www.ics.uci.edu/users/f/fielding/index.html Destination: http://www.ics.uci.edu/users/f/fielding/index.html
HTTP/1.1 200 OK >>Response
8.11.4. No Overwrite Example HTTP/1.1 204 No Content
7.10.7 No Overwrite Example
The following example shows the same copy operation being performed, The following example shows the same copy operation being performed,
except with the Overwrite header set to _F._ A response of 412 except with the Overwrite header set to "F." A response of 412
Precondition Failed is returned because the destination resource has Precondition Failed is returned because the destination resource has
a non-null state. a non-null state.
>>Request
COPY /~fielding/index.html HTTP/1.1 COPY /~fielding/index.html HTTP/1.1
Host: www.ics.uci.edu Host: www.ics.uci.edu
Destination: http://www.ics.uci.edu/users/f/fielding/index.html Destination: http://www.ics.uci.edu/users/f/fielding/index.html
Overwrite: _F_ Overwrite: F
>>Response
HTTP/1.1 412 Precondition Failed HTTP/1.1 412 Precondition Failed
8.11.5. Collection Example 7.10.8 Collection Example
>>Request
COPY /container/ HTTP/1.1 COPY /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Destination: http://www.foo.bar/othercontainer/ Destination: http://www.foo.bar/othercontainer/
Enforce-Live-Properties: * Depth: infinity
Depth: Infinity Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0"?>
<?namespace href="http://www.iana.org/standards/dav/" as="d"?>
<d:propertybehavior>
<d:keepalive>*</d:keepalive>
</d:propertybehavior>
>>Response
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" As = "d"?> <?namespace href="http://www.iana.org/standards/dav/" as="d"?>
<d:multistatus> <d:multistatus>
<d:response> <d:response>
<d:href>http://www.foo.bar/othercontainer/resource1</d:href> <d:href>http://www.foo.bar/othercontainer/resource1</d:href>
<d:href>http://www.foo.bar/othercontainer/resource2</d:href> <d:href>http://www.foo.bar/othercontainer/resource2</d:href>
<d:href>http://www.foo.bar/othercontainer/</d:href> <d:href>http://www.foo.bar/othercontainer/</d:href>
<d:href>http://www.foo.bar/othercontainer/R2/D2</d:href>
<d:status>HTTP/1.1 201 Created</d:status> <d:status>HTTP/1.1 201 Created</d:status>
</d:response> </d:response>
<d:response> <d:response>
<d:href>http://www.foo.bar/othercontainer/R2/</d:href> <d:href>http://www.foo.bar/othercontainer/R2/</d:href>
<d:href>http://www.foo.bar/othercontainer/R2/D2</d:href>
<d:status>HTTP/1.1 412 Precondition Failed</d:status> <d:status>HTTP/1.1 412 Precondition Failed</d:status>
</d:response> </d:response>
</d:multistatus> </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 enforcing live properties. failed, most likely due to a problem with maintaining the liveness
R2's member D2 was successfully copied. As a result a collection of properties (this is specified by the propertybehavior XML
was created at www.foo.bar/othercontainer/R2 to contain D2. element). Since an error occurred copying R2, R2's member D2 was not
copied.
8.12. MOVE Method 7.11 MOVE Method
The move operation on a resource is the logical equivalent of a copy The MOVE operation on a non-collection resource is the logical
followed by a delete, where the actions are performed atomically. equivalent of a copy (COPY) followed by a delete, where the actions
All DAV compliant resources MUST support the MOVE method. are performed atomically. All DAV compliant resources MUST support
the MOVE method.
However, support for the MOVE method does not guarantee the ability However, support for the MOVE method does not guarantee the ability
to move a resource to a particular destination. For example, to move a resource to a particular destination. For example,
separate programs may actually control different sets of resources separate programs may actually control different sets of resources
on the same server. Therefore, it may not even be possible to move on the same server. Therefore, it may not even be possible to move
a resource within a namespace that appears to belong to the same a resource within a namespace that appears to belong to the same
server. server.
8.12.1. The Request
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.12.2. MOVE for Collections 7.11.1 MOVE for Collections
MOVE instructs that the collection specified in the Request-URI, the A MOVE of depth infinity instructs that the collection specified in
records of its external member resources, and all its internal the Request-URI, including the records of its external member
member resources, are to be moved to a location relative to the resources, is to be moved to the location specified in the
Destination header. Destination header, and all its internal member resources are to be
moved to locations relative to it, recursively 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 are to be applied in processing every Any headers included with MOVE are to be applied in processing every
resource to be moved. resource to be moved.
The exception to this rule is the Destination header. The behavior The exception to this rule is the Destination header. The behavior
of this header is the same as given for COPY on collections. of this header is the same as given for COPY 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 on both the source and destination, creating consistent namespace on both the source and destination. However, if
collections at the source or destination as necessary. an error occurs while moving an internal member collection, all
members of the failed collection MUST NOT be moved. In this case,
after detecting the error, the move operation SHOULD try to finish
as much of the original move as possible. So, for example, if an
infinite depth move is performed on collection /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/. Similarly, after
encountering an error moving a non-collection resource as part of an
infinite depth move, the server SHOULD try to finish as much of the
original move operation as possible.
As specified in the definition of MOVE, a MOVE of a collection over As specified in the definition of MOVE, a MOVE of a collection over
another collection causes the destination collection and all its another collection causes the destination collection and all its
members to be deleted. members to be deleted.
The response is a Multi-Status response that describes the result of The response is a Multi-Status response that describes the result of
the MOVE on each effected resource. The response is given for the the MOVE on each affected resource. The href XML element in the
resource that was to be moved, not the resource that was created as response refers to the resource that was to be moved, not the
a result of the move. In other words, each entry indicates whether resource that was created as a result of the move. In other words,
the move on the resource specified in the href succeeded or failed each entry indicates whether the move on the resource specified in
and why. the href succeeded or failed and why.
The exception to this rule is for errors that occurred on the The exception to this rule is for errors that occurred on the
destination. For example, if the destination was locked the destination. For example, if the destination was locked the
response would indicate the destination URL and a 421 Destination response would indicate the destination URL and a 425 Locked error.
Locked error.
8.12.3. Response Codes
200 OK - The move operation was successful. 7.11.2 Status Codes
201 Created - The source resource was successfully moved, and a new
resource was created at the destination.
409 Conflict _ The MOVE was attempted on a collection with members. 204 No Content - The move operation was successful, and the resource
While the COPY part of this operation could succeed the DELETE could at the destination was overwritten.
not. Therefore the MOVE MUST fail.
412 Precondition Failed - This status code MUST be returned if the 412 Precondition Failed - This status code MUST be returned if the
server was unable to maintain the liveness of the properties listed server was unable to maintain the liveness of the properties listed
in the Enforce-Live-Properties header, or if the Overwrite header is in the propertybehavior XML element, or if the Overwrite header is
"F", and the state of the destination resource is non-null. "F", and the state of the destination resource is non-null.
421 Destination Locked - The destination resource was locked and 425 Locked - The source or the destination resource was locked and
either a valid Lock-Token header was not submitted, or the Lock- either a valid Lock-Token header was not submitted, or the Lock-
Token header identifies a lock held by another principal. Token header identifies a lock held by another principal.
502 Bad Gateway - This may occur when the destination is 502 Bad Gateway - This may occur when the destination is on another
server and the destination server refuses to accept the resource.
o
n another
server and the destination server refuses to accept the resource
8.12.4. Overwrite Example 7.11.3 Non-Collection Example
This example shows resource This example shows resource
http://www.ics.uci.edu/~fielding/index.html being moved to the http://www.ics.uci.edu/~fielding/index.html being moved to the
location http://www.ics.uci.edu/users/f/fielding/index.html. The location http://www.ics.uci.edu/users/f/fielding/index.html. The
contents of the destination resource were overwritten, if non-null. contents of the destination resource would have been overwritten if
the destination resource had been non-null. In this case, since
there was nothing at the destination resource, the response code is
201 Created.
>>Request
MOVE /~fielding/index.html HTTP/1.1 MOVE /~fielding/index.html HTTP/1.1
Host: www.ics.uci.edu Host: www.ics.uci.edu
Destination: http://www.ics.uci.edu/users/f/fielding/index.html Destination: http://www.ics.uci.edu/users/f/fielding/index.html
HTTP/1.1 200 OK >>Response
8.12.5. Collection Example HTTP/1.1 201 Created
Location: http://www.ics.uci.edu/users/f/fielding/index.html
7.11.4 Collection Example
>>Request
MOVE /container/ HTTP/1.1 MOVE /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Destination: http://www.foo.bar/othercontainer/ Destination: http://www.foo.bar/othercontainer/
Enforce-Live-Properties: * Overwrite: F
Overwrite: False Lock-Token: <opaquelocktoken:fe184f2e-6eec-41d0-c765-01adc56e6bb4>,
Lock-Token: <OpaqueLockToken:xxxx> <OpaqueLockToken:xxxx> <opaquelocktoken:e454f3f3-acdc-452a-56c7-00a5c91e4b77>
Content-Type: text/xml
Content-Length: xyz
Authorization: Digest username="rohit",
realm="rohit@www.foo.bar", nonce="...",
uri="/container/", response="...",
opaque="..."
<?xml version="1.0"?>
<?namespace href="http://www.iana.org/standards/dav/" as="d"?>
<d:propertybehavior>
<d:keepalive>*</d:keepalive>
</d:propertybehavior>
>>Response
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: zzz
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" As = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="d"?>
<d:multistatus> <d:multistatus>
<d:response> <d:response>
<d:href>http://www.foo.bar/container/resource1</d:href> <d:href>http://www.foo.bar/container/resource1</d:href>
<d:href>http://www.foo.bar/container/resource2</d:href> <d:href>http://www.foo.bar/container/resource2</d:href>
<d:href>http://www.foo.bar/container/</d:href> <d:href>http://www.foo.bar/container/</d:href>
<d:href>http://www.foo.bar/container/C2/R2</d:href> <d:status>HTTP/1.1 204 No Content</d:status>
<d:status>HTTP/1.1 201 Created</d:status>
</d:response> </d:response>
<d:response> <d:response>
<d:href>http://www.foo.bar/container/C2</d:href> <d:href>http://www.foo.bar/container/C2/R2</d:href>
<d:status>HTTP/1.1 420 Method Failure</d:status> <d:status>HTTP/1.1 424 Method Failure</d:status>
<d:response> <d:response>
<d:href>http://www.foo.bar/othercontainer/C2</d:href> <d:href>http://www.foo.bar/othercontainer/C2/</d:href>
<d:status>HTTP/1.1 409 Conflict</d:status> <d:status>HTTP/1.1 425 Locked</d:status>
</d:response> </d:response>
</d:multistatus> </d:multistatus>
In this example the client has submitted a number of lock tokens 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 with 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.foo.bar/othercontainer/C2/.
This means that the resource continer/c2 could not be moved, This means that the resource /container/C2/ could not be moved. As
although its child container/C2/R2 could be moved. the attempt to move /container/C2/ failed then the resource
/container/C2/R2 MUST also fail since it is a child of
/container/C2/.
8.13. LOCK Method 7.12 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. These sections on the LOCK
method describe only those semantics that are specific to the LOCK method describe only those semantics that are specific to the LOCK
method and are independent of the access type of the lock being method and are independent of the access type of the lock being
requested. Once the general LOCK method has been described, requested.
subsequent sections describe the semantics of the "write" access
type, and the write lock.
8.13.1. Operation 7.12.1 Operation
A LOCK method invocation creates the lock specified by the Lock-Info A LOCK method invocation creates the lock specified by the lockinfo
header on the Request-URI. Lock method requests SHOULD have a XML XML element on the Request-URI. Lock method requests SHOULD have a
request body which contains an Owner XML element for this lock XML request body which contains an owner XML element for this lock
request. The LOCK request MAY have a Timeout header. request, unless this is a refresh request. The LOCK request MAY have
a Timeout header.
A successful response to a lock invocation MUST include Lock-Token A successful response to a lock invocation MUST include Lock-Token
and Timeout headers. Clients MUST assume that locks may arbitrarily and Timeout headers. Clients MUST assume that locks may arbitrarily
disappear at any time, regardless of the value given in the Timeout disappear at any time, regardless of the value given in the Timeout
header. The Timeout header only indicates the behavior of the header. The Timeout header only indicates the behavior of the
server if "extraordinary" circumstances do not occur. For example, server if "extraordinary" circumstances do not occur. For example,
an administrator may remove a lock at any time or the system may an administrator 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 crash in such a way that it loses the record of the lock's
existence. The response MUST also contain the value of the existence. The response MUST also contain the value of the
lockdiscovery property in a prop XML element. lockdiscovery property in a prop XML element.
8.13.2. The Effect of Locks on Properties and Collections 7.12.2 The Effect of Locks on Properties and Collections
By default the scope of a lock is the entire state of the resource, The scope of a lock is the entire state of the resource, including
including its body and associated properties. As a result, a lock its body and associated properties. As a result, a lock on a
on a resource also locks the resource's properties, and a lock on a resource also locks the resource's properties.
property may lock a property's resource or may restrict the ability
to lock the property's resource. Only a single lock token MUST be
used when a lock extends to cover both a resource and its
properties. Note that certain lock types MAY override this
behavior.
For collections, a lock also affects the ability to add or remove For collections, a lock also affects the ability to add or remove
members. The nature of the effect depends upon the type of access members. The nature of the effect depends upon the type of access
control involved. control involved.
8.13.3. Locking Replicated Resources 7.12.3 Locking Replicated Resources
Some servers automatically replicate resources across multiple URLs. Some servers automatically replicate resources across multiple URLs.
In such a circumstance the server MAY only accept a lock on one of In such a circumstance the server MAY only accept a lock on one of
the URLs if the server can guarantee that the lock will be honored the URLs if the server can guarantee that the lock will be honored
across all the URLs. across all the URLs.
8.13.4. Locking Multiple Resources 7.12.4 Depth and Locking
The LOCK method supports locking multiple resources simultaneously
by allowing for the listing of several URIs in the LOCK request.
These URIs, in addition to the Request-URI, are then to be locked as
a result of the LOCK method's invocation. When multiple resources
are specified the LOCK method only succeeds if all specified
resources are successfully locked.
The Lock-Tree option of the lock request specifies that the resource
and all its internal children (including internal collections, and
their internal members) are to be locked. This is another mechanism
by which a request for a lock on multiple resources can be
specified.
Currently existing locks can not be extended to cover more or less The Depth header MAY be used with the LOCK method. Values other
resources, and any request to expand or contract the number of than 0 or infinity MUST NOT be used with the Depth header.
resources in a lock MUST fail with a 409 Conflict status code. So,
for example, if resource A is exclusively write locked and then the
same principal asks to exclusively write lock resources A, B, and C,
the request will fail as A is already locked and the lock can not be
extended.
A successful result will return a single lock token which represents A Depth header of value 0 means to just lock the resource specified
all the resources that have been locked. If an UNLOCK is executed by the request-URI.
on this token, all associated resources are unlocked.
If the lock cannot be granted to all resources, a 409 Conflict If the Depth header is set to infinity then the resource specified
status code MUST be returned with a response entity body containing in the request-URI along with all its internal members, all the way
a multistatus XML element describing which resource(s) prevented the down the hierarchy, are to be locked. A successful result will
lock from being granted. return a single lock token which represents all the resources that
have been locked. If an UNLOCK is executed on this token, all
associated resources are unlocked. If the lock cannot be granted to
all resources, a 409 Conflict status code MUST be returned with a
response entity body containing a multistatus XML element describing
which resource(s) prevented the lock from being granted. Hence,
partial success is not an option. Either the entire hierarchy is
locked or no resources are locked.
8.13.5. Interaction with other Methods 7.12.5 Interaction with other Methods
The interaction of a LOCK with various methods is dependent upon the The interaction of a LOCK with various methods is dependent upon the
lock type. However, independent of lock type, a successful DELETE lock type. However, independent of lock type, a successful DELETE
of a resource MUST cause all of its locks to be removed. of a resource MUST cause all of its locks to be removed.
8.13.6. Lock Compatibility Table 7.12.6 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/ Shared Lock Exclusive Current lock state/ Shared Lock Exclusive
Lock request Lock Lock request Lock
None True True None True True
Shared Lock True False Shared Lock True False
Exclusive Lock False 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. *=if the principal requesting the lock is the owner of the granted. *=if the principal requesting the lock is the owner of the
lock, the lock MAY be regranted. lock, the lock MUST be regranted.
The current lock state of a resource is given in the leftmost The current lock state of a resource is given in the leftmost
column, and lock requests are listed in the first row. The column, and lock requests are listed in the first row. The
intersection of a row and column gives the result of a lock request. intersection of a row and column gives the result of a lock request.
For example, if a shared lock is held on a resource, and an For example, if a shared lock is held on a resource, and an
exclusive lock is requested, the table entry is _false_, indicating exclusive lock is requested, the table entry is "false", indicating
the lock must not be granted. the lock must not be granted.
If an exclusive or shared lock is re-requested by the principal who If an exclusive or shared lock is re-requested by the principal who
owns the lock, the lock MUST be regranted. If the lock is owns the lock, the lock MUST be regranted. If the lock is
regranted, the same lock token that was previously issued MUST be regranted, the same lock token that was previously issued MUST be
returned. returned.
8.13.7. Owner XML Element 7.12.7 Lock Response
Name: owner
Namespace: http://www.ietf.org/standards/dav/
Purpose: Provide information about the principal taking out a
lock.
Parent: Any
Values: XML Elements
Descripton: The Owner XML element provides 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 owns a lock.
8.13.8. Lock Response
A successful lock response MUST contain a Lock-Token response A successful lock response MUST contain a Lock-Token response
header, a Timeout header and a prop XML element in the response body header, a Timeout header and a prop XML element in the response body
which contains the value of the lockdiscovery property. which contains the value of the lockdiscovery property.
8.13.9. Response Codes 7.12.8 Status Codes
412 Precondition Failed - The included Lock-Token was not
enforceable on this resource or the server could not satisfy the
request in the lockinfo XML element.
409 Conflict - The resource is locked, so the method has been 425 Locked - The resource is locked, so the method has been
rejected. rejected.
412 Precondition Failed - The included Lock-Token was not 7.12.9 Example - Simple Lock Request
enforceable on this resource or the server could not satisfy the
request in the Lock-Info header.
8.13.10. Example - Simple 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: webdav.sb.aol.com
Lock-Info: LockType=Write LockScope=Exclusive Timeout: Infinite, Second-4100000000
Timeout: Infinite; Second-4100000000
Content-Type: text/xml Content-Type: text/xml
Content-Length: xyz Content-Length: xyz
Authorization: Digest username="ejw",
realm="ejw@webdav.sb.aol.com", nonce="...",
uri="/workspace/webdav/proposal.doc",
response="...", opaque="..."
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href="http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<D:lockinfo>
<D:locktype><D:write/></D:locktype>
<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://www.ics.uci.edu/~ejw/contact.html</D:href>
</D:owner> </D:owner>
</D:lockinfo>
>>Response
HTTP/1.1 200 OK HTTP/1.1 200 OK
Lock-Token: opaquelocktoken:xyz122393481230912asdfa09s8df09s7df Lock-Token: <opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
Timeout: Second-604800 Timeout: Second-604800
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href ="http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<D:prop> <D:prop>
<D:lockdiscovery> <D:lockdiscovery>
<D:activelock> <D:activelock>
<D:locktype>write</D:locktype> <D:locktype><D:write/></D:locktype>
<D:lockscope>exclusive</D:lockscope> <D:lockscope><D:exclusive/></D:lockscope>
<D:addlocks/>
<D:owner> <D:owner>
<D:href> <D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
http://www.ics.uci.edu/~ejw/contact.html
</D:href>
</D:owner> </D:owner>
<D:timeout>Second-604800</D:timeout> <D:timeout>Second-604800</D:timeout>
<D:locktoken> <D:locktoken>
<D:href> <D:href>
opaquelocktoken:xyz122393481230912asdfa09s8df09s7df opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4
</D:href> </D:href>
</D:locktoken> </D:locktoken>
</D:activelock> </D:activelock>
</D:lockdiscovery> </D:lockdiscovery>
</D:prop> </D:prop>
This example shows the successful creation of an exclusive write This example shows the successful creation of an exclusive write
lock on resource lock on resource
http://webdav.sb.aol.com/workspace/webdav/proposal.doc. The http://webdav.sb.aol.com/workspace/webdav/proposal.doc. The
resource http://www.ics.uci.edu/~ejw/contact.html contains contact resource http://www.ics.uci.edu/~ejw/contact.html contains contact
skipping to change at line 2023 skipping to change at page 46, line 17
</D:locktoken> </D:locktoken>
</D:activelock> </D:activelock>
</D:lockdiscovery> </D:lockdiscovery>
</D:prop> </D:prop>
This example shows the successful creation of an exclusive write This example shows the successful creation of an exclusive write
lock on resource lock on resource
http://webdav.sb.aol.com/workspace/webdav/proposal.doc. The http://webdav.sb.aol.com/workspace/webdav/proposal.doc. The
resource http://www.ics.uci.edu/~ejw/contact.html contains contact resource http://www.ics.uci.edu/~ejw/contact.html contains contact
information for the owner of the lock. The server has an activity- information for the owner of the lock. The server has an activity-
based timeout policy in place on this resource, which causes the based timeout policy in place on this resource, which causes the
lock to automatically be removed after 1 week (604800 seconds). The lock to automatically be removed after 1 week (604800 seconds). The
response has a Lock-Token header that gives the lock token URL that response has a Lock-Token header that gives the lock token URL that
uniquely identifies the lock created by this lock request. uniquely identifies the lock created by this lock request. Note
that the nonce, response, and opaque fields have not been calculated
in the Authorization request header.
8.13.11. Example - Multi-Resource Lock Request 7.12.10 Example - Refreshing a Write Lock
>>Request
LOCK /workspace/webdav/proposal.doc HTTP/1.1 LOCK /workspace/webdav/proposal.doc HTTP/1.1
Host: webdav.sb.aol.com Host: webdav.sb.aol.com
Lock-Info: LockType=Write LockScope=Exclusive
Addlocks=<http://webdav.sb.aol.com/workspace/><http://foo.bar/blah>
Timeout: Infinite, Second-4100000000 Timeout: Infinite, Second-4100000000
Lock-Token: <opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
Authorization: Digest username="ejw",
realm="ejw@webdav.sb.aol.com", nonce="...",
uri="/workspace/webdav/proposal.doc",
response="...", opaque="..."
<?XML version="1.0"> >>Response
<?namespace href="http://www.ietf.org/standards/dav/" AS = "D"?>
<D:href>http://www.ics.uci.edu/~ejw/contact.html<D:href>
HTTP/1.1 409 Conflict HTTP/1.1 200 OK
Lock-Token: <opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
Timeout: Second-604800
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" As = "D"?> <?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<D:multistatus> <D:prop>
<D:response> <D:lockdiscovery>
<D:href> <D:activelock>
http://webdav.sb.aol.com/workspace/webdav/proposal.doc <D:locktype><D:write/></D:locktype>
</D:href> <D:lockscope><D:exclusive/></D:lockscope>
<D:owner>
<D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
</D:owner>
<D:timeout>Second-604800</D:timeout>
<D:locktoken>
<D:href> <D:href>
http://webdav.sb.aol.com/workspace/webdav/ opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4
</D:href> </D:href>
<D:status>HTTP/1.1 202 Accepted</D:status> </D:locktoken>
</D:activelock>
</D:lockdiscovery>
</D:prop>
This request would refresh the lock, resetting any time outs.
Notice that the client asked for an infinite time out but the server
choose to ignore the request. In this example, the nonce, response,
and opaque fields have not been calculated in the Authorization
request header.
7.12.11 Example - Multi-Resource Lock Request
>>Request
LOCK /webdav/ HTTP/1.1
Host: webdav.sb.aol.com
Timeout: Infinite, Second-4100000000
Depth: infinity
Authorization: Digest username="ejw",
realm="ejw@webdav.sb.aol.com", nonce="...",
uri="/workspace/webdav/proposal.doc",
response="...", opaque="..."
<?xml version="1.0"?>
<?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<D:lockinfo>
<D:locktype><D:write/></D:locktype>
<D:lockscope><D:exclusive/></D:lockscope>
<D:owner>
<D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
</D:owner>
</D:lockinfo>
>>Response
HTTP/1.1 207 Multistatus
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0"?>
<?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<D:multistatus>
<D:response>
<D:href>http://webdav.sb.aol.com/webdav/proposal.doc</D:href>
<D:href>http://webdav.sb.aol.com/webdav/</D:href>
<D:status>HTTP/1.1 424 Method Failure</D:status>
</D:response> </D:response>
<D:response> <D:response>
<D:href>http://foo.bar/blah</D:href> <D:href>http://webdav.sb.aol.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:multistatus> </D:multistatus>
This example shows a request for an exclusive write lock on three This example shows a request for an exclusive write lock on a
resources, http://webdav.sb.aol.com/workspace/webdav/proposal.doc, collection and all its children. In this request, the client has
http://webdav.sb.aol.com/workspace/, and http://foo.bar/blah. In specified that it desires an infinite length lock, if available,
this request, the client has specified that it desires an infinite otherwise a timeout of 4.1 billion seconds, if available. The
length lock, if available, otherwise a timeout of 4.1 billion request entity body contains the contact information for the
seconds, if available. The Owner header field specifies the web principal taking out the lock, in this case a web page URL.
address for contact information for the principal taking out the
lock.
This lock request has failed, because the server rejected the lock The 424 Method Failure indicates that a lock was not taken out on
request for http://foo.bar/blah. The 409 Conflict status code these resources due to an error elsewhere. Note that this does not
indicates that the server was unable to satisfy the request because mean that a lock would have succeeded on these resources had the
there is a conflict between the state of the resources and the other error not occurred. It only means that another error has
operation named in the request. Within the multistatus, the 202 occurred and so the entire method has been aborted. The error is a
Accepted status code indicates that the lock method was accepted by 403 Forbidden response on the resource
the resources, and would have been completed if all resources named http://webdav.sb.aol.com/webdav/secret. Because this resource could
in the request were able to be locked. The 403 Forbidden status not be locked, none of the resources were locked.
code indicates that the server does not allow lock requests on this
resource. In this example, the nonce, response, and opaque fields have not
been calculated in the Authorization request header.
7.13 UNLOCK Method
8.14. 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 header from the Request-URI, and all other resources the Lock-Token header from the Request-URI, and all other resources
included in the lock. included in the lock.
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.14.1. Example 7.13.1 Example
>>Request
UNLOCK /workspace/webdav/info.doc HTTP/1.1 UNLOCK /workspace/webdav/info.doc HTTP/1.1
Host: webdav.sb.aol.com Host: webdav.sb.aol.com
Lock-Token:opaquelocktoken:123AbcEfg1284h23h2 Lock-Token:<opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
Authorization: Digest username="ejw",
realm="ejw@webdav.sb.aol.com", nonce="...",
uri="/workspace/webdav/proposal.doc",
response="...", opaque="..."
HTTP/1.1 200 OK >>Response
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:123AbcEfg1284h23h2" is successfully removed from "opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7" is
the resource http://webdav.sb.aol.com/workspace/webdav/info.doc. If successfully removed from the resource
this lock included more than just one resource, the lock was removed http://webdav.sb.aol.com/workspace/webdav/info.doc. If this lock
from those resources as well. included more than just one resource, the lock is removed from all
resources included in the lock. The 204 status code is used instead
8.15. PATCH Method of 200 OK because there is no response entity body.
The PATCH method is used to modify parts of the entity returned in
the response to a GET method. DAV compliant resources MAY support
the PATCH method.
8.15.1. The Request
The request entity of the PATCH method contains a list of
differences between the resource identified by the Request-URI and
the desired content of the resource after the PATCH action has been
applied. The list of differences is in a format defined by the
media type of the entity (e.g., "application/diff") and must include
sufficient information to allow the server to convert the original
version of the resource to the desired version. Processing
performed by PATCH is atomic. Hence all changes MUST be
successfully executed or the method fails. PATCH MUST fail if
executed on a non-existent resource; i.e., PATCH does not create a
resource as a side effect.
If the request appears (at least initially) to be acceptable, the
server MUST transmit an interim 100 response message after receiving
the empty line terminating the request headers and continue
processing the request. Since the semantics of PATCH are non-
idempotent, responses to this method are not cacheable.
While server support for PATCH is optional, if a server does support
PATCH, it MUST support at least the text/xml diff format defined
below. Support for the VTML difference format [VTML] is
recommended, but not required.
8.15.2. text/xml elements for PATCH
The resourceupdate XML element contains a set of XML sub-entities
that describe modification operations. The name and meaning of
these XML elements are given below. Processing of these directives
MUST be performed in the order encountered within the XML document.
A directive operates on the resource as modified by all previous
directives (executed in sequential order). The length of the
resource MAY be extended or reduced by a PATCH.
The changes specified by the resourceupdate XML element MUST be
executed atomically.
8.15.2.1. resourceupdate XML Element
Name: resourceupdate
Namespace: http://www.ietf.org/standards/dav/patch/
Purpose: Contains an ordered set of changes to a non-collection,
non-property resource.
Parent: None
Value= *(insert | delete | replace)
8.15.2.2. insert XML Element
Name: insert
Namespace: http://www.ietf.org/standards/dav/patch/
Purpose: Insert the XML element's contents starting at the
specified octet.
Parent: resourceupdate
Value: The insert XML element MUST contain an octet-range XML
attribute that specifies an octet position within the body of a
resource. A value of _end_ specifies the end of the resource. The
body of the insert XML element contains the octets to be inserted.
Please note that in order to protect the white space contained in
this XML element the following attribute/value MUST be included in
the element: XML-SPACE = "PRESERVE". This attribute is defined in
the XML specification [Bray, Sperberg-McQueen, 1997].
8.15.2.3. delete XML Element
Name: delete
Namespace: http://www.ietf.org/standards/dav/patch/
Purpose: Removes the specified range of octets.
Parent: resourceupdate
Value: The delete XML element MUST contain an octet-range XML
attribute.
Discussion: The octets that are deleted are removed, which means the
resource is collapsed and the length of the resource is decremented
by the size of the octet range. It is not appropriate to replace
deleted octets with zeroed-out octets, since zero is a valid octet
value.
8.15.2.4. replace XML Element
Name: replace
Namespace: http://www.ietf.org/standards/dav/patch/
Purpose: Replaces the specified range of octets with the contents
of the XML element. If the number of octets in the XML element is
different from the number of octets specified, the update MUST be
rejected.
Parent: resourceupdate
Value: The replace XML element MUST contain an octet-range XML
attribute. The contents of the entity are the replacement octets.
Please note that in order to protect the white space contained in
this XML element the following attribute/value MUST be included in
the element: XML-SPACE = "PRESERVE"
.
This attribute is defined in the
XML specification [Bray, Sperberg-McQueen, 1997].
8.15.2.5. octet-range Attribute
Name: octet-range
Namespace: http://www.ietf.org/standards/dav/patch/
Purpose: Specifies a range of octets that the enclosing property
affects.
Parent: insert | delete | replace
Value: number [_-_ (number | _end_)]
Number = 1*Digit
Description: Octet numbering begins with 0. If the octet contains a
single number then the operation is to begin at that octet and to
continue for a length specified by the operation. In the case of a
delete, this would mean to delete a single octet. In the case of an
insert this would mean to begin the insertion at the specified octet
and to continue for the length of the included value, extending the
resource if necessary. In the case of replace, the replace begins
at the specified octet and overwrites all that follow to the length
of the included value.
8.15.3. Response Codes
200 OK - The request entity body was processed without error,
resulting in an update to the state of the resource.
409 Conflict - If the update information in the request message body
does not make sense given the current state of the resource (e.g.,
an instruction to delete a non-existent line), this status code MAY
be returned.
415 Unsupported Media Type - The server does not support the content
type of the update instructions in the request message body.
418 Unprocessable Entity - The entity body submitted with the PATCH
was not understood by the resource.
419 Insufficient Space on Resource - The resource does not have
sufficient space to record the state of the resource after the
execution of this method.
8.15.4. HTML file modification Example
The following example shows a modification of the title and contents
of the HTML resource http://www.example.org/hello.html.
Before:
<HTML>
<HEAD>
<TITLE>Hello world HTML page</TITLE>
</HEAD>
<BODY>
<P>Hello, world!</P>
</BODY>
</HTML>
PATCH Request: Response:
PATCH hello.html HTTP/1.1
Host: www.example.org
Content-Type: text/xml
Content-Length: xxx
HTTP/1.1 100 Continue
<?XML version="1.0">
<?namespace href = _http://www.ietf.org/standards/dav/patch/_ AS =
_D_?>
<D:resourceupdate>
<D:replace XML-SPACE = "PRESERVE">
<D:octet-range>14</D:octet-range>&003CTITLE&003ENew
Title&003C/TITLE&003E</D:replace>
<D:delete><D:octet-range>38-50</D:octet-range></D:delete>
<D:insert XML-SPACE = "PRESERVE"><D:octet-range>86</D:octet-
range>&003CP&003ENew paragraph&003C/P&003E</D:insert>
</D:resourceupdate>
HTTP/1.1 200 OK
After: In this example, the nonce, response, and opaque fields have not
<HTML> been calculated in the Authorization request header.
<HEAD>
<TITLE>New Title</TITLE>
</HEAD>
<BODY>
<P>Hello, world!</P>
<P>New paragraph</P>
</BODY>
</HTML>
9. HTTP Headers for Distributed Authoring 8 HTTP Headers for Distributed Authoring
9.1. Collection-Member Header 8.1 Collection-Member Header
CollectionMember = "Collection-Member" ":" URI ; URI is defined in CollectionMember = "Collection-Member" ":" absoluteURI ;
section 3.2.1 of [Fielding et al., 1997] absoluteURI is defined in section 3.2.1 of [Fielding et al., 1997]
The Collection-Member header specifies the URI of an external The Collection-Member header specifies the URI of an external
resource to be added/deleted to/from a collection. resource to be added/deleted to/from a collection.
9.2. DAV Header 8.2 DAV Header
DAV = "DAV" ":" ("1" | "2" | extend) DAV = "DAV" ":" ["1"] [",2"] ["," 1#extend]
This header indicates that the resource supports the DAV schema and This header indicates that the resource supports the DAV schema and
protocol to the level indicated. All DAV compliant resources MUST protocol as specified. All DAV compliant resources MUST return the
return the DAV header on all OPTIONS responses. DAV header on all OPTIONS responses.
9.3. Depth Header The value is a list of all compliance classes that the resource
supports. Note that above a comma has already been added to the 2.
This is because a resource can not be level 2 compliant unless it is
also level 1 compliant. Please refer to Section 13 for more details.
In general, however, support for one compliance class does not
entail support for any other.
8.3 Depth Header
Depth = "Depth" ":" ("0" | "1" | "infinity") Depth = "Depth" ":" ("0" | "1" | "infinity")
The Depth header is used with methods executed on collections to The Depth header is used with methods executed on resources which
indicate whether the method is to be applied only to the collection could potentially have internal members to indicate whether the
(Depth = 0), to the collection and its immediate children, (Depth = method is to be applied only to the resource (Depth = 0), to the
1), or the collection and all its progeny (Depth = infinity). Note resource and its immediate children, (Depth = 1), or the resource
that Depth = 1 and Depth = infinity behavior only applies to and all its progeny (Depth = infinity).
internal member resources, and not to external member resources.
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
behavior of the method on a collection if a depth header is not behavior of the method if a Depth header is not present. For
present. For example, the MOVE method only supports Depth = infinity example, the MOVE method only supports Depth = infinity and if a
and if a depth header is not present will act as if a Depth = Depth header is not present will act as if a Depth = infinity header
infinity header had been applied. had been applied.
Clients MUST NOT rely upon methods executing on members of their Clients MUST NOT rely upon methods executing on members of their
hierarchies in any particular order or the execution being atomic. hierarchies in any particular order or on the execution being
Note that methods MAY provide guarantees on ordering and atomicity. atomic. Note that methods MAY provide guarantees on ordering and
atomicity.
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 So, for example, an attempt to COPY a hierarchy may result in some
of the members being copied and some not. of the members being copied and some not.
Any headers on a method with a depth header MUST be applied to all Any headers on a method with a Depth header MUST be applied to all
resources in the scope of the method. For example, an if-match resources in the scope of the method. For example, an If-Match
header will have its value applied against every resource in the header will have its value applied against every resource in the
method's scope and will cause the method to fail if the header fails method's scope and will cause the method to fail if the header fails
to match. 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
is locked in such a way as to prevent the successful execution of is locked in such a way as to prevent the successful execution of
the method, then the lock token for that resource MUST be submitted the method, then the lock token for that resource MUST be submitted
with the request in the Lock-Token request header. with the request in the Lock-Token request header.
9.4. Destination Header The Depth header only specifies the behavior of the method with
regards to internal children. If a resource does not have internal
children then the Depth header is ignored.
Please note, however, that it is always an error to submit a value
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, MUST 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.
8.4 Destination Header
Destination = "Destination" ":" URI Destination = "Destination" ":" URI
The Destination header specifies a destination resource for methods The Destination header specifies a destination resource for methods
such as COPY and MOVE, which take two URIs as parameters. such as COPY and MOVE, which take two URIs as parameters.
9.5. Destroy Header 8.5 If-None-State-Match
DestroyHeader = "Destroy" ":" #Choices
Choices = "VersionDestroy" | "NoUndelete" | "Undelete" | extend
Extend = RFC-Reg | Coded-URL
RFC-Req = Token ; This is a token value (defined in section 2.2 of
[Fielding et al., 1997]) that has been published as an RFC.
Coded-URL = "<" URI ">"
When deleting a resource the client often wishes to specify exactly
what sort of delete should be performed. The Destroy header, used
with the Mandatory header, allows the client to specify the end
result it desires. The Destroy header is specified as follows:
The Undelete token requests that, if possible, the resource should
be left in a state such that it can be undeleted. The server is not
required to honor this request.
The NoUndelete token requests that the resource MUST NOT be left in
a state such that it can be undeleted.
The VersionDestroy token includes the functionality of the
NoUndelete token and extends it to include having the server remove
all versioning references to the resource that it has control over.
9.6. Enforce-Live-Properties Header
EnforceLiveProperties = "Enforce-Live-Properties_ _:" (_*_ | "Omit"
| 1*(Property-Name))
Property-Name = Coded-URL
The Enforce-Live-Properties header specifies properties that MUST be
_live_ after they are copied (moved) to the destination resource of
a copy (or move). If the value _*_ is given for the header, then it
designates all live properties on the source resource. If the value
is "Omit" then the server MUST NOT duplicate on the destination
resource any properties that are defined on the source resource. If
this header is not included then the server is expected to act as
defined by the default property handling behavior of the associated
method.
9.7. If-None-State-Match
If-None-State-Match = "If-None-State-Match" ":" 1#Coded-URL If-None-State-Match = "If-None-State-Match" ":" 1#Coded-URL
Coded-URL = "<" URI ">"
The If-None-State-Match header is intended to have similar The If-None-State-Match header is intended to have similar
functionality to the If-None-Match header defined in section 14.26 functionality to the If-None-Match header defined in section 14.26
of RFC 2068. However the if-none-state-match header is intended for of [Fielding et al., 1997]. However the If-None-State-Match header
use with any URI which represents state information about a is intended for use with any URI which represents state information
resource, referred to as a state token. A typical example is a lock about a resource, referred to as a state token. A typical example
token. is a lock token.
If any of the state tokens identifies the current state of the If any of the state tokens identifies the current state of the
resource, the server MUST NOT perform the requested method. resource, the server MUST NOT perform the requested method.
Instead, if the request method was GET, HEAD, INDEX, or PROPFIND, Instead, if the request method was GET, HEAD, or PROPFIND, the
the server SHOULD respond with a 304 Not Modified response, server SHOULD respond with a 304 Not Modified response, including
including the cache-related entity-header fields (particularly ETag) the cache-related entity-header fields (particularly ETag) of the
of the current state of the resource. For all other request current state of the resource. For all other request methods, the
methods, the server MUST respond with a status of 412 Precondition server MUST respond with a status of 412 Precondition Failed.
Failed.
If none of the state tokens identifies the current state of the If none of the state tokens identifies the current state of the
resource, the server MAY perform the requested method. resource, the server MAY perform the requested method.
If any of the tokens is not recognized then the method MUST fail If any of the tokens is not recognized, the method MUST fail with a
with a 412 Precondition Failed. 412 Precondition Failed.
Note that the "AND" and "OR" keywords specified with the If-State- Note that the "AND" and "OR" keywords specified with the If-State-
Match header are intentionally not defined for If-None-State-Match, Match header are intentionally not defined for If-None-State-Match,
because this functionality is not required. because this functionality is not required.
9.8. If-State-Match 8.6 If-State-Match
If-State-Match = "If-State-Match" ":" ("AND" | "OR") 1#Coded-URL If-State-Match = "If-State-Match" ":" ("AND" | "OR") 1#Coded-URL
The If-State-Match header is intended to have similar functionality The If-State-Match header is intended to have similar functionality
to the If-Match header defined in section 14.25 of RFC 2068. to the If-Match header defined in section 14.25 of [Fielding et al.,
However the If-State-Match header is intended for use with any URI 1997]. However the If-State-Match header is intended for use with
which represents state information about a resource. A typical any URI which represents state information about a resource. A
example is a lock token. typical example is a lock token.
If the AND keyword is used and all of the state tokens identify the If the AND keyword is used and all of the state tokens identify the
state of the resource, then the server MAY perform the requested state of the resource, then the server MAY perform the requested
method. If the OR keyword is used and any of the state tokens method. If the OR keyword is used and any of the state tokens
identifies the current state of the resource, then the server MAY identifies the current state of the resource, then the server MAY
perform the requested method. If the keyword requirement for the perform the requested method. If the keyword requirement for the
the keyword used is not met, the server MUST NOT perform the keyword used is not met, the server MUST NOT perform the requested
requested method, and MUST return a 412 Precondition Failed method, and MUST return a 412 Precondition Failed response.
response.
If any of the tokens is not recognized then the method MUST fail
with a 412 Precondition Failed.
9.9. Lock-Info Request Header
LockInfo = "Lock-Info" ":" DAVLockType SP DAVLockScope [SP
AdditionalLocks] [SP Lock-Tree]
DAVLockType = "LockType" "=" DAVLockTypeValue
DAVLockTypeValue = ("Write" | Extend)
DAVLockScope = "LockScope" "=" DAVLockScopeValue
DAVLockScopeValue = ("Exclusive" |"Shared" | Extend)
AdditionalLocks = "AddLocks" "=" 1*("<" URI ">")
Lock-Tree = "Lock-Tree" "=" ("T" | "F")
The Lock-Info request header specifies the scope and type of a lock
for a LOCK method request. The syntax specification below is
extensible, allowing new type and scope identifiers to be added.
The LockType field specifies the access type of the lock. At
present, this specification only defines one lock type, the "Write"
lock. The LockScope field specifies whether the lock is an
exclusive lock, or a shared lock. The AddLocks field specifies
additional URIs, beyond the Request-URI, to which the lock request
applies. The LockTree field is used to specify recursive locks. If
the LockTree field is "T", the lock request applies to the hierarchy
traversal of the internal member resources of the Request-URI, and
the AddLocks URIs, inclusive of the Request-URI and the AddLocks
URIs. It is not an error if LockTree is "T", and the Request-URI or
the AddLocks URIs have no internal member resources. By default,
the value of LockTree is "F", and this field MAY be omitted when its
value is "F".
9.10. Lock-Token Request Header If any of the tokens is not recognized, the method MUST fail with a
412 Precondition Failed.
8.7 Lock-Token Request Header
Lock-Token = "Lock-Token" ":" 1#Coded-URL Lock-Token = "Lock-Token" ":" 1#Coded-URL
The Lock-Token request header, containing a lock token owned by the The Lock-Token request header, containing a lock token owned by the
requesting principal, is used by the principal to indicate that the requesting principal, is used by the principal to indicate that the
principal is aware of the existence of the lock specified by the principal is aware of the existence of the lock specified by the
lock token. lock token.
If the following conditions are met: If the following conditions are met:
1) The method is restricted by a lock type that requires the 1) The method is restricted by a lock type that requires the
submission of a lock token, such as a write lock, submission of a lock token, such as a write lock,
2) The user-agent has authenticated itself as a principal, 2) The user-agent has authenticated itself as a given principal,
3) The user-agent is submitting a method request to a resource on 3) The user-agent is submitting a method request to a resource on
which the principal owns a write lock, which the principal owns a write lock,
Then: Then:
1) The method request MUST include a Lock-Token header with the lock 1) The method request MUST include a Lock-Token header with the lock
token, or, token, or,
2) The method MUST fail with a 409 Conflict status code. 2) The method MUST fail with a 409 Conflict status code.
If multiple resources are involved with a method, such as a COPY or If multiple resources are involved with a method, such as the MOVE
MOVE method, then the lock tokens, if any, for all involved method, then the lock tokens, if any, for all affected resources,
resources, MUST be included in the Lock-Token request header. MUST be included in the Lock-Token request header.
For example, Program A, used by user A, takes out a write lock on a For example, Program A, used by user A, takes out a write lock on a
resource. Program A then makes a number of PUT requests on the resource. Program A then makes a number of PUT requests on the
locked resource. All the requests contain a Lock-Token request locked resource. All the requests contain a Lock-Token request
header that includes the write lock state token. Program B, also header that includes the write lock token. Program B, also run by
run by User A, then proceeds to perform a PUT to the locked User A, then proceeds to perform a PUT to the locked resource.
resource. However, program B was not aware of the existence of the However, program B was not aware of the existence of the lock and so
lock and so does not include the appropriate Lock-Token request does not include the appropriate Lock-Token request header. The
header. The method is rejected even though principal A is method is rejected even though principal A is authorized to perform
authorized to perform the PUT. Program B can, if it so chooses, now the PUT. Program B can, if it so chooses, now perform lock
perform lock discovery and obtain the lock token. Note that discovery and obtain the lock token. Note that programs A and B can
programs A and B can perform GETs without using the Lock-Token perform GETs without using the Lock-Token header because the ability
header because the ability to perform a GET is not affected by a to perform a GET is not affected by a write lock.
write lock.
Having a lock token provides no special access rights. Anyone can Having a lock token provides no special access rights. Anyone can
find out anyone else's lock token by performing lock discovery. find out anyone else's lock token by performing lock discovery.
Locks are to be enforced based upon whatever authentication Locks are to be enforced based upon whatever authentication
mechanism is used by the server, not based on the secrecy of the mechanism is used by the server, not based on the secrecy of the
token values. token values.
9.11. Lock-Token Response Header 8.8 Lock-Token Response Header
Lock-Token = "Lock-Token" ":" Coded-URL
Lock-Token = "Lock-Token" ":" 1#Coded-URL
If a resource is successfully locked then a Lock-Token header will If a resource is successfully locked then a Lock-Token header will
be returned containing the lock token that represents the lock. be returned containing the lock token that represents the lock.
9.12. Overwrite Header If multiple lock-tokens are returned then they MUST all refer to the
same lock. As the lock tokens all refer to the same lock a client
need only record one of them.
8.9 Overwrite Header
Overwrite = "Overwrite" ":" ("T" | "F") Overwrite = "Overwrite" ":" ("T" | "F")
The Overwrite header specifies whether the server should overwrite The Overwrite header specifies whether the server should overwrite
the state of a non-null destination resource during a COPY or MOVE. the state of a non-null destination resource during a COPY or MOVE.
A value of _F_ states that the server MUST NOT perform the COPY or A value of "F" states that the server MUST NOT perform the COPY or
MOVE operation if the state of the destination resource is non-null. MOVE operation if the state of the destination resource is non-null.
By default, the value of Overwrite is _T,_ and a client MAY omit By default, the value of Overwrite is "T" and a client MAY omit this
this header from a request when its value is _T._ While the header from a request when its value is "T". While the Overwrite
Overwrite header appears to duplicate the functionality of the If- header appears to duplicate the functionality of the If-Match: *
Match: * header of HTTP/1.1, If-Match applies only to the Request- header of HTTP/1.1, If-Match applies only to the Request-URI, and
URI, and not to the Destination of a COPY or MOVE. not to the Destination 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 409 Conflict status code. header, the method MUST fail with a 409 Conflict status code.
9.13. Propfind Request Header 8.10 Status-URI Response Header
Propfind = "Propfind" ":" ("allprop" | "propname" | RFC-Reg |
1*(Property-Name))
The Propfind header is used to specify which properties are to be
returned in a PROPFIND method. The properties are identified by
their URIs. Two special tokens are defined for use with the
Propfind header, allprop and propname. The allprop token specifies
that all property names and values on the resource are to be
returned. The propname token specifies that only a list of property
names on the resource are to be returned.
9.14. Status-URI Response Header
The Status-URI response header MAY be used with the 102 Processing The Status-URI response header MAY be used with the 102 Processing
response code to inform the client as to the status of a method. status code to inform the client as to the status of a method.
Status-URI = "Status-URI" ":" *(Status-Code "<" URI ">") ; Status- Status-URI = "Status-URI" ":" *(Status-Code "<" URI ">") ; Status-
Code is defined in 6.1.1 of [Fielding et al., 1997] Code is defined in 6.1.1 of [Fielding et al., 1997]
The URIs listed in the header are source resources which have been The URIs listed in the header are source resources which have been
affected by the outstanding method. The status code indicates the affected by the outstanding method. The status code indicates the
resolution of the method on the identified resource. So, for resolution of the method on the identified resource. So, for
example, if a MOVE method on a collection is outstanding and a 102 example, if a MOVE method on a collection is outstanding and a 102
"Processing" response with a Status-URI response header is returned, "Processing" response with a Status-URI response header is returned,
the included URIs will indicate resources that have had move the included URIs will indicate resources that have had move
attempted on them and what the result was. attempted on them and what the result was.
9.15. Timeout Header 8.11 Timeout Header
TimeOut = "Timeout" ":" 1#TimeType TimeOut = "Timeout" ":" 1#TimeType
TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other) TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other)
DAVTimeOutVal = 1*digit DAVTimeOutVal = 1*digit
Other = Extend field-value ; See section 4.2 of RFC 2068 Other = Extend field-value ; See section 4.2 of [Fielding et al.,
1997]
Clients MAY include Timeout headers in their LOCK requests. Clients MAY include Timeout headers in their LOCK requests.
However, the server is not required to honor or even consider these However, the server is not required to honor or even consider these
requests. Clients MUST NOT submit a Timeout request header with any requests. Clients MUST NOT submit a Timeout request header with any
method other than a LOCK method. method other than a LOCK method.
A Timeout request header MUST contain at least one TimeType and MAY A Timeout request header MUST contain at least one TimeType and MAY
contain multiple TimeType entries. The purpose of listing multiple contain multiple TimeType entries. The purpose of listing multiple
TimeType entries is to indicate multiple different values and value TimeType entries is to indicate multiple different values and value
types that are acceptable to the client. The client lists the types that are acceptable to the client. The client lists the
TimeType entries in order of preference. TimeType entries in order of preference.
The Timeout response header MUST use a Second value, Infinite, or a The Timeout response header MUST use a Second value, Infinite, or a
TimeType the client has indicated familiarity with. The server MAY TimeType the client has indicated familiarity with. The server MAY
assume a client is familiar with any TimeType submitted in a Timeout assume a client is familiar with any TimeType submitted in a Timeout
header. header.
The _Second_ TimeType specifies the number of seconds that MUST The "Second" TimeType specifies the number of seconds that MUST
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. A server MUST not generate a timeout value for removal of the lock. A server MUST not generate a timeout value for
_Second_ greater than 2^32-1. "Second" greater than 2^32-1.
The timeout counter is restarted any time an owner of the lock sends The timeout counter SHOULD be restarted any time an owner of the
a method to any member of the lock, including unsupported methods, lock sends a method to any member of the lock, including unsupported
or methods which are unsuccessful. It is recommended that the HEAD methods, or methods which are unsuccessful. However the lock MUST
method be used when the goal is simply to restart the timeout be refreshed if a refresh LOCK method is successfully received.
counter.
If the timeout expires then the lock is lost. Specifically the If the timeout expires then the lock is lost. Specifically the
server SHOULD act as if an UNLOCK method was executed by the server 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, on the resource using the lock token of the timed-out lock,
performed with its override authority. Thus logs should be updated performed with its override authority. Thus logs should be updated
with the disposition of the lock, notifications should be sent, with the disposition of the lock, notifications should be sent,
etc., just as they would be for an UNLOCK request. etc., just as they would be for an UNLOCK request.
Servers are advised to pay close attention to the values submitted Servers are advised to pay close attention to the values submitted
by clients, as they will be indicative of the type of activity the by clients, as they will be indicative of the type of activity the
client intends to perform. For example, an applet running in a client intends to perform. For example, an applet running in a
browser may need to lock a resource, but because of the instability browser may need to lock a resource, but because of the instability
of the environment within which the applet is running, the applet of the environment within which the applet is running, the applet
may be turned off without warning. As a result, the applet is 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 likely to ask for a relatively small timeout value so that if the
applet dies, the lock can be quickly harvested. However, a document applet dies, the lock can be quickly harvested. However, a document
management system is likely to ask for an extremely long timeout management system is likely to ask for an extremely long timeout
because its user may be planning on going off-line. because its user may be planning on going off-line.
10. Response Code Extensions to HTTP/1.1 9 Status Code Extensions to HTTP/1.1
The following response codes are added to those defined in HTTP/1.1 The following status codes are added to those defined in HTTP/1.1
[Fielding et al., 1997]. [Fielding et al., 1997].
10.1. 102 Processing 9.1 102 Processing
Methods can potentially take a long period of time to process, Methods can potentially take a long period of time to process,
especially methods that support the Depth header. In such cases the especially methods that support the Depth header. In such cases the
client may time-out the connection while waiting for a response. To client may time-out the connection while waiting for a response. To
prevent this the server MAY return a 102 response code to indicate prevent this the server MAY return a 102 status code to indicate to
to the client that the server is still processing the method. the client that the server is still processing the method.
If a method is taking longer than 20 seconds (a reasonable, but If a method is taking longer than 20 seconds (a reasonable, but
arbitrary value) to process the server SHOULD return a 102 arbitrary value) to process the server SHOULD return a 102
"Processing" response. "Processing" response.
10.2. 207 Multi-Status 9.2 207 Multi-Status
The response requires providing status for multiple independent The response provides status for multiple independent operations.
operations.
10.3. 418 Unprocessable Entity 9.3 422 Unprocessable Entity
The server understands the content type of the request entity, but The server understands the content type of the request entity, but
was unable to process the contained instructions. was unable to process the contained instructions.
10.4. 419 Insufficient Space on Resource 9.4 423 Insufficient Space on Resource
The resource does not have sufficient space to record the state of The resource does not have sufficient space to record the state of
the resource after the execution of this method. the resource after the execution of this method.
10.5. 420 Method Failure 9.5 424 Method Failure
The method was not executed on a particular resource within its The method was not executed on a particular resource within its
scope because some part of the method's execution failed causing the scope because some part of the method's execution failed causing the
entire method to be aborted. For example, if a resource could not entire method to be aborted. For example, if a resource could not
be moved as part of a MOVE method, all the other resources would be moved as part of a MOVE method, all the other resources would
fail with a 420 Method Failure. fail with a 424 Method Failure.
10.6. 421 Destination Locked 9.6 425 Locked
The destination resource of a method is locked, and either the The source or destination resource of a method is locked, and either
request did not contain a valid Lock-Info header, or the Lock-Info the request did not contain a valid Lock-Token header, or the lock
header identifies a lock held by another principal. token in the Lock-Token header identifies a lock held by another
principal.
11. Multi-Status Response 10 Multi-Status Response
The default 207 Multi-Status response body is a text/xml HTTP entity The default 207 Multi-Status response body is a text/xml HTTP entity
that contains a single XML element called multistatus, which that contains a single XML element called multistatus, which
contains a set of XML elements called response, one for each 200, contains a set of XML elements called response, one for each 200,
300, 400, and 500 series status code generated during the method 300, 400, and 500 series status code generated during the method
invocation. 100 series status codes MUST NOT be recorded in a invocation. 100 series status codes MUST NOT be recorded in a
response XML element. response XML element.
11.1. multistatus XML Element 11 XML Element Definitions
In the section below, the final line of each section gives the
element type declaration using the format defined in [Bray, Paoli,
Sperberg-McQueen, 1998]. The "Value" field, where present, specifies
futher restrictions on the allowable contents of the XML element
using BNF (i.e., to further restrict the values of a PCDATA
element).
11.1 activelock XML Element
Name: activelock
Namespace: http://www.iana.org/standards/dav/
Purpose: Describes a lock on a resource.
<!ELEMENT activelock (locktype, lockscope, depth?, owner, timeout,
locktoken) >
11.1.1 depth XML Element
Name: depth
Namespace: http://www.iana.org/standards/dav/
Purpose: The value of the depth header used to create a lock.
Description: If this element is not included in a lockinfo element
then the client MUST assume that the lock is of depth 0.
Value: "0" | "infinity"
<!ELEMENT depth (#PCDATA) >
11.1.2 locktoken XML Element
Name: locktoken
Namespace: http://www.iana.org/standards/dav/
Purpose: The lock token associated with a lock.
Description: The href contains an opaque lock token URI (i.e., the
OpaqueLockToken-URI production in Section 4.4).
<!ELEMENT locktoken (href) >
11.1.3 timeout XML Element
Name: timeout
Namespace: http://www.iana.org/standards/dav/
Purpose: The timeout associated with a lock
Value: TimeType
<!ELEMENT timeout (#PCDATA) >
11.2 collection XML Element
Name: collection
Namespace: http://www.iana.org/standards/dav/
Purpose: Identifies the associated resource as a collection. The
resourcetype property of a collection resource MUST have this value.
<!ELEMENT collection EMPTY >
11.3 href XML Element
Name: href
Namespace: http://www.iana.org/standards/dav/
Purpose: Identifies the content of the element as a URI.
Value: URI ; See section 3.2.1 of [Fielding et al., 1997]
<!ELEMENT href (#PCDATA)>
11.4 link XML Element
Name: link
Namespace: http://www.iana.org/standards/dav/
Purpose: Identifies the property as a link and contains the
source and destination of that link.
Description: The link XML element is used to provide the sources and
destinations of a link. The name of the property containing the
link XML element provides the type of the link. Link is a multi-
valued element, so multiple links may be used together to indicate
multiple links with the same type.
<!ELEMENT link (src+, dst+) >
11.4.1 dst XML Element
Name: dst
Namespace: http://www.iana.org/standards/dav/
Purpose: Indicates the destination of a link
Value: URI
<!ELEMENT dst (#PCDATA) >
11.4.2 src XML Element
Name: src
Namespace: http://www.iana.org/standards/dav/
Purpose: Indicates the source of a link.
Value: URI
<!ELEMENT src (#PCDATA) >
11.5 lockentry XML Element
Name: lockentry
Namespace: http://www.iana.org/standards/dav/
Purpose: Defines the types of locks that can be used with the
resource.
<!ELEMENT lockentry (lockscope, locktype) >
11.6 lockinfo XML Element
Name: lockinfo
Namespace: http://www.iana.org/standards/dav/
Purpose: The lockinfo XML element is used with a LOCK method to
specify the type of lock the client wishes to have created.
<!ELEMENT lockinfo (lockscope, locktype, owner?) >
11.7 lockscope XML Element
Name: lockscope
Namespace: http://www.iana.org/standards/dav/
Purpose: Specifies whether a lock is an exclusive lock, or a
shared lock.
<!ELEMENT lockscope (exclusive | shared) >
11.7.1 exclusive XML Element
Name: exclusive
Namespace: http://www.iana.org/standards/dav/
Purpose: Specifies an exclusive lock
<!ELEMENT exclusive EMPTY >
11.7.2 shared XML Element
Name: shared
Namespace: http://www.iana.org/standards/dav/
Purpose: Specifies a shared lock
<!ELEMENT shared EMPTY >
11.8 locktype XML Element
Name: locktype
Namespace: http://www.iana.org/standards/dav/
Purpose: Specifies the access type of a lock. At present, this
specification only defines one lock type, the write lock.
<!ELEMENT locktype (write) >
11.8.1 write XML Element
Name: write
Namespace: http://www.iana.org/standards/dav/
Purpose: Specifies a write lock.
<!ELEMENT write EMPTY >
11.9 multistatus XML Element
Name: multistatus Name: multistatus
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: Contains multiple response messages. Purpose: Contains multiple response messages.
Parent: Any
Value: 1*response [responsedescription]
Description: The responsedescription at the top level is used to Description: The responsedescription at the top level is used to
provide a general message describing the overarching nature of the provide a general message describing the overarching nature of the
response. If this value is available an application MAY use it response. If this value is available an application MAY use it
instead of presenting the individual response descriptions contained instead of presenting the individual response descriptions contained
within the responses. within the responses.
11.2. response XML Element <!ELEMENT multistatus (response+, responsedescription?) >
11.9.1 response XML Element
Name: response Name: response
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: Holds a single response Purpose: Holds a single response describing the effect of a
Parent: multistatus method on resource and/or its properties.
Value: href [prop] status [responsedescription] Description: A particular href 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.
<!ELEMENT response (href, ((href*, status)|(propstat+)),
responsedescription?) >
11.9.1.1 propstat XML Element
Name: propstat
Namespace: http://www.iana.org/standards/dav/
Purpose: Groups together a prop and status element that is
associated with a particular href element.
Description: Prop MUST contain one or more empty XML elements Description: Prop MUST contain one or more empty XML elements
representing the names of properties. Multiple properties may be representing the names of properties. Multiple properties may be
included if the same response applies to them all. If href is used included if the same response applies to them all.
then the response refers to a problem with the referenced resource,
not a property.
11.3. status XML Element <!ELEMENT propstat (prop, status) >
11.9.1.2 status XML Element
Name: status Name: status
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: Holds a single HTTP status-line Purpose: Holds a single HTTP status-line
Parent: response
Value: status-line ;status-line defined in [Fielding et al., Value: status-line ;status-line defined in [Fielding et al.,
1997] 1997]
11.4. responsedescription XML Element <!ELEMENT status (#PCDATA) >
11.9.2 responsedescription XML Element
Name: responsedescription Name: responsedescription
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: Contains a message that can be displayed to the user Purpose: Contains a message that can be displayed to the user
explaining the nature of the response. explaining the nature of the response.
Parent: multistatus | response
Value: Any
Description: This XML element provides information suitable to be Description: This XML element provides information suitable to be
presented to a user. presented to a user.
12. Generic DAV XML Elements <!ELEMENT responsedescription (#PCDATA) >
12.1. href XML Element 11.10 owner XML Element
Name: href Name: owner
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: To identify that the content of the element is a URI. Purpose: Provides information about the principal taking out a
Parent: Any lock.
Value: URI ; See section 3.2.1 of [Fielding et al., 1997] Description: The owner XML element provides 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 owns a lock.
12.2. link XML Element <!ELEMENT owner (#PCDATA, ANY)* >
Name: link 11.11 prop XML element
Namespace: http://www.ietf.org/standards/dav/
Purpose: To identify a property as a link and to contain the
source and destination of that link.
Values= 1*src 1*dst
Description: Link is used to provide the sources and destinations of
a link. The type of the property containing the link XML element
provides the type of the link. Link is a multi-valued element, so
multiple Links may be used together to indicate multiple links with
the same type.
12.2.1. src XML Element Name: prop
Namespace: http://www.iana.org/standards/dav/
Purpose: Contains properties related to a resource.
Description: The prop XML element is a generic container for
properties defined on resources. All elements inside prop MUST
define properties related to the resource. No other elements may be
used inside of a prop element.
Name: src <!ELEMENT prop ANY>
Namespace: http://www.ietf.org/standards/dav/
Purpose: To indicate the source of a link.
Parent: link
Values= URI
12.2.2. dst XML Element 11.12 propertybehavior XML element
Name: dst Name: propertybehavior
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: To indicate the destination of a link Purpose: Specifies how properties are handled during a COPY or
Parent: link MOVE.
Values= URI Description: The propertybehavior XML element specifies how
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.
12.2.3. Example <!ELEMENT propertybehavior (omit | keepalive) >
<?XML version="1.0"> 11.12.1 keepalive XML element
<?namespace href = "http://www.ietf.org/standards/dav/" AS = "D"?>
<?namespace href = "http://www.foocorp.com/Project/" AS = "F"?>
<D:prop>
<D:Source>
<D:link>
<F:projfiles>Source</F:projfiles>
<D:src>http://foo.bar/program</D:src>
<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: keepalive
property that contains three links. Each link contains three Namespace: http://www.iana.org/standards/dav/
elements, two of which, src and dst, are part of the DAV schema Purpose: Specifies requirements for the copying/moving of live
defined in this document, and one which is defined by the schema properties.
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 that allows for element values to be
enhanced without breaking older clients.
12.3. prop XML element Description: If a list of URIs is included as the value of keepalive
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.
Value: "*" ; #PCDATA value can only be "*"
Name: prop <!ELEMENT keepalive (#PCDATA | href+) >
Namespace: http://www.ietf.org/standards/dav/
Purpose: Contains properties related to a resource.
Parent: Any
Values: XML Elements
Description: The prop XML element is a generic container for
properties defined on resources. All elements inside prop MUST
define properties related to the resource. No other elements may be
used inside of a prop element.
13. DAV Properties 11.12.2 omit XML element
13.1. creationdate Property Name: omit
Namespace: http://www.iana.org/standards/dav/
Purpose: Indicates that the associated method MAY succeed even if
the server is not able to copy/move every property on the source
resource, even in a dead form.
Description: The default behavior for a COPY or MOVE is to copy/move
all properties or fail the method. In certain circumstances, such
as when a server copies a resource over another protocol such as
FTP, it may not be possible to copy/move the properties associated
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. The omit XML element instructs the server that
it should use best effort to copy properties but a failure to copy a
property should not cause the method to fail.
<!ELEMENT omit EMPTY >
11.13 propertyupdate XML element
Name: propertyupdate
Namespace: http://www.iana.org/standards/dav/
Purpose: Contains a request to alter the properties on a
resource.
Description: This XML element is a container for the information
required to modify the properties on the resource. This XML element
is multi-valued.
<!ELEMENT propertyupdate (remove | set)+ >
11.13.1 remove XML element
Name: remove
Namespace: http://www.iana.org/standards/dav/
Purpose: Lists the DAV properties to be removed from a resource.
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 prop MUST be
empty, as only the names of properties to be removed are required.
<!ELEMENT remove (prop) >
11.13.2 set XML element
Name: set
Namespace: http://www.iana.org/standards/dav/
Purpose: Lists the DAV property values to be set for a resource.
Value: prop
Description: This XML element MUST contain only a prop XML element.
The elements contained by prop specify the name and value of
properties that are set on the Request-URI. If a property already
exists then its value is replaced.
<!ELEMENT set (prop) >
11.14 propfind XML Element
Name: propfind
Namespace: http://www.iana.org/standards/dav/
Purpose: Specifies the properties to be returned from a PROPFIND
method. Two special elements are specified for use with propfind,
allprop and propname.
<!ELEMENT propfind (allprop | propname | href+) >
11.14.1 allprop XML Element
Name: allprop
Namespace: http://www.iana.org/standards/dav/
Purpose: The allprop XML element specifies that all property
names and values on the resource are to be returned.
<!ELEMENT allprop EMPTY >
11.14.2 propname XML Element
Name: propname
Namespace: http://www.iana.org/standards/dav/
Purpose: the propname XML element specifies that only a list of
property names on the resource is to be returned.
<!ELEMENT propname EMPTY >
12 DAV Properties
For DAV properties, the name of the property is also the same as the
name of the XML element which contains its value. In the section
below, the final line of each section gives the element type
declaration using the format defined in [Bray, Paoli, Sperberg-
McQueen, 1998]. The "Value" field, where present, specifies futher
restrictions on the allowable contents of the XML element using BNF
(i.e., to further restrict the values of a PCDATA element).
12.1 creationdate Property
Name: creationdate Name: creationdate
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: The time and date the resource was created. Purpose: Records the time and date the resource was created.
Value: The time and date MUST be given in ISO 8601 format Value: ;The time and date MUST be given in ISO 8601 format
[ISO8601] defined in Appendix 2
Description: This property SHOULD be defined on all DAV compliant Description: This property SHOULD be defined on all DAV compliant
resources. If present, it contains a timestamp of the moment when resources. If present, it contains a timestamp of the moment when
the resource was created (i.e., the moment it had non-null state). the resource was created (i.e., the moment it had non-null state).
13.2. displayname Property <!ELEMENT creationdate (#PCDATA) >
12.2 displayname Property
Name: displayname Name: displayname
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: A name for the resource that is suitable for Purpose: Provies a name for the resource that is suitable for
presentation to a user. presentation to a user.
Value: Any valid XML character data (as defined in [Bray,
Sperberg-McQueen, 1997])
Description:This property SHOULD be defined on all DAV compliant Description:This property SHOULD be defined on all DAV compliant
resources. If present, the property contains a description of the resources. If present, the property contains a description of the
resource that is suitable for presentation to a user. resource that is suitable for presentation to a user.
13.3. get-content-language Property <!ELEMENT displayname (#PCDATA) >
Name: get-content-language 12.3 externalmembers Property
Namespace: http://www.ietf.org/standards/dav/
Name: externalmembers
Namespace: http://www.iana.org/standards/dav/
Purpose: Provides the list of external members defined on the
resource.
Description: This property MUST be defined on any DAV compliant
resource with external members. If defined it MUST contain the full
list of external members. Resources MAY make this property read-
only, thus only allowing its value to be altered using the
ADDREF/DELREF methods.
<!ELEMENT externalmembers (href*) >
12.4 getcontentlanguage Property
Name: getcontentlanguage
Namespace: http://www.iana.org/standards/dav/
Purpose: Contains the Content-Language header returned by a GET Purpose: Contains the Content-Language header returned by a GET
without accept headers. If no Content-Language header is available, without accept headers
this property MUST NOT exist. Description: This property MUST be defined on any DAV compliant
resource which supports GET, with the exception that if no Content-
Language header is available, this property MUST NOT exist.
Value: language-tag ;language-tag is defined in section 14.13 Value: language-tag ;language-tag is defined in section 14.13
of RFC 2068 of [Fielding et al., 1997]
<!ELEMENT getcontentlanguage (#PCDATA) >
13.4. get-content-length Property 12.5 getcontentlength Property
Name: get-content-length Name: getcontentlength
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: Contains the Content-Length header returned by a GET Purpose: Contains the Content-Length header returned by a GET
without accept headers. If no Content-Length header is available, without accept headers. If no Content-Length header is available,
this property MUST NOT exist. this property MUST NOT exist.
Value: content-length ; see section 14.14 of RFC 2068 Description: This property MUST be defined on any DAV compliant
resource which returns the Content-Length header in response to a
GET.
Value: content-length ; see section 14.14 of [Fielding et al.,
1997]
13.5. get-content-type Property <!ELEMENT getcontentlength (#PCDATA) >
Name: get-content-type 12.6 getcontenttype Property
Namespace: http://www.ietf.org/standards/dav/
Name: getcontenttype
Namespace: http://www.iana.org/standards/dav/
Purpose: Contains the Content-Type header returned by a GET Purpose: Contains the Content-Type header returned by a GET
without accept headers. If no Content-Type header is available, without accept headers. If no Content-Type header is available,
this property MUST NOT exist. this property MUST NOT exist.
Description: This property MUST be defined on any DAV compliant
resource which returns the Content-Type header in response to a GET.
Value: media-type ; defined in Section 3.7 of [Fielding et Value: media-type ; defined in Section 3.7 of [Fielding et
al., 1997] al., 1997]
13.6. get-etag Property <!ELEMENT getcontenttype (#PCDATA) >
Name: get-etag 12.7 getetag Property
Namespace: http://www.ietf.org/standards/dav/
Name: getetag
Namespace: http://www.iana.org/standards/dav/
Purpose: Contains the ETag header returned by a GET without Purpose: Contains the ETag header returned by a GET without
accept headers. If no ETag header is available, this property MUST accept headers.
NOT exist. Description: Note that the ETag on a resource may reflect changes in
any part of the state of the resource, not necessarily just a change
to the response to the GET method. For example, a change to a
resource's access permissions may cause the ETag to change. This
property MUST be defined on any DAV compliant resource which returns
the Etag header in response to a GET, except for the case if no ETag
header is returned, this property MUST NOT exist.
Value: entity-tag ; defined in Section 3.11 of [Fielding et Value: entity-tag ; defined in Section 3.11 of [Fielding et
al., 1997] al., 1997]
Description:Note that the ETag on some resource may reflect changes
in any part of the state of the resource, not necessarily just a
change to the response to the GET method. For example, a change in
the ACL may cause the ETag to change.
13.7. get-last-modified Property <!ELEMENT getetag (#PCDATA) >
Name: get-last-modified 12.8 getlastmodified Property
Namespace: http://www.ietf.org/standards/dav/
Name: getlastmodified
Namespace: http://www.iana.org/standards/dav/
Purpose: Contains the Last-Modified header returned by a GET Purpose: Contains the Last-Modified header returned by a GET
method without accept headers. If no Last-Modified header is method without accept headers.
available, this property MUST NOT exist. Description: Note that the last-modified date on a resource may
Value: HTTP-date ; defined in Section 3.3.1 of [Fielding et
al., 1997]
Description:Note that the last-modified date on some resource may
reflect changes in any part of the state of the resource, not reflect changes in any part of the state of the resource, not
necessarily just a change to the response to the GET method. For necessarily just a change to the response to the GET method. For
example, a change in a property may cause the last-modified date to example, a change in a property may cause the last-modified date to
change. change. This property MUST be defined on any DAV compliant resource
which returns the Last-Modified header in response to a GET, except
13.8. index-content-language Property for the case if no Last-Modified header is returned, this property
MUST NOT exist.
Name: index-content-language
Namespace: http://www.ietf.org/standards/dav/
Purpose: Contains the Content-Language header returned by an
INDEX without accept headers. If no Content-Language header is
available, this property MUST NOT exist.
Value: language-tag ;language-tag is defined in section 14.13
of RFC 2068
13.9. index-content-length Property
Name: index-content-length
Namespace: http://www.ietf.org/standards/dav/
Purpose: Contains the Content-Length header returned by an INDEX
without accept headers. If no Content-Length header is available,
this property MUST NOT exist.
Value: content-length ; see section 14.14 of RFC 2068
13.10. index-content-type Property
Name: index-content-type
Namespace: http://www.ietf.org/standards/dav/
Purpose: Contains the Content-Type header returned by an INDEX
without accept headers. If no Content-Type header is available,
this property MUST NOT exist.
Value: media-type ; defined in Section 3.7 of [Fielding et
al., 1997]
13.11. index-etag Property
Name: index-etag
Namespace: http://www.ietf.org/standards/dav/
Purpose: Contains the ETag header returned by an INDEX without
accept headers. If no ETag header is available, this property MUST
NOT exist.
Value: entity-tag ; defined in Section 3.11 of [Fielding et
al., 1997]
Description:Note that the ETag on some resource may reflect changes
in any part of the state of the resource, not necessarily just a
change to the response to the INDEX method. For example, a change
in the ACL may cause the ETag to change.
13.12. index-last-modified Property
Name: index-last-modified
Namespace: http://www.ietf.org/standards/dav/
Purpose: Contains the Last-Modified header returned by an INDEX
method without accept headers. If no Last-Modified header is
available, this property MUST NOT exist.
Value: HTTP-date ; defined in Section 3.3.1 of [Fielding et Value: HTTP-date ; defined in Section 3.3.1 of [Fielding et
al., 1997] al., 1997]
Description:Note that the last-modified date on some resource may
reflect changes in any part of the state of the resource, not
necessarily just a change to the response to the INDEX method. For
example, a change in a property may cause the last-modified date to
change.
13.13. lockdiscovery Property <!ELEMENT getlastmodified (#PCDATA) >
12.9 lockdiscovery Property
Name: lockdiscovery Name: lockdiscovery
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: To discover what locks are active on a resource Purpose: Describes the active locks on a resource
Values= *activelock
Description:The lockdiscovery property returns a listing of who has Description:The lockdiscovery property returns a listing of who has
a lock, what type of lock he have, the timeout type and the time a lock, what type of lock he has, the timeout type and the time
remaining on the timeout, and the associated lock token. The server remaining on the timeout, and the associated lock token. The server
is free to withhold any or all of this information if the requesting is free to withhold any or all of this information if the requesting
principal does not have sufficient access rights to see the principal does not have sufficient access rights to see the
requested data. A server which supports locks MUST provide the requested data. A server which supports locks MUST provide the
lockdiscovery property on any resource with locks on it. lockdiscovery property on any resource with locks on it.
13.13.1. activelock XML Element <!ELEMENT lockdiscovery (activelock)* >
Name: activelock
Namespace: http://www.ietf.org/standards/dav/
Purpose: A multivalued XML element that describes a particular
active lock on a resource
Parent: lockdiscovery
Values= locktype lockscope [addlocks] owner timeout locktoken
13.13.2. owner XML Element
Name: owner
Namespace: http://www.ietf.org/standards/dav/
Purpose: Returns owner information
Parent: activelock
Values= XML:REF | *PCDATA
13.13.3. timeout XML Element
Name: timeout
Namespace: http://www.ietf.org/standards/dav/
Purpose: Returns information about the timeout associated with
the lock
Parent: activelock
Values= TimeType
13.13.4. addlocks XML Element
Name: addlocks
Namespace: http://www.ietf.org/standards/dav/
Purpose: Lists additional resources associated with this lock, if
any.
Parent: activelock
Values= 1*href
13.13.5. locktoken XML Element
Name: locktoken 12.9.1 Example
Namespace: http://www.ietf.org/standards/dav/
Purpose: Returns the lock token
Parent: activelock
Values= href
Description:The href contains a Lock-Token-URL.
13.13.6. Example >>Request
PROPFIND /container/ HTTP/1.1 PROPFIND /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Content-Length: xxxx Content-Length: xxxx
Content-Type: text/xml Content-Type: text/xml
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<D:propfind> <D:propfind>
<D:prop><lockdiscovery/></D:prop> <D:prop><lockdiscovery/></D:prop>
</D:propfind> </D:propfind>
>>Response
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?xml version="1.0"?>
<?XML version="1.0"> <?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href ="http://www.ietf.org/standards/dav/" AS = "D"?>
<D:multistatus> <D:multistatus>
<D:response> <D:response>
<D:propstat>
<D:prop> <D:prop>
<D:lockdiscovery> <D:lockdiscovery>
<D:activelock> <D:activelock>
<D:locktype>write</D:locktype> <D:locktype>write</D:locktype>
<D:lockscope>exclusive</D:lockscope> <D:lockscope>exclusive</D:lockscope>
<D:addlocks> <D:Depth>0</D:Depth>
<D:href>http://foo.com/doc/</D:href>
</D:addlocks>
<D:owner>Jane Smith</D:owner> <D:owner>Jane Smith</D:owner>
<D:timeout>Infinite</D:timeout> <D:timeout>Infinite</D:timeout>
<D:locktoken> <D:locktoken>
<D:href>iamuri:unique!!!!!</D:href> <D:href>
opaquelocktoken:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76
</D:href>
</D:locktoken> </D:locktoken>
</D:activelock> </D:activelock>
</D:lockdiscovery> </D:lockdiscovery>
</D:prop> </D:prop>
<D:status>HTTP/1.1 200 OK</D:status> <D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response> </D:response>
</D:multistatus> </D:multistatus>
This resource has a single exclusive write lock on it, with an This resource has a single exclusive write lock on it, with an
infinite timeout. This same lock also covers the resource infinite timeout. Note that the Depth element could have been
http://foo.com/doc/. omitted as 0 is the default value of Depth.
13.14. resourcetype Property 12.10 resourcetype Property
Name: resourcetype Name: resourcetype
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: This property contains a series of XML elements that Purpose: Specifies the nature of the resource.
specify information regarding the nature of the resource. This
specification only defines a single value, collection.
Value: XML elements
Description:This property MUST be defined on all DAV compliant Description:This property MUST be defined on all DAV compliant
resources. The default value is empty. resources. The default value is empty.
13.14.1. collection XML Element <!ELEMENT resourcetype ANY >
Name: collection
Namespace: http://www.ietf.org/standards/dav/
Purpose: Identifies the associated resource as a collection.
Collection resources MUST define this value with the resourcetype
property.
Parent: resourcetype
Values: None
13.15. Source Link Property Type 12.11 source Property
Name: source Name: source
Namespace: http://www.ietf.org/standards/dav/link/ Namespace: http://www.iana.org/standards/dav/link/
Purpose: The destination of the source link identifies the Purpose: The destination of the source link identifies the
resource that contains the unprocessed source of the link's source. resource that contains the unprocessed source of the link's source.
Parent: None Description: The source of the link (src) is typically the URI of
Value: An XML document with zero or more link XML elements. the output resource on which the link is defined, and there is
typically only one destination (dst) of the link, which is the URI
where the unprocessed source of the resource may be accessed. When
more than one link destination exists, this specification asserts no
policy on ordering.
Discussion: The source of the link (src) is typically the URI of the <!ELEMENT source (link)* >
output resource on which the link is defined, and there is typically
only one destination (dst) of the link, which is the URI where the
unprocessed source of the resource may be accessed. When more than
one link destination exists, this specification asserts no policy on 12.11.1 Example
ordering.
13.16. supportedlock Property <?xml version="1.0"?>
<?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<?namespace href="http://www.foocorp.com/Project/" as="F"?>
<D:prop>
<D:source>
<D:link>
<F:projfiles>Source</F:projfiles>
<D:src>http://foo.bar/program</D:src>
<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
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.
12.12 supportedlock Property
Name: supportedlock Name: supportedlock
Namespace: http://www.ietf.org/standards/dav/ Namespace: http://www.iana.org/standards/dav/
Purpose: To provide a listing of the lock capabilities supported Purpose: To provide a listing of the lock capabilities supported
by the resource. by the resource.
Values: An XML document containing zero or more LockEntry XML
elements.
Description:The supportedlock property of a resource returns a Description:The supportedlock property of a resource returns a
listing of the combinations of scope and access types which may be listing of the combinations of scope and access types which may be
specified in a lock request on the resource. Note that the actual specified in a lock request on the resource. Note that the actual
contents are themselves controlled by access controls so a server is contents are themselves controlled by access controls so a server is
not required to provide information the client is not authorized to not required to provide information the client is not authorized to
see. If supportedlock is available on _*_ then it MUST define the see. If supportedlock is available on "*" then it MUST define the
set of locks allowed on all resources on that server. set of locks allowed on all resources on that server.
13.16.1. lockentry XML Element <!ELEMENT supportedlock (lockentry)* >
Name: lockentry
Namespace: http://www.ietf.org/standards/dav/
Purpose: Defines a DAVLockType/LockScope pair that may be legally
used with a LOCK on the specified resource.
Parent: supportedlock
Values= locktype lockscope
13.16.2. locktype XML Element
Name: locktype
Namespace: http://www.ietf.org/standards/dav/
Purpose: Lists a DAVLockType
Parent: lockentry
Values= DAVLockTypeValue
13.16.3. lockscope XML Element
Name: lockscope
Namespace: http://www.ietf.org/standards/dav/
Purpose: Lists a DAVLockScope
Parent: lockentry
Values: DAVLockScopeValue 12.12.1 Example
13.16.4. Example >>Request
PROPFIND /container/ HTTP/1.1 PROPFIND /container/ HTTP/1.1
Host: www.foo.bar Host: www.foo.bar
Content-Length: xxxx Content-Length: xxxx
Content-Type: text/xml Content-Type: text/xml
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href = "http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href="http://www.iana.org/standards/dav/" as="D"?>
<D:propfind> <D:propfind>
<D:prop><supportedlock/></D:prop> <D:prop><supportedlock/></D:prop>
</D:propfind> </D:propfind>
>>Response
HTTP/1.1 207 Multi-Status HTTP/1.1 207 Multi-Status
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML version="1.0"> <?xml version="1.0"?>
<?namespace href ="http://www.ietf.org/standards/dav/" AS = "D"?> <?namespace href ="http://www.iana.org/standards/dav/" as="D"?>
<D:multistatus> <D:multistatus>
<D:response> <D:response>
<D:propstat>
<D:prop> <D:prop>
<D:supportedlock> <D:supportedlock>
<D:LockEntry> <D:LockEntry>
<D:locktype>Write</D:locktype> <D:locktype><D:Write/></D:locktype>
<D:lockscope>Exclusive</D:lockscope> <D:lockscope><D:Exclusive/></D:lockscope>
</D:LockEntry> </D:LockEntry>
<D:LockEntry> <D:LockEntry>
<D:locktype>Write</D:locktype> <D:locktype><D:Write/></D:locktype>
<D:lockscope>Shared</D:lockscope> <D:lockscope><D:Shared/></D:lockscope>
</D:LockEntry> </D:LockEntry>
</D:supportedlock> </D:supportedlock>
</D:prop> </D:prop>
<D:status>HTTP/1.1 200 OK</D:status> <D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response> </D:response>
</D:multistatus> </D:multistatus>
14. DAV Compliance Levels 13 DAV Compliance Classes
A DAV compliant resource can choose from two classes of compliance.
A DAV compliant resource can choose from two levels of compliance. A client can discover the compliance classes of a resource by
A client can discover which level a resource supports by executing executing OPTIONS on the resource, and examining the "DAV" header
OPTIONS on the resource, and examining the "DAV" header which is which is returned.
returned.
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 RFC 2068 [Fielding et al., 1997]. compliant with [Fielding et al., 1997].
14.1. Level 1 Compliance classes are not necessarily sequential. A resource that
is class 2 compliant MUST also be class 1 compliant; but if
additional compliance classes are defined later, a resource that is
class 1, 2, and 4 compliant might not be class 3 compliant.
A level 1 compliant resource MUST meet all "MUST" requirements in 13.1 Class 1
A class 1 compliant resource MUST meet all "MUST" requirements in
all sections of this document. all sections of this document.
14.2. Level 2 Class 1 compliant resources MUST return, at minimum, the value "1"
A level 2 compliant resource MUST meet all level 1 requirements and in the DAV header on all responses to the OPTIONS method.
support the supportedlock property as well as the LOCK method.
15. Internationalization Considerations 13.2 Class 2
In the realm of internationalization issues, this specification is A class 2 compliant resource MUST meet all class 1 requirements and
substantively in compliance with the IETF Character Set Policy support the supportedlock property as well as the LOCK method. It
[Alvestrand, 1997]. In this specification, human-readable fields can MUST also support the lockdiscovery property, since Section 12.9
be found in either the value of a property, or in an error message specifies that the LOCK method MUST also support the lockdiscovery
returned in a response entity body. In both cases, the human- property.
readable content is encoded using XML, which has explicit provisions
for character set tagging and encoding, and requires by default that Class 2 compliant resources MUST return, at minimum, the value "2"
XML processors read XML elements encoded using the UTF-8 and UCS-2 in the DAV header on all responses to the OPTIONS method.
encodings of the ISO 10646 basic multilingual plane. Furthermore,
XML contains provisions for encoding XML elements using other 14 Internationalization Considerations
encoding schemes, notable among them UCS-4, which permits encoding
of characters from any ISO 10646 character plane. In the realm of internationalization, this specification complies
with the IETF Character Set Policy [Alvestrand, 1998]. In this
specification, 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 cases, the human-readable content is encoded
using XML, which has explicit provisions for character set tagging
and encoding, and requires that XML processors read XML elements
encoded using the UTF-8 and UCS-2 encodings of the ISO 10646 basic
multilingual plane. Furthermore, XML contains provisions for
encoding XML elements using other encoding schemes, notable among
them UCS-4, which permits encoding of characters from any ISO 10646
character plane.
The default character set encoding for XML data in this The default character set encoding for XML data in this
specification, and in general, is UTF-8. WebDAV compliant specification, and in general, is UTF-8. WebDAV compliant
applications MUST support the UTF-8 and UCS-2 character set applications MUST support the UTF-8 and UCS-2 character set
encodings for XML elements, and SHOULD support the UCS-4 encoding. encodings for XML elements, and SHOULD support the UCS-4 encoding.
The XML character set encoding declaration for each supported The XML character set encoding declaration for each supported
character set MUST also be supported, since it is by using this character set MUST also be supported, since it is by using this
encoding declaration that an XML processor determines the encoding encoding declaration that an XML processor determines the encoding
of an element. of an element.
XML also provides language tagging capability which provides the XML also provides a language tagging capability for specifying the
ability to specify the language of the contents of a particular XML language of the contents of a particular XML element. XML uses
element. Although XML, and hence WebDAV, does not use RFC 1766 either IANA registered language tags (see RFC 1766, [Alvestrand,
language tags for its language names, the benefit of using standard 1995]) or ISO 639 language tags [ISO-639] in the "xml:lang"
XML in this context outweighs the advantage of using RFC 1766 attribute of an XML element to identify the language its content and
language tags. attributes.
Names used within this specification fall into two categories: names Names used within this specification fall into three categories:
specific to protocol elements such as methods and headers, names of names of protocol elements such as methods and headers, names of XML
XML elements, and names of properties. Naming of protocol elements elements, and names of properties. Naming of protocol elements
follows the precedent of HTTP, using English names encoded in follows the precedent of HTTP, using English names encoded in
USASCII for methods and headers. Since these protocol elements are USASCII for methods and headers. Since these protocol elements are
not visible to users, and are in fact simply long token identifiers, not visible to users, and are in fact simply long token identifiers,
they do not need to support encoding in multiple character sets. they do not need to support encoding in multiple character sets.
Similarly, though the names of XML elements used in this Similarly, though the names of XML elements used in this
specification are English names encoded in UTF-8, these names are specification are English names encoded in UTF-8, these names are
not visible to the user, and hence do not need to support multiple not visible to the user, and hence do not need to support multiple
character set encodings. character set encodings.
The name of a property defined on a resource is a URI. Although The name of a property defined on a resource is a URI. Although
skipping to change at line 3276 skipping to change at page 70, line 42
typical application will use a fixed set of properties, and will typical application will use a fixed set of properties, and will
provide a mapping from the property name URI to a human-readable provide a mapping from the property name URI to a human-readable
field when displaying the property name to a user. It is only in field when displaying the property name to a user. It is only in
the case where the set of properties is not known ahead of time that the case where the set of properties is not known ahead of time that
an application need display a property name URI to a user. We an application need display a property name URI to a user. We
recommend that applications provide human-readable property names recommend that applications provide human-readable property names
wherever feasible. 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., 421 Destination Locked). While the possibility of the code (e.g., 425 Locked). While the possibility exists that a
exists that a poorly crafted user agent would display this message poorly crafted user agent would display this message to a user,
to a user, internationalized applications will ignore this message, internationalized applications will ignore this message, and display
and display an appropriate message in the user's language and an appropriate message in the user's language and character set.
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.
16. Security Considerations 15 Security Considerations
[TBD]
17. Terminology This section is provided to detail issues concerning security
implications of which WebDAV applications need to be aware.
All of the security considerations of HTTP/1.1 also apply to WebDAV.
In addition, the security risks inherent in remote authoring require
stronger authentication technology, and introduce several new
privacy concerns, and may increase the hazards from poor server