draft-ietf-webdav-protocol-03.txt   draft-ietf-webdav-protocol-04.txt 
WEBDAV Working Group Y. Y. Goland, Microsoft WEBDAV Working Group Y. Y. Goland, Microsoft
INTERNET-DRAFT E. J. Whitehead, Jr., U.C. Irvine INTERNET-DRAFT E. J. Whitehead, Jr., U.C. Irvine
<draft-ietf-webdav-protocol-03> A. Faizi, Netscape <draft-ietf-webdav-protocol-04> A. Faizi, Netscape
S. R Carter, Novell S. R Carter, Novell
D. Jensen, Novell D. Jensen, Novell
Expires April 6, 1998 September 29, 1997 Expires April 20, 1998 October 12, 1997
Extensions for Distributed Authoring and Versioning Extensions for Distributed Authoring and Versioning
on the on the
World Wide Web -- WEBDAV 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 documents of the Internet Engineering Task Force (IETF), its
areas, and its working groups. Note that other groups may also areas, and its working groups. Note that other groups may also
skipping to change at line 95 skipping to change at line 95
2.8 Properties and Methods 2.8 Properties and Methods
2.8.1 DELETE 2.8.1 DELETE
2.8.2 GET 2.8.2 GET
2.8.3 PROPPATCH 2.8.3 PROPPATCH
2.8.4 PUT 2.8.4 PUT
2.8.5 PROPFIND 2.8.5 PROPFIND
3 A Proposal for Collections of Web Resources and Name Space 3 A Proposal for Collections of Web Resources and Name Space
Operations Operations
3.1 Observations on the HTTP Object Model 3.1 Observations on the HTTP Object Model
3.1.1 Collection Resources 3.1.1 Collection Resources
3.1.2 Creation and Retrieval of Collection Resources 3.1.2 Creation and Retrieval of Collection
Resources
3.1.3 Source Resources and Output Resources 3.1.3 Source Resources and Output Resources
3.2 MKCOL Method 3.2 MKCOL Method
3.2.1 Problem Description 3.2.1 Problem Description
3.2.2 Solution Requirements 3.2.2 Solution Requirements
3.2.3 Request 3.2.3 Request
3.2.4 Response 3.2.4 Response
3.2.5 Example 3.2.5 Example
3.3 Standard DAV Properties 3.3 Standard DAV Properties
3.3.1 IsCollection Property 3.3.1 IsCollection Property
3.3.2 DisplayName Property 3.3.2 DisplayName Property
skipping to change at line 128 skipping to change at line 129
3.4.4 The Response 3.4.4 The Response
3.4.5 ResInfo XML Element 3.4.5 ResInfo XML Element
3.4.6 Members XML Element 3.4.6 Members XML Element
3.4.7 Href XML Element 3.4.7 Href XML Element
3.4.8 Example 3.4.8 Example
3.5 Behavior of RFC 2068 Methods on Collections 3.5 Behavior of RFC 2068 Methods on Collections
3.5.1 GET, HEAD for Collections 3.5.1 GET, HEAD for Collections
3.5.2 POST for Collections 3.5.2 POST for Collections
3.5.3 PUT for Collections 3.5.3 PUT for Collections
3.5.4 DELETE for Collections 3.5.4 DELETE for Collections
3.5.5 DELETE Method for Non-Collection Resources
3.5.5 DELETE Method for Non-Collection
Resources
3.6 COPY Method 3.6 COPY Method
3.6.1 Problem Description 3.6.1 Problem Description
3.6.2 Solution Requirements 3.6.2 Solution Requirements
3.6.3 The Request 3.6.3 The Request
3.6.4 The Response 3.6.4 The Response
3.6.5 Examples 3.6.5 Examples
3.7 MOVE Method 3.7 MOVE Method
3.7.1 Problem Description 3.7.1 Problem Description
3.7.2 Solution Requirements 3.7.2 Solution Requirements
3.7.3 The Request 3.7.3 The Request
skipping to change at line 176 skipping to change at line 178
3.12.1 Source Link Property Type 3.12.1 Source Link Property Type
4 State Tokens 4 State Tokens
4.1 Overview 4.1 Overview
4.1.1 Problem Description 4.1.1 Problem Description
4.1.2 Solution Requirements 4.1.2 Solution Requirements
4.2 State Token Syntax 4.2 State Token Syntax
4.3 State Token Conditional Headers 4.3 State Token Conditional Headers
4.3.1 If-State-Match 4.3.1 If-State-Match
4.3.2 If-None-State-Match 4.3.2 If-None-State-Match
4.4 State Token Header 4.4 State Token Header
4.5 E-Tags 4.5 E-Tag
5 Locking 5 Locking
5.1 Problem Description - Overview 5.1 Locking: Introduction
5.1.1 Exclusive Vs. Shared Locks 5.1.1 Exclusive Vs. Shared Locks
5.1.2 Required Support 5.1.2 Required Support
5.2 LOCK Method 5.2 LOCK Method
5.2.1 Operation 5.2.1 Operation
5.2.2 Effect of Locks on Properties and Containers 5.2.2 The Effect of Locks on Properties and
Containers
5.2.3 Locking Replicated Resources 5.2.3 Locking Replicated Resources
5.2.4 Interaction with other Methods 5.2.4 Locking Multiple Resources
5.2.5 Lock Compatibility Table 5.2.5 Interaction with other Methods
5.2.6 Status Codes 5.2.6 Lock Compatibility Table
5.2.7 Example 5.2.7 Status Codes
5.2.8 Lock-Info Request Header 5.2.8 Lock-Info Request Header
5.2.9 Owner Request Header 5.2.9 Owner Request Header
5.2.10 Time-Out Header 5.2.10 Time-Out Header
5.2.11 State-Token Header 5.2.11 Lock Response
5.2.12 Example - Simple Lock Request
5.2.13 Example - Multi-Resource Lock Request
5.3 Write Lock 5.3 Write Lock
5.3.1 Methods Restricted by Write Locks
5.3.2 Write Locks and Properties
5.3.3 Write Locks and Null Resources
5.3.4 Write Locks and Collections
5.3.5 Write Locks and COPY/MOVE
5.3.6 Re-issuing Write Locks
5.3.7 Write Locks and The State-Token Header
5.4 Lock Tokens 5.4 Lock Tokens
5.4.1 Problem Description 5.4.1 Problem Description
5.4.2 Proposed Solution 5.4.2 Lock Token Introduction
5.4.3 Lock Token Definition 5.4.3 Generic Lock Tokens
5.4.4 OpaqueLockToken Lock Token
5.5 UNLOCK Method 5.5 UNLOCK Method
5.5.1 Problem Definition 5.5.1 Problem Definition
5.5.2 Example 5.5.2 Example
5.6 Discovery Mechanisms 5.6 Discovery Mechanisms
5.6.1 Lock Type Discovery 5.6.1 Lock Capability Discovery
5.6.2 Active Lock Discovery 5.6.2 Active Lock Discovery
6 Version Control 6 Version Control
7 Internationalization Support 7 Internationalization Support
8 Security Considerations 8 Security Considerations
9 Acknowledgements 9 Copyright
10 References 10 Acknowledgements
11 Authors' Addresses 11 References
12 Authors' Addresses
1 Terminology 1 Terminology
Collection - A resource that contains member resources. Collection - A resource that contains member resources.
Member Resource - a resource referred to by a collection. There Member Resource - a resource referred to by a collection. There
are two types of member resources: external and internal. are two types of member resources: external and internal.
Internal Member Resource - the name given to a member resource of Internal Member Resource - the name given to a member resource of
a collection whose URI is relative to the URI of the collection. a collection whose URI is relative to the URI of the collection.
skipping to change at line 238 skipping to change at line 252
Live Properties - Properties whose semantics and syntax are Live Properties - Properties whose semantics and syntax are
enforced by the server. For example, a live "read-only" property enforced by the server. For example, a live "read-only" property
that is enforced by the server would disallow PUTs to the that is enforced by the server would disallow PUTs to the
associated resource. associated resource.
Dead properties - Properties whose semantics and syntax are not Dead properties - Properties whose semantics and syntax are not
enforced by the server. A dead "read-only" property would not be enforced by the server. A dead "read-only" property would not be
enforced by the server and thus would not be used by the server enforced by the server and thus would not be used by the server
as a reason to disallow a PUT on the associated resource. as a reason to disallow a PUT on the associated resource.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", SHOULD NOT", "RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
RFC 2119 [Bradner, 1997].
2 Data Model and Methods for DAV Properties 2 Data Model and Methods for DAV Properties
2.1 Introduction 2.1 Introduction
2.1.1 The DAV Property 2.1.1 The DAV Property
Properties are pieces of data that describe the state of a Properties are pieces of data that describe the state of a
resource. Properties are data about data. The term property is resource. Properties are data about data. The term property is
used within this specification to disambiguate the concept from used within this specification to disambiguate the concept from
the overloaded terms "metadata" and "attribute". the overloaded terms "metadata" and "attribute".
skipping to change at line 314 skipping to change at line 334
and value of a property is expressed as a well-formed XML and value of a property is expressed as a well-formed XML
element, where the name of the property is the name of the XML element, where the name of the property is the name of the XML
element, and the value of the property MUST be either blank, or a element, and the value of the property MUST be either blank, or a
well-formed XML element value. well-formed XML element value.
2.2.2 Property Namespace 2.2.2 Property Namespace
2.2.2.1 Problem Definition 2.2.2.1 Problem Definition
The requirement is to be able to associate a value with a The requirement is to be able to associate a value with a
property name on a resource and to be able to directly address property name on a resource. It must be possible to associate a
that value. URL with the property name.
2.2.2.2 Solution Requirement 2.2.2.2 Solution Requirement
Ideally a property namespace should work well with extant Ideally a property namespace should work well with extant
property implementations as well as database systems. The DAV property implementations as well as database systems. The DAV
property namespace has been specified with the following two property namespace has been specified with the following two
facts in mind: facts in mind:
· Namespaces associated with flat file systems are ubiquitous. · Namespaces associated with flat file systems are ubiquitous.
· The majority of databases use a fixed schema mechanism. · The majority of databases use a fixed schema mechanism.
The last point makes efficient implementation of hierarchical The last point makes efficient implementation of hierarchical
skipping to change at line 360 skipping to change at line 380
way MUST be that the request fails. way MUST be that the request fails.
2.2.2.3 Property Names 2.2.2.3 Property Names
A property name identifies both the syntax and semantics of the A property name identifies both the syntax and semantics of the
property's value. It is critical that property names do not property's value. It is critical that property names do not
collide, e.g., two principals defining the same property name collide, e.g., two principals defining the same property name
with two different meanings. with two different meanings.
The URI framework provides a mechanism to prevent namespace The URI framework provides a mechanism to prevent namespace
collision and for varying degrees of administrative control. collision and for varying degrees of administrative control.
Rather than reinvent these desirable features, DAV properties Rather than reinvent these desirable features, DAV properties
make use of them by requiring that all DAV property names MUST be make use of them by requiring that all DAV property names MUST be
URIs. Since a property is also an XML element, the name of the URIs. Since a property is also an XML element, the name of the
XML element is a URI. XML element is a URI.
The property namespace is flat, that is, it is not possible to The property namespace is flat, that is, it is not possible to
string together a series of property names in order to refer to a string together a series of property names in order to refer to a
hierarchy of properties. Thus it is possible to refer to a hierarchy of properties. Thus it is possible to refer to a
property B but not a property A/B, where is also a property property B but not a property A/B, where A is also a property
defined on the resource. defined on the resource.
Finally, it is not possible to define the same property twice as Finally, it is not possible to define the same property twice as
this would cause a collision in the resource's property this would cause a collision in the resource's property
namespace. namespace.
2.3 Schemas 2.3 Schemas
A schema is a group of property names and XML elements. A schema is a group of property names and XML elements.
skipping to change at line 641 skipping to change at line 661
method on each of the scoped resources may be different, as such method on each of the scoped resources may be different, as such
a return format that can specify the effect of the method on each a return format that can specify the effect of the method on each
resource is needed. resource is needed.
2.7.2 Solution Requirements 2.7.2 Solution Requirements
The solution must: The solution must:
- communicate the status code and reason - communicate the status code and reason
- give the URI of the resource on which the method was invoked - give the URI of the resource on which the method was invoked
- be consistent with other return body formats - be consistent with other return body formats
-
2.7.3 Multi-Status Response 2.7.3 Multi-Status Response
The default multi-status response body is an text/xml HTTP entity The default multi-status response body is an text/xml HTTP entity
that contains a single XML element called multiresponse, which that contains a single XML element called multiresponse, 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.
skipping to change at line 960 skipping to change at line 975
"http://www.foo.bar/boxschema/" AS = "B"/> "http://www.foo.bar/boxschema/" AS = "B"/>
<G:PROPFIND> <G:PROPFIND>
<prop> <prop>
<B:bigbox> <B:bigbox>
<B:author> <B:author>
<B:DingALing> <B:DingALing>
<B:Random> <B:Random>
</prop> </prop>
</G:PROPFIND> </G:PROPFIND>
HTTP/1.1 207 Partial Success HTTP/1.1 207 Multi-Response
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?XML:Namespace <?XML:Namespace
href ="http://www.ietf.org/standards/dav/" AS = "S"> href ="http://www.ietf.org/standards/dav/" AS = "S">
<?XML:Namespace href = "http://www.foo.bar/boxschema" AS = R"> <?XML:Namespace href = "http://www.foo.bar/boxschema" AS = R">
<D:MultiResponse> <D:MultiResponse>
<ResponseDescription> There has been an access violation <ResponseDescription> There has been an access violation
error. </ResponseDescription> error. </ResponseDescription>
<Response> <Response>
skipping to change at line 1031 skipping to change at line 1046
<Name>Hadrian</Name> <Name>Hadrian</Name>
</R:author> </R:author>
</Prop> </Prop>
<Status>HTTP/1.1 200 Success</Status> <Status>HTTP/1.1 200 Success</Status>
</S:MultiResponse> </S:MultiResponse>
This particular client only had the right to see two properties, This particular client only had the right to see two properties,
BoxType and Author. No error is returned for the remaining BoxType and Author. No error is returned for the remaining
properties, as the client does not even have sufficient rights to properties, as the client does not even have sufficient rights to
know they exist. If the client did have the right to know they know they exist. If the client did have the right to know they
existed but did not have the right to see their value, a 201 existed but did not have the right to see their value, a 207
Partial Success with a multiresponse, as used in the previous multi-response with a multiresponse, as used in the previous
example, would have been returned. example, would have been returned.
2.8.5.7 Example 3 - Propname 2.8.5.7 Example 3 - Propname
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:Namespace <?XML:Namespace
skipping to change at line 1096 skipping to change at line 1110
properties. An internal member resource MUST have a URI that is properties. An internal member resource MUST have a URI that is
immediately relative to the base URI of the collection, that is, immediately relative to the base URI of the collection, that is,
a relative URI in which "../" is illegal, which must begin with a relative URI in which "../" is illegal, which must begin with
"./" and which MAY contain only one other "/" at the end of the "./" and which MAY contain only one other "/" at the end of the
URI. An external member resource MUST be an absolute URI that is URI. An external member resource MUST be an absolute URI that is
not an internal URI. Any given internal or external URI MUST not an internal URI. Any given internal or external URI MUST
only belong to the collection once, i.e., multiple instances of only belong to the collection once, i.e., multiple instances of
URIs in a collection are illegal. Properties defined on URIs in a collection are illegal. Properties defined on
collections have no special distinction, and behave exactly as do collections have no special distinction, and behave exactly as do
properties on non-collection resources. properties on non-collection resources.
The purpose of a collection resource is to model collection-like The purpose of a collection resource is to model collection-like
objects (e.g., a filesystem directory) within a server's objects (e.g., a filesystem directory) within a server's
namespace. Once these objects have been modeled with namespace. Once these objects have been modeled with
collections, a client may perform an INDEX, add and remove collections, a client may perform an INDEX, add and remove
external members using ADDREF and DELREF, and perform recursive external members using ADDREF and DELREF, and perform recursive
operations, such as a full hierarchy copy. operations, such as a full hierarchy copy.
To support methods which operate on collections, a server SHOULD To support methods which operate on collections, a server SHOULD
model its collection-like objects with collection resources. For model its collection-like objects with collection resources. For
example, a server which is implemented on top of a filesystem example, a server which is implemented on top of a filesystem
SHOULD treat all filesystem directories exposed by the server as SHOULD treat all filesystem directories exposed by the server as
collection resources.1 collection resources.
3.1.2 Creation and Retrieval of Collection Resources 3.1.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, and the INDEX method to list their contents.2 resources, and the INDEX method to list their contents.
In HTTP/1.1, the PUT method is defined to store the request body In HTTP/1.1, the PUT method is defined to store the request body
at the location specified by Request-URI. While a description at the location specified by Request-URI. While a description
format for a collection can readily be constructed that could be format for a collection can readily be constructed that could be
used with PUT, the implications of sending such a description to used with PUT, the implications of sending such a description to
the server are undesirable. For example, if a description of a the server are undesirable. For example, if a description of a
collection that omitted some existing resources were PUT to a collection that omitted some existing resources were PUT to a
server, this might be interpreted as a command to remove those server, this might be interpreted as a command to remove those
members. This would extend PUT to perform DELETE functionality, members. This would extend PUT to perform DELETE functionality,
which is undesirable since it changes the semantics of PUT, and which is undesirable since it changes the semantics of PUT, and
makes it difficult to control DELETE functionality with an access makes it difficult to control DELETE functionality with an access
control scheme based on methods. 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 collection" POST command could be constructed, this is
undesirable because it would be difficult to separate access undesirable because it would be difficult to separate access
control for collection creation from other uses of POST if they control for collection creation from other uses of POST if they
both use the same method. both use the same method.
While it might seem desirable to have GET return a listing of the While it might seem desirable to have GET return a listing of the
members of a collection, this is foiled by the existence of the members of a collection, this is foiled by the existence of the
"index.html" de-facto standard namespace redirection, in which a "index.html" de-facto standard namespace redirection, in which a
GET request on a collection is automatically redirected to the GET request on a collection is automatically redirected to the
index.html resource. index.html resource.
The exact definition of the behavior of GET and PUT on The exact definition of the behavior of GET and PUT on
collections is defined later in this document. collections is defined later in this document.
3.1.2.1 Example 3.1.2.1 Example
The structured resource http://foo/bar is created with a PUT. Bar The structured resource http://foo/bar is created with a PUT. Bar
is a multipart/related file with two members http://foo/bar/a and is a multipart/related file with two members http://foo/bar/a and
http://foo/bar/b. If bar were deleted then both a and b would http://foo/bar/b. If bar were deleted then both a and b would
also be deleted since they are all really just one resource. If also be deleted since they are all really just one resource. If
http://foo/bar/a/c was PUT then a DELETE on http://foo/bar/a http://foo/bar/a/c was PUT then a DELETE on http://foo/bar/a
skipping to change at line 1167 skipping to change at line 1189
3.1.3 Source Resources and Output Resources 3.1.3 Source Resources and Output Resources
For many resources, the entity returned by GET exactly matches For many resources, the entity returned by GET exactly matches
the persistent state of the resource, for example, a GIF file the persistent state of the resource, for example, a GIF file
stored on a disk. For this simple case, the URL at which a 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 the case for HTML source files that are not processed by the
server prior to transmission. server prior to transmission.
However, the server can sometimes process HTML resources before However, the server can sometimes process HTML resources before
they are transmitted as a return entity body. For example, they are transmitted as a return entity body. For example,
server- server-side-include directives within an HTML file instruct a
side-include directives within an HTML file instruct a server to server to replace the directive with another value, such as the
replace the directive with another value, such as the current current date. In this case, what is returned by GET (HTML plus
date. In this case, what is returned by GET (HTML plus date) date) differs from the persistent state of the resource (HTML
differs from the persistent state of the resource (HTML plus plus directive). Typically there is no way to access the HTML
directive). Typically there is no way to access the HTML resource resource containing the unprocessed directive.
containing the unprocessed directive.
Sometimes the entity returned by GET is the output of a data- Sometimes the entity returned by GET is the output of a data-
producing process that is described by one or more source producing process that is described by one or more source
resources (that may not even have a location in the URL resources (that may not even have a location in the URL
namespace). A single data-producing process may dynamically namespace). A single data-producing process may dynamically
generate the state of a potentially large number of output generate the state of a potentially large number of output
resources. An example of this is a CGI script that describes a resources. An example of this is a CGI script that describes a
"finger" gateway process that maps part of the namespace of a "finger" gateway process that maps part of the namespace of a
server into finger requests, such as server into finger requests, such as
http://www.foo.bar.org/finger_gateway/user@host. http://www.foo.bar.org/finger_gateway/user@host.
In the absence of distributed authoring capability, it is In the absence of distributed authoring capability, it is
acceptable to have no mapping of source resource(s) to the URI acceptable to have no mapping of source resource(s) to the URI
namespace, and in fact has desirable security benefits. However, namespace, and in fact has desirable security benefits. However,
if remote editing of the source resource(s) is desired, the if remote editing of the source resource(s) is desired, the
source resource(s) should be given a location in the URI source resource(s) should be given a location in the URI
namespace. This source location should not be one of the namespace. This source location should not be one of the
locations at which the generated output is retrievable, since in locations at which the generated output is retrievable, since in
general it is impossible for the server to differentiate requests general it is impossible for the server to differentiate requests
for source resources from requests for process output resources. for source resources from requests for process output resources.
There is often a many-to-many relationship between source There is often a many-to-many relationship between source
skipping to change at line 1213 skipping to change at line 1237
discovering the source is placed on the authoring client. discovering the source is placed on the authoring client.
3.2 MKCOL Method 3.2 MKCOL Method
3.2.1 Problem Description 3.2.1 Problem Description
A client must be able to create a collection. A client must be able to create a collection.
3.2.2 Solution Requirements 3.2.2 Solution Requirements
The solution: The solution must ensure that a collection has been made (i.e.
- Must ensure that a collection has been made (i.e. that it that it responds to the INDEX method) as opposed to a non-
responds to the INDEX method) as opposed to a non-collection
resource. If a collection could not be made, it must indicate collection resource. If a collection could not be made, it must
this failure to the user-agent. indicate this failure to the user-agent.
3.2.3 Request 3.2.3 Request
MKCOL creates a new collection resource at the location specified MKCOL creates a new collection resource at the location specified
by the Request-URI. If the Request-URI exists, then MKCOL must by the Request-URI. If the Request-URI exists, then MKCOL must
fail. During MKCOL processing, a server MUST make the Request-URI fail. During MKCOL processing, a server MUST make the Request-URI
a member of its parent collection. If no such an ancestor exists, a member of its parent collection. If no such an ancestor exists,
the method MUST fail. When the MKCOL operation creates a new the method MUST fail. When the MKCOL operation creates a new
collection resource, all ancestors MUST already exist, or the collection resource, all ancestors MUST already exist, or the
method MUST fail with a 409 Conflict status code. For example, method MUST fail with a 409 Conflict status code. For example,
skipping to change at line 1300 skipping to change at line 1323
3.3.2 DisplayName Property 3.3.2 DisplayName Property
Name: http://www.ietf.org/standards/dav/displayname Name: http://www.ietf.org/standards/dav/displayname
Purpose: A name for the resource that is suitable for Purpose: A name for the resource that is suitable for
presentation to a user. presentation to a user.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Value: Any valid XML character data (as defined in [Bray, Value: Any valid XML character data (as defined in [Bray,
Sperberg-McQueen, 1997]) 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 a description of the resource resources. If present, the property contains a description of the
that is suitable for presentation to a user. resource that is suitable for presentation to a user.
3.3.3 CreationDate3 Property 3.3.3 CreationDate Property
Name: http://www.ietf.org/standards/dav/creationdate Name: http://www.ietf.org/standards/dav/creationdate
Purpose: The time and 4date the resource was created. Purpose: The time and date the resource was created.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
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] [ISO8601]
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 the resource was created (i.e., the moment it had non-null
state). state).
3.3.4 GETentity Property5 3.3.4 GETentity Property
Name: http://www.ietf.org/standards/dav/GETentity Name: http://www.ietf.org/standards/dav/GETentity
Purpose: Contains the value of headers that are returned by a Purpose: Contains the value of headers that are returned by a
GET without Accept headers. GET without Accept headers.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Value: Content-Type Content-Length Content-Language Last- Value: Content-Type Content-Length Content-Language Last-
Modified Etag Creation-Date Modified Etag Creation-Date
Description: This property MUST be defined on all DAV compliant Description: This property MUST be defined on all DAV compliant
resources unless GET is not supported, in which case this resources unless GET is not supported, in which case this
property MUST NOT be defined. This property MUST contain at most property MUST NOT be defined. This property MUST contain at most
skipping to change at line 1363 skipping to change at line 1387
returned by an INDEX on the resource. If no content-type is returned by an INDEX on the resource. If no content-type is
available, this element MUST NOT be defined. available, this element MUST NOT be defined.
3.3.7 Content-Length XML Element 3.3.7 Content-Length XML Element
Name: http://www.ietf.org/standards/dav/content-length Name: http://www.ietf.org/standards/dav/content-length
Purpose: Describes the default content-length of the resource. Purpose: Describes the default content-length of the resource.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Value: content-length ; see section 14.14 of RFC 2068 Value: content-length ; see section 14.14 of RFC 2068
Description: If the parent of this element is GETentity, this Description: If the parent of this element is GETentity, this
element MUST have a value equal to the content-length header element MUST have a value equal to the content-length header
returned by a GET on the resource without Accept headers. If the returned by a GET on the resource without Accept headers. If the
parent is INDEXentity, the value MUST be identical to the parent is INDEXentity, the value MUST be identical to the
content- content-length returned by an INDEX on the resource. If no
length returned by an INDEX on the resource. If no content- content-length is available, this element MUST NOT be defined.
length is available, this element MUST NOT be defined.
3.3.8 Content-Language XML Element 3.3.8 Content-Language XML Element
Name: http://www.ietf.org/standards/dav/content-language Name: http://www.ietf.org/standards/dav/content-language
Purpose: Describes the default natural language of a resource. Purpose: Describes the default natural language of a resource.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Value: language-tag ;language-tag is defined in section Value: language-tag ;language-tag is defined in section
14.13 of RFC 2068 14.13 of RFC 2068
Description: If the parent of this element is GETentity, this Description: If the parent of this element is GETentity, this
element MUST have a value equal to the content-language header element MUST have a value equal to the content-language header
returned by a GET on the resource without Accept headers. If the returned by a GET on the resource without Accept headers. If the
parent is INDEXentity, the value MUST be identical to the parent is INDEXentity, the value MUST be identical to the
content- content-language header returned by an INDEX on the resource. If
language header returned by an INDEX on the resource. If no no content-language header is available, this element MUST NOT be
content-language header is available, this element MUST NOT be
defined. defined.
3.3.9 Last-Modified XML Element 3.3.9 Last-Modified XML Element
Name: http://www.ietf.org/standards/dav/last-modified Name: http://www.ietf.org/standards/dav/last-modified
Purpose: The date the resource was last modified. Purpose: The date the resource was last modified.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: GETentity or INDEXentity Parent: GETentity or INDEXentity
Value: The date MUST be given in RFC 1123 format (rfc-1123 Value: The date MUST be given in RFC 1123 format using the
production, defined in section 3.3.1 of [Fielding et al., 1997] rfc-1123 production, defined in section 3.3.1 of [Fielding et al.,
1997].
Description: If the parent of this element is GETentity, this Description: If the parent of this element is GETentity, this
element MUST have a value equal to the last-modified header element MUST have a value equal to the last-modified header
returned by a GET on the resource without Accept headers. If the returned by a GET on the resource without Accept headers. If the
parent is INDEXentity, the value MUST be identical to the last- parent is INDEXentity, the value MUST be identical to the last-
modified header returned by an INDEX on the resource. If no modified header returned by an INDEX on the resource. If no
last- last-modified header is available, this element MUST NOT be defined.
modified header is available, this element MUST NOT be defined.
3.3.10 Etag XML Element 3.3.10 Etag XML Element
Name: http://www.ietf.org/standards/dav/etag Name: http://www.ietf.org/standards/dav/etag
Purpose: The entity tag of the resource. Purpose: The entity tag of the resource.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: GETentity or INDEXentity Parent: GETentity or INDEXentity
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: If the parent of this element is GETentity, this Description: If the parent of this element is GETentity, this
skipping to change at line 1438 skipping to change at line 1460
- must allow a client to discover the members of a collection - must allow a client to discover the members of a collection
- must always provide a machine-readable description of the - must always provide a machine-readable description of the
membership of a collection membership of a collection
- must be leveraged as a more general mechanism to provide a - must be leveraged as a more general mechanism to provide a
list of contents for any resource which can profitably return a list of contents for any resource which can profitably return a
membership like listing. membership like listing.
3.4.3 The Request 3.4.3 The Request
The INDEX method returns a machine-readable representation of the The INDEX method returns a machine-readable representation of the
membership of the resource at the Request-URI. 6 membership of the resource at the Request-URI.
For a collection, INDEX MUST return a 7list of its members. All For a collection, INDEX MUST return a list of its members. All
WebDAV compliant resources MUST support the text/xml response WebDAV compliant resources MUST support the text/xml response
entity described below. The INDEX result for a collection MAY entity described below. The INDEX result for a collection MAY
also return a list of the members of child collections, to any also return a list of the members of child collections, to any
depth. depth.
Collections that respond to an INDEX method with a text/xml Collections that respond to an INDEX method with a text/xml
entity MUST contain only one ResInfo element. This ResInfo entity MUST contain only one ResInfo element. This ResInfo
element contains an Href element, which gives the identifier(s) element contains an Href element, which gives the identifier(s)
of the resource, a Prop element, which gives selected properties of the resource, a Prop element, which gives selected properties
of the resource, and a Members element, which contains a ResInfo of the resource, and a Members element, which contains a ResInfo
skipping to change at line 1452 skipping to change at line 1474
entity described below. The INDEX result for a collection MAY entity described below. The INDEX result for a collection MAY
also return a list of the members of child collections, to any also return a list of the members of child collections, to any
depth. depth.
Collections that respond to an INDEX method with a text/xml Collections that respond to an INDEX method with a text/xml
entity MUST contain only one ResInfo element. This ResInfo entity MUST contain only one ResInfo element. This ResInfo
element contains an Href element, which gives the identifier(s) element contains an Href element, which gives the identifier(s)
of the resource, a Prop element, which gives selected properties of the resource, a Prop element, which gives selected properties
of the resource, and a Members element, which contains a ResInfo of the resource, and a Members element, which contains a ResInfo
element for each member of the collection. The Prop element MUST element for each member of the collection. The Prop element MUST
contain at least the following properties, if they are defined contain at least the following properties, if they are defined
and available8: DisplayName, IsCollection, CreationDate, and available: DisplayName, IsCollection, CreationDate,
GETentity, and INDEXentity. GETentity, and INDEXentity.
The response from INDEX is cacheable, and SHOULD be accompanied The response from INDEX is cacheable, and SHOULD be accompanied
by an ETag header (see section 13.3.4 of RFC 2068). If GET and by an ETag header (see section 13.3.4 of RFC 2068). If GET and
INDEX return different entities for the same resource state, they INDEX return different entities for the same resource state, they
MUST return different entity tags. MUST return different entity tags.
3.4.4 The Response 3.4.4 The Response
200 (OK) - The server MUST send a machine readable response 200 (OK) - The server MUST send a machine readable response
entity which describes the membership of the resource. entity which describes the membership of the resource.
3.4.5 ResInfo XML Element 3.4.5 ResInfo XML Element
Name: http://www.ietf.org/standards/dav/resinfo Name: http://www.ietf.org/standards/dav/resinfo
Purpose: Describes a resource. Purpose: Describes a resource.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: Any Parent: Any
Value: Href Prop Members9 Value: Href Prop Members
Description: There MUST be at least one Href element. Each Href Description: There MUST be at least one Href element. Each Href
element contains a URI for the resource, which MUST be an element contains a URI for the resource, which MUST be an
absolute URI. There MUST be a single Prop element that contains a absolute URI. There MUST be a single Prop element that contains a
series of properties defined on the resource. If the resource is series of properties defined on the resource. If the resource is
a collection, it MAY have at most one Members element, which a collection, it MAY have at most one Members element, which
describes the members of the collection. describes the members of the collection.
3.4.6 Members XML Element 3.4.6 Members XML Element
Name: http://www.ietf.org/standards/dav/members Name: http://www.ietf.org/standards/dav/members
skipping to change at line 1484 skipping to change at line 1507
element contains a URI for the resource, which MUST be an element contains a URI for the resource, which MUST be an
absolute URI. There MUST be a single Prop element that contains a absolute URI. There MUST be a single Prop element that contains a
series of properties defined on the resource. If the resource is series of properties defined on the resource. If the resource is
a collection, it MAY have at most one Members element, which a collection, it MAY have at most one Members element, which
describes the members of the collection. describes the members of the collection.
3.4.6 Members XML Element 3.4.6 Members XML Element
Name: http://www.ietf.org/standards/dav/members Name: http://www.ietf.org/standards/dav/members
Purpose: Describes the membership of a collection resource. Purpose: Describes the membership of a collection resource.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: ResInfo Parent: ResInfo
Value: ResInfo Value: ResInfo
Description: Contains zero or more ResInfo elements, which Description: Contains zero or more ResInfo elements, which
describe members of the collection. describe members of the collection.
3.4.7 Href XML Element 3.4.7 Href XML Element
10
Name: http://www.ietf.org/standards/dav/href Name: http://www.ietf.org/standards/dav/href
Purpose: To identify that the content of the element is a URI. Purpose: To identify that the content of the element is a URI.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: Any Parent: Any
Value: URI ; See section 3.2.1 of [Fielding et al., 1997] Value: URI ; See section 3.2.1 of [Fielding et al., 1997]
3.4.8 Example 3.4.8 Example
INDEX /user/yarong/dav_drafts/ HTTP/1.1 INDEX /user/yarong/dav_drafts/ HTTP/1.1
Host: www.microsoft.com Host: www.microsoft.com
skipping to change at line 1571 skipping to change at line 1593
<Content-Language>en</Content-Language> <Content-Language>en</Content-Language>
<Last-Modified> <Last-Modified>
Fri, 22 Aug 1997 18:22:56 GMT Fri, 22 Aug 1997 18:22:56 GMT
</Last-Modified> </Last-Modified>
<Etag>"8675309"</Etag> <Etag>"8675309"</Etag>
</GETentity> </GETentity>
</Prop> </Prop>
</ResInfo> </ResInfo>
</Members> </Members>
</D:ResInfo> </D:ResInfo>
This example shows the result of the INDEX method applied to the This example shows the result of the INDEX method applied to the
collection resource collection resource
http://www.microsoft.com/user/yarong/dav_drafts/. It returns a http://www.microsoft.com/user/yarong/dav_drafts/. It returns a
response body in XML format, which gives information about the response body in XML format, which gives information about the
container and its sole member, container and its sole member,
http://www.microsoft.com/user/yarong/dav_drafts/base. The entry http://www.microsoft.com/user/yarong/dav_drafts/base. The entry
on the collection confirms that resource the INDEX was executed
on is a collection. The result also contains the URI of the on the collection confirms that the resource the INDEX was
IsCollection property on the member resource. executed on is a collection. The result also contains the URI of
the IsCollection property on the member resource.
3.5 Behavior of RFC 2068 Methods on Collections 3.5 Behavior of RFC 2068 Methods on Collections
With the introduction of the collection resource type to the HTTP With the introduction of the collection resource type to the HTTP
object model, it is necessary to define the behavior of the object model, it is necessary to define the behavior of the
existing methods (defined in RFC 2068) when invoked on a existing methods (defined in RFC 2068) when invoked on a
collection resource to avoid ambiguity. While some methods, such collection resource to avoid ambiguity. While some methods, such
as OPTIONS and TRACE behave identically when applied to as OPTIONS and TRACE behave identically when applied to
collections, GET, HEAD, POST, PUT, and DELETE require some collections, GET, HEAD, POST, PUT, and DELETE require some
additional explanation. additional explanation.
skipping to change at line 1636 skipping to change at line 1661
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, 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 if resource /a/b/c/d.html is to be created and /a/b/c/ does not
exist, then the request MUST fail. exist, then the request MUST fail.
3.5.3.1 PUT for Non-Collection Resources 3.5.3.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, but MUST NOT change the value of any dead entity of the resource, but MUST NOT change the value of any dead
properties defined on the resource. Live properties defined on properties defined on the resource. Live properties defined on
the resource MAY be recomputed during PUT processing. the resource MAY be recomputed during PUT processing.
3.5.4 DELETE for Collections 3.5.4 DELETE for Collections
When DELETE is applied to a collection without internal members When DELETE is applied to a collection without internal members
the collection resource, along with its properties, and external the collection resource, along with its properties, and external
members, MUST be deleted. A DELETE method applied to a members, MUST be deleted. A DELETE method applied to a
collection resource containing internal member resources MUST collection resource containing internal member resources MUST
fail with a 409 Conflict status code1112. fail with a 409 Conflict status code.
3.5.5 13DELETE Method for Non-Collection Resources 3.5.5 DELETE Method for Non-Collection Resources
If the DELETE method is issued to a non-collection resource which If the DELETE method is issued to a non-collection resource which
is an internal member of a collection, then during DELETE is an internal member of a collection, then during DELETE
processing a server MUST remove the Request-URI from its parent processing a server MUST remove the Request-URI from its parent
collection. A server MAY remove the URI of a deleted resource collection. A server MAY remove the URI of a deleted resource
from any collections of which the resource is an external member. from any collections of which the resource is an external member.
3.6 COPY Method 3.6 COPY Method
3.6.1 Problem Description 3.6.1 Problem Description
skipping to change at line 1709 skipping to change at line 1736
properties at the destination resource. Since they are live properties at the destination resource. Since they are live
properties, the server determines the syntax and semantics (hence properties, the server determines the syntax and semantics (hence
value) of these properties. Properties named by the Enforce- value) of these properties. Properties named by the Enforce-
Live- Live-
Properties header MUST be live on the destination resource, or Properties header MUST be live on the destination resource, or
the method MUST fail. If a property is not named by Enforce- the method MUST fail. If a property is not named by Enforce-
Live- Live-
Properties and cannot be copied live, then its value MUST be Properties and cannot be copied live, then its value MUST be
duplicated, octet-for-octet, in an identically named, dead duplicated, octet-for-octet, in an identically named, dead
resource on the destination resource. resource on the destination resource.
If a property on the source already exists on the resource and If a property on the source already exists on the resource and
the overwrite header is set to TRUE then the property at the the overwrite header is set to TRUE then the property at the
destination MUST be overwritten with the property from the destination MUST be overwritten with the property from the
source. If the overwrite header is false and the previous source. If the overwrite header is false and the previous
situation exists then the COPY MUST fail with a 409 Conflict. situation exists then the COPY MUST fail with a 409 Conflict.
3.6.3.3 COPY for Collections 3.6.3.3 COPY for Collections
A COPY on a collection causes a collection resource to be created A COPY on a collection causes a new, empty collection resource to
at the destination with the same properties, but without any be created at the destination with the same properties as the
members, internal or external. All properties on the source source resource. All properties on the source collection MUST be
collection are copied over to the destination collection. Where duplicated on the destination collection, subject to modifying
there is a conflict the source properties will overwrite the headers, following the definition for copying properties. The
destination properties. Any members at theMUST be duplicated on new collection MUST NOT contain any members, internal or
the destination collection, subject to modifying headers, external.
following the definition for copying properties.
3.6.3.4 Type Interactions 3.6.3.4 Type Interactions
If the destination resource identifies a property and the source If the destination resource identifies a property and the source
resource is not a property, then the copy SHOULD fail. resource is not a property, then the copy SHOULD fail.
If the destination resource identifies a collection and the If the destination resource identifies a collection and the
Overwrite header is "true," prior to performing the copy, the Overwrite header is "true," prior to performing the copy, the
server MUST perform a DELETE operation on the collection. server MUST perform a DELETE operation on the collection.
3.6.4 The Response 3.6.4 The Response
200 (OK) The source resource was successfully copied to a pre- 200 (OK) The source resource was successfully copied to a pre-
existing destination resource. existing destination resource.
201 (Created) The source resource was successfully copied. The 201 (Created) The source resource was successfully copied. The
copy operation resulted in the creation of a new resource. copy operation resulted in the creation of a new resource.
412 (Precondition Failed) This status code MUST be returned if 412 (Precondition Failed) This status code MUST be returned if
the server was unable to maintain the liveness of the properties the server was unable to maintain the liveness of the properties
listed in the Enforce-Live-Properties header, or if the Overwrite listed in the Enforce-Live-Properties header, or if the Overwrite
header is false, and the state of the destination resource is header is false, and the state of the destination resource is
non- non-null.
null.
417 (Insufficient Space on Resource) - The destination resource 417 (Insufficient Space on Resource) - The destination resource
does not have sufficient space to record the state of the does not have sufficient space to record the state of the
resource after the execution of this method. resource after the execution of this method.
500 (Server Error) The resource was in such a state that it could 500 (Server Error) The resource was in such a state that it could
not be copied. This may occur if the Destination header specifies not be copied. This may occur if the Destination header specifies
a resource that is outside the namespace the resource is able to a resource that is outside the namespace the resource is able to
interact with. interact with.
3.6.5 Examples 3.6.5 Examples
3.6.5.1 Overwrite Example 3.6.5.1 Overwrite Example
This example shows resource This example shows resource
skipping to change at line 1831 skipping to change at line 1862
operation, subject to the restrictions of the overwrite header. operation, subject to the restrictions of the overwrite header.
3.7.4 The Response 3.7.4 The Response
200 (OK) - The resource was moved. A successful response must 200 (OK) - The resource was moved. A successful response must
contain the Content-Location header, set equal to the URI in contain the Content-Location header, set equal to the URI in
source. This lets caches properly flush any cached entries for source. This lets caches properly flush any cached entries for
the source. Unfortunately the Content-Location header only allows the source. Unfortunately the Content-Location header only allows
a single value so it is not possible for caches unfamiliar with a single value so it is not possible for caches unfamiliar with
the MOVE method to properly clear their caches. the MOVE method to properly clear their caches.
412 (Precondition Failed) This status code MUST be returned if 412 (Precondition Failed) This status code MUST be returned if
the server was unable to maintain the liveness of the properties the server was unable to maintain the liveness of the properties
listed in the Enforce-Live-Properties header, or if the Overwrite listed in the Enforce-Live-Properties header, or if the Overwrite
header is false, and the state of the destination resource is header is false, and the state of the destination resource is
non- non-null.
null.
501 (Not Implemented) - This may occur if the Destination header 501 (Not Implemented) - This may occur if the Destination header
specifies a resource which is outside its domain of control specifies a resource which is outside its domain of control
(e.g., stored on another server) resource and the server either (e.g., stored on another server) resource and the server either
refuses or is incapable of moving to an external resource. refuses or is incapable of moving to an external resource.
502 (Bad Gateway) - This may occur when moving to external 502 (Bad Gateway) - This may occur when moving to external
resources and the destination server refused to accept the resources and the destination server refused to accept the
resource. resource.
3.7.5 Examples 3.7.5 Examples
3.7.5.1 Overwrite Example 3.7.5.1 Overwrite 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
skipping to change at line 2021 skipping to change at line 2059
in the element: XML-SPACE = "PRESERVE". in the element: XML-SPACE = "PRESERVE".
3.10.4.3 Delete 3.10.4.3 Delete
Name: http://www.ietf.org/standards/dav/patch/delete Name: http://www.ietf.org/standards/dav/patch/delete
Purpose: Removes the specified range of octets. Purpose: Removes the specified range of octets.
Schema: http://www.ietf.org/standards/dav/patch/ Schema: http://www.ietf.org/standards/dav/patch/
Parent: ResourceUpdate Parent: ResourceUpdate
Value: The Delete XML element MUST contain an octet-range Value: The Delete XML element MUST contain an octet-range
XML element. XML element.
Discussion: The octets that are deleted are removed, which means
Discussion: The octets that are deleted are removed, which means
the resource is collapsed and the length of the resource is the resource is collapsed and the length of the resource is
decremented by the size of the octet range. It is not decremented by the size of the octet range. It is not
appropriate to replace deleted octets with zeroed-out octets, appropriate to replace deleted octets with zeroed-out octets,
since zero is a valid octet value. since zero is a valid octet value.
3.10.4.4 Replace 3.10.4.4 Replace
Name: http://www.ietf.org/standards/dav/patch/replace Name: http://www.ietf.org/standards/dav/patch/replace
Purpose: Replaces the specified range of octets with the Purpose: Replaces the specified range of octets with the
contents of the XML element. If the number of octets in the XML contents of the XML element. If the number of octets in the XML
skipping to change at line 2105 skipping to change at line 2151
</BODY> </BODY>
</HTML> </HTML>
PATCH Request: Response: PATCH Request: Response:
PATCH hello.html HTTP/1.1 PATCH hello.html HTTP/1.1
Host: www.example.org Host: www.example.org
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxx Content-Length: xxx
HTTP/1.1 100 Continue HTTP/1.1 100 Continue
<?XML:Namespace href = <?XML:Namespace href =
"http://www.ietf.org/standards/dav/patch/" AS = "D"/> Shttp://www.ietf.org/standards/dav/patch/" AS = "D"/>
<D:ResourceUpdate> <D:ResourceUpdate>
<Replace XML-SPACE = "PRESERVE"><octet-range>14</octet- <Replace XML-SPACE = "PRESERVE"><octet-range>14</octet-
range>&003CTITLE&003ENew Title&003C/TITLE&003E</Replace> range>&003CTITLE&003ENew Title&003C/TITLE&003E</Replace>
<Delete><octet-range>38-50</Delete> <Delete><octet-range>38-50</Delete>
<Insert XML-SPACE = "PRESERVE"><octet- <Insert XML-SPACE = "PRESERVE"><octet-range>86</>&
range>86</>&003CP&003ENew paragraph&003C/P&003E</Insert> 003CP&003ENew paragraph&003C/P&003E</Insert>
</D:ResourceUpdate> </D:ResourceUpdate>
HTTP/1.1 200 OK HTTP/1.1 200 OK
After: After:
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>New Title</TITLE> <TITLE>New Title</TITLE>
</HEAD> </HEAD>
<BODY> <BODY>
<P>Hello, world!</P> <P>Hello, world!</P>
<P>New paragraph</P> <P>New paragraph</P>
</BODY> </BODY>
</HTML> </HTML>
14
3.11 Headers 3.11 Headers
3.11.1 Destination Header 3.11.1 Destination Header
The Destination header specifies a destination resource for The Destination header specifies a destination resource for
methods such as COPY and MOVE, which take two URIs as parameters. methods such as COPY and MOVE, which take two URIs as parameters.
Destination= "Destination" ":" URI Destination= "Destination" ":" URI
3.11.2 Enforce-Live-Properties Header 3.11.2 Enforce-Live-Properties Header
The Enforce-Live-Properties header specifies properties that MUST The Enforce-Live-Properties header specifies properties that MUST
be "live" after they are copied (moved) to the destination be "live" after they are copied (moved) to the destination
resource of a copy (or move). If the value "*" is given for the resource of a copy (or move). If the value "*" is given for the
header, then it designates all live properties on the source header, then it designates all live properties on the source
resource. If the value is "Omit" then the server MUST NOT resource. If the value is "Omit" then the server MUST NOT
duplicate on the destination resource any properties that are duplicate on the destination resource any properties that are
defined on the source resource. If this header is not included defined on the source resource. If this header is not included
then the server is expected to act as defined by the default then the server is expected to act as defined by the default
property handling behavior of the associated method. property handling behavior of the associated method.
EnforceLiveProperties = "Enforce-Live-Properties" ":" ("*" |
EnforceLiveProperties = "Enforce-Live-Properties" ":" ("*" |
"Omit" | 1#(Property-Name)) "Omit" | 1#(Property-Name))
Property-Name = "<" URI ">" Property-Name = "<" URI ">"
3.11.3 Overwrite Header 3.11.3 Overwrite Header
The Overwrite header specifies whether the server should The Overwrite header specifies whether the server should
overwrite the state of a non-null destination resource during a overwrite the state of a non-null destination resource during a
COPY or MOVE. A value of "false" states that the server MUST NOT COPY or MOVE. A value of "false" states that the server MUST NOT
perform the COPY or MOVE operation if the state of the perform the COPY or MOVE operation if the state of the
destination resource is non-null. By default, the value of destination resource is non-null. By default, the value of
Overwrite is "true," and a client MAY omit this header from a Overwrite is "true," and a client MAY omit this header from a
request when its value is "true." While the Overwrite header request when its value is "true." While the Overwrite header
appears to duplicate the functionality of the If-Match: * header appears to duplicate the functionality of the If-Match: * header
of HTTP/1.1, If-Match applies only to the Request-URI, and not to of HTTP/1.1, If-Match applies only to the Request-URI, and not to
the Destination of a COPY or MOVE. the Destination of a COPY or MOVE.
skipping to change at line 2161 skipping to change at line 2207
The Overwrite header specifies whether the server should The Overwrite header specifies whether the server should
overwrite the state of a non-null destination resource during a overwrite the state of a non-null destination resource during a
COPY or MOVE. A value of "false" states that the server MUST NOT COPY or MOVE. A value of "false" states that the server MUST NOT
perform the COPY or MOVE operation if the state of the perform the COPY or MOVE operation if the state of the
destination resource is non-null. By default, the value of destination resource is non-null. By default, the value of
Overwrite is "true," and a client MAY omit this header from a Overwrite is "true," and a client MAY omit this header from a
request when its value is "true." While the Overwrite header request when its value is "true." While the Overwrite header
appears to duplicate the functionality of the If-Match: * header appears to duplicate the functionality of the If-Match: * header
of HTTP/1.1, If-Match applies only to the Request-URI, and not to of HTTP/1.1, If-Match applies only to the Request-URI, and not to
the Destination of a COPY or MOVE. the Destination of a COPY or MOVE.
Overwrite = "Overwrite" ":" ("true" | "false") Overwrite = "Overwrite" ":" ("true" | "false")
If there is a conflict and the Overwrite header equals "true", or If there is a conflict and the Overwrite header equals "true", or
is absent and thus defaults to "true", then the method MUST fail is absent and thus defaults to "true", then the method MUST fail
with a 409 Conflict. with a 409 Conflict.
3.11.4 Destroy Header15 3.11.4 Destroy Header
When deleting a resource the client often wishes to specify When deleting a resource the client often wishes to specify
exactly what sort of delete is being enacted. The Destroy header, exactly what sort of delete is being enacted. The Destroy header,
used with the Mandatory header, allows the client to specify the used with the Mandatory header, allows the client to specify the
end result they desire. The Destroy header is specified as end result they desire. The Destroy header is specified as
follows: follows:
The Undelete token requests that, if possible, the resource The Undelete token requests that, if possible, the resource
should be left in a state such that it can be undeleted. The should be left in a state such that it can be undeleted. The
server is not required to honor this request. server is not required to honor this request.
The NoUndelete token requests that the resource MUST NOT be left The NoUndelete token requests that the resource MUST NOT be left
in a state such that it can be undeleted. in a state such that it can be undeleted.
The VersionDestroy token includes the functionality of the The VersionDestroy token includes the functionality of the
NoUndelete token and extends it to include having the server NoUndelete token and extends it to include having the server
remove all versioning references to the resource that it has remove all versioning references to the resource that it has
control over. control over.
DestroyHeader = "Destroy" ":" #Choices DestroyHeader = "Destroy" ":" #Choices
Choices = "VersionDestroy" | "NoUndelete" | "Undelete" | token Choices = "VersionDestroy" | "NoUndelete" | "Undelete" | token
|"<" URI ">" ; a token extension MUST NOT be used unless it is |"<" URI ">" ; a token extension MUST NOT be used unless it is
specified in a RFC16, otherwise a URI MUST be used for specified in a RFC16, otherwise a URI MUST be used for
extensions. extensions.
3.11.5 Collection-Member Header 3.11.5 Collection-Member Header
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.
CollectionMember = "Collection-Member" ":" URI CollectionMember = "Collection-Member" ":" URI
3.12 Links 3.12 Links
3.12.1 Source Link Property Type 3.12.1 Source Link Property Type
Name: http://www.ietf.org/standards/dav/link/source Name: http://www.ietf.org/standards/dav/link/source
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 resource that contains the unprocessed source of the link’s
source. source.
skipping to change at line 2202 skipping to change at line 2256
CollectionMember = "Collection-Member" ":" URI CollectionMember = "Collection-Member" ":" URI
3.12 Links 3.12 Links
3.12.1 Source Link Property Type 3.12.1 Source Link Property Type
Name: http://www.ietf.org/standards/dav/link/source Name: http://www.ietf.org/standards/dav/link/source
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 resource that contains the unprocessed source of the link’s
source. source.
Schema: http://www.ietf.org/standards/dav/link/ Schema: http://www.ietf.org/standards/dav/link/
Parent: Any Parent: Any
Value: An XML document with zero or more link XML Value: An XML document with zero or more link XML
elements. elements.
Discussion: The source of the link (src) is typically the URI of
Discussion: The source of the link (src) is typically the URI of
the output resource on which the link is defined, and there is the output resource on which the link is defined, and there is
typically only one destination (dst) of the link, which is the typically only one destination (dst) of the link, which is the
URI where the unprocessed source of the resource may be accessed. URI where the unprocessed source of the resource may be accessed.
When more than one link destination exists, this specification When more than one link destination exists, this specification
asserts no policy on ordering. asserts no policy on ordering.
4 State Tokens 4 State Tokens
4.1 Overview 4.1 Overview
4.1.1 Problem Description 4.1.1 Problem Description
There are times when a principal will want to predicate There are times when a principal will want to predicate
successful execution of a method on the current state of a successful execution of a method on the current state of a
resource. While HTTP/1.1 provides a mechanism for conditional resource. While HTTP/1.1 provides a mechanism for conditional
execution of methods using entity tags via the "If-Match" and execution of methods using entity tags via the "If-Match" and
"If- "If-None-Match" headers, the mechanism is not sufficiently
None-Match" headers, the mechanism is not sufficiently extensible extensibleto express conditional statements involving more
to express conditional statements involving more generic state generic state indicators, such as lock tokens.
indicators, such as lock tokens.
The fundamental issue with entity tags is that they can only be The fundamental issue with entity tags is that they can only be
generated by a resource. However there are times when a client generated by a resource. However there are times when a client
will want to be able to share state tokens between resources, will want to be able to share state tokens between resources,
potentially on different servers, as well as be able to generate potentially on different servers, as well as be able to generate
certain types of lock tokens without first having to communicate certain types of lock tokens without first having to communicate
with a server. with a server.
For example, a principal may wish to require that resource B have For example, a principal may wish to require that resource B have
a certain state in order for a method to successfully execute on a certain state in order for a method to successfully execute on
skipping to change at line 2327 skipping to change at line 2381
Labeled name/value pairs are used within the token to allow new Labeled name/value pairs are used within the token to allow new
fields to be added. Processors of state tokens MUST be prepared fields to be added. Processors of state tokens MUST be prepared
to accept the fields in whatever order they are present and MUST to accept the fields in whatever order they are present and MUST
ignore any fields they do not understand. ignore any fields they do not understand.
The "Type" field specifies the type of the state information The "Type" field specifies the type of the state information
encoded in the state token. A URL is used in order to avoid encoded in the state token. A URL is used in order to avoid
namespace collisions. namespace collisions.
The "Res" field identifies the resource for which the state token The "Res" field identifies the resource for which the state token
specifies a particular state. Since commas and spaces are specifies a particular state. Since commas and spaces are
acceptable URL characters, a caret is used to delimit a URL. acceptable URL characters, a caret is used to delimit a URL.
Since a caret is an acceptable URL character, any instances of it Since a caret is an acceptable URL character, any instances of it
must be escaped using the % escape convention. must be escaped using the % escape convention.
The State-Info production is expanded upon in descriptions of The State-Info production is expanded upon in descriptions of
specific state token types, and is intended to contain the state specific state token types, and is intended to contain the state
description information for a particular state token. description information for a particular state token.
4.3 State Token Conditional Headers 4.3 State Token Conditional Headers
4.3.1 If-State-Match 4.3.1 If-State-Match
If-State-Match = "If-State-Match" ":" ("AND" | "OR") 1#("<" If-State-Match = "If-State-Match" ":" ("AND" | "OR") 1#("<"
State- State-Token ">")
Token ">")
The If-State-Match header is intended to have similar The If-State-Match header is intended to have similar
functionality to the If-Match header defined in section 14.25 of functionality to the If-Match header defined in section 14.25 of
RFC 2068. RFC 2068.
If the AND keyword is used and all of the state tokens identify If the AND keyword is used and all of the state tokens identify
the state of the resource, then the server MAY perform the the state of the resource, then the server MAY perform the
requested method. If the OR keyword is used and any of the state requested method. If the OR keyword is used and any of the state
tokens identifies the current state of the resource, then server tokens identifies the current state of the resource, then server
MAY perform the requested method. If neither of the keyword MAY perform the requested method. If neither of the keyword
skipping to change at line 2379 skipping to change at line 2432
the server SHOULD respond with a 304 (Not Modified) response, the server SHOULD respond with a 304 (Not Modified) response,
including the cache-related entity-header fields (particularly including the cache-related entity-header fields (particularly
ETag) of the current state of the resource. For all other ETag) of the current state of the resource. For all other
request methods, the server MUST respond with a status of 412 request methods, the server MUST respond with a status of 412
(Precondition Failed). (Precondition 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.
Note that the "AND" and "OR" keywords specified with the If- Note that the "AND" and "OR" keywords specified with the If-
State- State-Match header are intentionally not defined for If-None-
Match header are intentionally not defined for If-None-State- State-Match, because this functionality is not required.
Match, because this functionality is not required.
4.4 State Token Header 4.4 State Token Header
State-Token-Header = "State-Token" ":" 1#("<" State-Token ">") State-Token-Header = "State-Token" ":" 1#("<" State-Token ">")
The State Token header is intended to have similar functionality The State Token header is intended to have similar functionality
to the etag header defined in section 14.20 of RFC 2068. The to the etag header defined in section 14.20 of RFC 2068. The
purpose of the tag is to return state tokens defined on a purpose of the tag is to return state tokens defined on a
resource in a response. The contents of the state-token are not resource in a response. The contents of the state-token are not
guaranteed to be exhaustive and are generally used to return a guaranteed to be exhaustive and are generally used to return a
new state token that has been defined as the result of a method. new state token that has been defined as the result of a method.
For example, if a LOCK method were successfully executed on a For example, if a LOCK method were successfully executed on a
resource the response would include a state token header with the resource the response would include a state token header with the
lock state token included. lock state token included.
4.5 E-Tags 4.5 E-Tags
E-tags have already been deployed using the If-Match and If-None- E-tags have already been deployed using the If-Match and If-None-
Match headers. Introducing two mechanisms to express e-tags Match headers. Introducing two mechanisms to express e-tags
skipping to change at line 2405 skipping to change at line 2458
4.5 E-Tags 4.5 E-Tags
E-tags have already been deployed using the If-Match and If-None- E-tags have already been deployed using the If-Match and If-None-
Match headers. Introducing two mechanisms to express e-tags Match headers. Introducing two mechanisms to express e-tags
would only confuse matters, therefore e-tags should continue to would only confuse matters, therefore e-tags should continue to
be expressed using quoted strings and the If-Match and If-None- be expressed using quoted strings and the If-Match and If-None-
Match headers. Match headers.
5 Locking 5 Locking
5.1 Problem Description - Overview 5.1 Locking: Introduction
Locking is used to arbitrate access to a resource amongst Locking is used to arbitrate access to a resource amongst
principals that have equal access rights to that resource. principals that have equal access rights to that resource.
This draft allows locks to vary over two parameters, the number This specification allows locks to vary over two parameters, the
of principals involved and the type of access to be granted. This number of principals involved and the type of access to be
draft will only provide for the definition of locking for one granted. Furthermore, this document only provides the definition
access type, write. However, the syntax is extensible enough to of locking for one access type, write. However, the syntax is
allow for the specification of other access types. It is a goal extensible, and allows the specification of other access types.
of this proposal that it use the same access verbs as will be
defined in the access control draft.
5.1.1 Exclusive Vs. Shared Locks 5.1.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. In fact, many users so avoid having to constantly merge results. In fact, many users so
dislike having to merge that they would rather serialize their dislike having to merge that they would rather serialize their
access to a resource rather than have to constantly perform access to a resource rather than have to constantly perform
merges. merges.
However, there are times when the goal of a lock is not to However, there are times when the goal of a lock is not to
exclude others from exercising an access right but rather to exclude others from exercising an access right but rather to
provide a mechanism for principals to indicate that they intend provide a mechanism for principals to indicate that they intend
skipping to change at line 2442 skipping to change at line 2493
this case. A shared lock allows multiple principals to receive a this case. A shared lock allows multiple principals to receive a
lock, hence any principal with appropriate access can get the lock, hence any principal with appropriate access can get the
lock. lock.
With shared locks there are two trust sets that affect a With shared locks there are two trust sets that affect a
resource. The first trust set is created by access permissions. resource. The first trust set is created by access permissions.
Principals who are trusted, for example, may have permission to Principals who are trusted, for example, may have permission to
write the resource, those who are not, don't. Among those who write the resource, those who are not, don't. Among those who
have access permission to write the resource, the set of have access permission to write the resource, the set of
principals who have taken out a shared lock also must trust each principals who have taken out a shared lock also must trust each
other, creating a (probably) smaller trust set within the access other, creating a (typically) smaller trust set within the access
permission write set. permission write 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 situations the vast majority of these principals will not have
write access to a given resource. Of the small number who do write access to a given resource. Of the small number who do
have write access, some principals may decide to guarantee their have write access, some principals may decide to guarantee their
edits are free from overwrite conflicts by using exclusive write edits are free from overwrite conflicts by using exclusive write
locks in conjunction with a precondition header (If-State-Match) locks. Others may decide they trust their collaborators (the
that checks for existence of the lock prior to writing the
resource. Others may decide they trust their collaborators (the
potential set of collaborators being the set of principals who 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 is potentially 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 activities. When using shared locks, principals may use any out
of band communication channel to coordinate their work (e.g., of band communication channel to coordinate their work (e.g.,
face-to-face interaction, written notes, post-it notes on the face-to-face interaction, written notes, post-it notes on the
screen, telephone conversation, email). The intent of a shared screen, telephone conversation, email, etc.) The intent of a
lock is to let collaborators know who else is potentially working shared lock is to let collaborators know who else is potentially
on a resource. working on a resource.
Why not use exclusive write locks all the time? Experience from Shared locks are included because experience from web distributed
initial Web distributed authoring systems has indicated that authoring systems has indicated that exclusive write locks are
exclusive write locks are often too rigid. An exclusive write often too rigid. An exclusive write lock is used to enforce a
lock is used to enforce a particular editing process: take out particular editing process: take out exclusive write lock, read
exclusive write lock, read the resource, perform edits, write the the resource, perform edits, write the resource, release the
resource, release the lock. What happens if the lock isn't lock. What happens if the lock isn't released? While the time-
released? While the time-out mechanism provides one solution, if out mechanism provides one solution, if you need to force the
you need to force the release of a lock immediately, it doesn't release of a lock immediately, it doesn't help much. Granted, an
help much. Granted, an administrator can release the lock for administrator can release the lock for you, but this could become
you, but this could become a significant burden for large sites. a significant burden for large sites. In addition there is the
Further, what if the administrator can't be reached immediately? problem that an administrator may not be immediately 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 extremely useful, since often a guarantee of freedom from
overwrite conflicts is exactly what is needed. The solution: overwrite conflicts is what is needed. The tradeoff described in
provide exclusive write locks, but also provide a less strict this specification is to provide exclusive write locks, but also
mechanism in the form of shared locks which can be used by a set to provide a less strict mechanism in the form of shared locks
of people who trust each other and who have access to a which can be used by a set of people who trust each other and who
communications channel external to HTTP which can be used to have access to a communications channel external to HTTP which
negotiate writing to the resource. can be used to negotiate writing to the resource.
5.1.2 Required Support 5.1.2 Required Support
A DAV compliant server is not required to support locking in any A WebDAV compliant server is not required to support locking in
form. If the server does support locking it may choose to support any form. If the server does support locking it may choose to
any combination of exclusive and shared locks for any access support any combination of exclusive and shared locks for any
types. access types.
The reason for this flexibility is that server implementers have The reason for this flexibility is that server implementers have
said that they are willing to accept minimum requirements on all said that they are willing to accept minimum requirements on all
services but locking. Locking policy strikes to the very heart of services but locking. Locking policy strikes to the very heart of
their resource management and versioning systems and they require their resource management and versioning systems and they require
control over what sort of locking will be made available. For control over what sort of locking will be made available. For
example, some systems only support shared write locks while example, some systems only support shared write locks while
others only provide support for exclusive write locks. As each others only provide support for exclusive write locks while yet
system is sufficiently different to merit exclusion of certain others use no locking at all. As each system is sufficiently
locking features, the authors are proposing that locking be different to merit exclusion of certain locking features, the
allowed as the sole axis of negotiation within DAV. authors are proposing that locking be allowed as the sole axis of
negotiation within WebDAV.
5.2 LOCK Method 5.2 LOCK Method
The following sections describe the LOCK method, which is used to
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 and are independent of the access type of the lock
being requested. Once the general LOCK method has been
described, subsequent sections describe the semantics of the
"write" access type, and the write lock.
5.2.1 Operation 5.2.1 Operation
A lock method invocation creates the lock specified by the Lock- A LOCK method invocation creates the lock specified by the Lock-
Info header on the request-URI. Lock method requests SHOULD NOT Info header on the Request-URI. Lock method requests SHOULD NOT
have a request body. A user-agent SHOULD submit an Owner header have a request body. A user-agent SHOULD submit an Owner header
field with a lock request. field with a lock request.
A successful response to a lock invocation MUST include a Lock- A successful response to a lock invocation MUST include Lock-
Token header. If the server supports a time based lock removal Token and Time-Out headers.
mechanism on the resource, a successful lock invocation SHOULD
return a Time-Out header.
5.2.2 Effect of Locks on Properties and Containers 5.2.2 The Effect of Locks on Properties and Containers
By default a lock affects the entire state of the resource, By default the scope of a lock is the entire state of the
including its associated properties. As such it is illegal to resource, including its body and associated properties. As a
specify a lock on a property. For containers, a lock also affects result, a lock on a resource also locks the resource's
the ability to add or remove members. The nature of the effect properties, and a lock on a property may lock a property's
depends upon the type of access control involved. The Depth resource or may restrict the ability to lock the property's
header expresses the general semantics of a LOCK method request resource. Only a single lock token MUST be used when a lock
when invoked on a collection (note that specific lock types may extends to cover both a resource and its properties. Note that
restrict the effect of a lock, for example limiting the allowable certain lock types MAY override this behavior.
values of the Depth header):
· A Depth header (defined in the namespace draft) may be used
on a LOCK method when the LOCK method is applied to a
collection
resource. The legal values for Depth on a LOCK are 0, 1, and
Infinity. A Depth of 0 instructs the resource to just lock the
container. As previously mentioned, depending on the type of
lock, the lock affects the ability to add or remove members of
the container.
· A Depth of 1 means that the container is locked and a LOCK
is executed on the container’s propagate members with a Depth
of
0 and If-Range, If-Modified-Since, If-Unmodified-Since, If-
Match
and If-None-Match headers are dropped. However, the effects of
the LOCK MUST be atomic in that either the container and all of
its members are locked or no lock is granted. The result of a
Depth 1 lock is a single lock token which represents the lock
on
the container and all of its members. This lock token may be
used
in an If-State-Match or If-Not-State-Match header against any
of
the resources covered by the lock. Since the lock token
represents a lock on all the resources, an UNLOCK using that
token will remove the lock from all included resources, not
just
the resource the UNLOCK was executed on.
· A Depth of infinity means that the LOCK is recursively
executed, with a Depth of infinity, on the collection and all
of
its propagate members and all of their propagate members. As
with
a Depth of 1, the LOCK must be granted in total or not at all.
Otherwise the lock operates in the same manner as a Depth of 1
lock.
The default behavior when locking a container is to act as if a For containers, a lock also affects the ability to add or remove
"Depth: 0" header had been placed on the method. members. The nature of the effect depends upon the type of access
control involved.
5.2.3 Locking Replicated Resources 5.2.3 Locking Replicated Resources
Some servers automatically replicate resources across multiple Some servers automatically replicate resources across multiple
URLs. In such a circumstance the server MAY only accept a lock on URLs. 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 one of the URLs if the server can guarantee that the lock will be
honored across all the URLs. honored across all the URLs.
5.2.4 Interaction with other Methods 5.2.4 Locking Multiple Resources
Only two methods, MOVE and DELETE, have side effects which The LOCK method supports locking multiple resources
involve locks. When a resource is moved, its lock SHOULD be moved 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.
with it. However this may not always be possible and there is The Lock-Tree option of the lock request specifies that the
currently no proposal to create a header which would specify that resource and all its internal children (including internal
the lock request should fail if the resource’s locks can not be collections, and their internal members) are to be locked. This
maintained. A COPY MUST NOT copy any locks on the source resource is another mechanism by which a request for a lock on multiple
over to the destination resource. Deleting a resource MUST remove resources can be specified.
all locks on the resource.
5.2.5 Lock Compatibility Table Currently existing locks can not be extended to cover more or
less resources, and any request to expand or contract the number
of 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 asked to exclusively write lock resources
A, B, and C, the request would fail as A is already locked and
the lock can not be extended.
A successful result will 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 can not be granted to all resources, a 406 Conflict
status code MUST be returned with a response entity body
containing a multiresponse XML element describing which
resource(s) prevented the lock from being granted.
5.2.5 Interaction with other Methods
The interaction of a LOCK with various methods is dependent upon
the lock type. However, independent of lock type, a successful
DELETE of a resource MUST cause all of its locks to be removed.
5.2.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 Lock Current lock state/ Shared Lock Exclusive Lock
Lock request Lock request
None True True None True True
Shared Lock True False Shared Lock True False
Exclusive Lock False False* Exclusive Lock False False*
skipping to change at line 2611 skipping to change at line 2659
granted. *=if the principal requesting the lock is the owner of granted. *=if the principal requesting the lock is the owner of
the lock, the lock MAY be regranted. the lock, the lock MAY 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 intersection of a row and column gives the result of a lock
request. For example, if a shared lock is held on a resource, request. For example, if a shared lock is held on a resource,
and an exclusive lock is requested, the table entry is "false", and an exclusive lock is requested, the table entry is "false",
indicating the lock must not be granted. indicating the lock must not be granted.
If an exclusive lock is re-requested by the principal who owns If an exclusive or shared lock is re-requested by the principal
the lock, the lock MAY be regranted. If the lock is regranted, who owns the lock, the lock MUST be regranted. If the lock is
the same lock token that was previously issued MUST be returned. regranted, the same lock token that was previously issued MUST be
returned.
5.2.6 Status Codes
412 "Precondition Failed" - The included state-token was not 5.2.7 Status Codes
enforceable on this resource.
416 "Locked" - The resource is locked so the method has been 409 "Conflict" - The resource is locked, so the method has been
rejected. rejected.
5.2.7 Example 412 "Precondition Failed" - The included state-token was not
enforceable on this resource or the request in the lock-info
LOCK /workspace/webdav/proposal.doc HTTP/1.1 header could not be satisfied by the server.
Host: webdav.sb.aol.com
Lock-Info: LockType=Write LockScope=Exclusive
Owner: <http://www.ics.uci.edu/~ejw/contact.html>
HTTP/1.1 200 OK
State-Token: StateToken:Type=^DAV:/LOCK/DAVLOCK^:Res=^http://www.
ics.uci.edu/workspace/webdav/proposal.doc^:LockType=Write:LockSco
pe=Exclusive:ServerID=12382349AdfFFF
Time-Out: ClockType=Activity TimeType=second;604800
This example shows the successful creation of an exclusive write
lock on resource
http://webdav.sb.aol.com/workspace/webdav/proposal.doc. The
resource http://www.ics.uci.edu/~ejw/contact.html contains
contact information for the owner of the lock. The server has an
activity-based timeout policy in place on this resource, which
causes the lock to automatically be removed after 1 week (604800
seconds). The response has a Lock-Token header that gives the
state token URL for the lock token generated by this lock
request.
5.2.8 Lock-Info Request Header 5.2.8 Lock-Info Request Header
The Lock-Info header specifies the scope and type of a lock for a The Lock-Info request header specifies the scope and type of a
LOCK method request. The syntax specification below is lock for a LOCK method request. The syntax specification below is
extensible, allowing new type and scope identifiers to be added. extensible, allowing new type and scope identifiers to be added.
LockInfo = "Lock-Info" ":" DAVLockType SP DAVLockScope CRLF
LockInfo = "Lock-Info" ":" DAVLockType SP DAVLockScope [SP
AdditionalLocks] [SP Lock-Tree]
DAVLockType = "LockType" "=" DAVLockTypeValue DAVLockType = "LockType" "=" DAVLockTypeValue
DAVLockTypeValue = ("Write" | *(uchar | reserved)) DAVLockTypeValue = ("Write" | *(uchar | reserved))
DAVLockScope = "LockScope" "=" DAVLockScopeValue DAVLockScope = "LockScope" "=" DAVLockScopeValue
DAVLockScopeValue = ("Exclusive" |"Shared" | *(uchar | reserved)) DAVLockScopeValue = ("Exclusive" |"Shared" | *(uchar | reserved))
AdditionalLocks = "AddLocks" "=" 1*("<" URI ">")
Lock-Tree = "Lock-Tree" "=" ("True" | "False")
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 "true", the lock
request applies to the hierarchy traversal of the internal
members 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 true, and the Request-URI or the AddLocks
URIs have no internal member resources. By default, the value of
LockTree is "false", and this field MAY be omitted when its value
is false.
5.2.9 Owner Request Header 5.2.9 Owner Request Header
5.2.9.1 Problem Description 5.2.9.1 Problem Description
When discovering the list of owners of locks on a resource, a When discovering the list of owners of locks on a resource, a
principal may want to be able to contact the owner directly. For principal may want to be able to contact the owner directly. For
this to be possible the lock discovery mechanism must provide this to be possible the lock discovery mechanism must provide
enough information for the lock owner to be contacted. enough information for the lock owner to be contacted.
Additionally, programs may wish to be able to record structured
information in the owner header so that other programs may be
able to parse it later. Note, however, that these programs may
not necessarily be coordinating so there need be no guarantee
that the information can be parsed.
5.2.9.2 Solution Requirements 5.2.9.2 Solution Requirements
Not all systems have authentication procedures that provide Not all systems have authentication procedures that provide
sufficient information to identify a particular user in a way sufficient information to identify a particular user in a way
that is meaningful to a human. In addition, many systems that do that is meaningful to a person. In addition, many systems that do
have sufficient information, such as a name and e-mail address, have sufficient information, such as a name and e-mail address,
do not have the ability to associate this information with the do not have the ability to associate this information with the
lock discovery mechanism. Therefore a means is needed to allow lock discovery mechanism. Therefore a means is needed to allow
principals to provide authentication in a manner which will be principals to provide authentication in a manner which will be
meaningful to a human. meaningful to a person.
The From header (defined in RFC 2068), which contains only an The From header (defined in RFC 2068), which contains only an
email mailbox, is not sufficient for the purposes of quick email mailbox, is not sufficient for the purposes of quick
identification. When desperately looking for someone to remove a identification. When desperately looking for someone to remove a
lock, e-mail is often not sufficient. A telephone number (cell lock, e-mail is often not sufficient. A telephone number (cell
number, pager number, etc.) would be better. Furthermore, the number, pager number, etc.) would be better. Furthermore, the
email address in the From field may or may not support including email address in the From header only optionally includes the
the owners name and that name is often set to an alias anyway. owners name and that name is often set to an alias anyway.
Therefore a header more flexible than From is required. Therefore a header more flexible than From is required.
The value also needs to be such that both man and machine can
place values in it and later retrieve those values.
5.2.9.3 Syntax 5.2.9.3 Syntax
Owner = "Owner" ":" (("<" URI ">") | quoted-string) Owner = "Owner" ":" (Coded-XML | quoted-string)
The URI SHOULD provide a means for either directly contacting the Coded-XML = field-content ; XML where any character which is
principal (such as a telephone number or e-mail URI), or for not legal in field-content (see section 4.2 of [Fielding et al.,
discovering the principal (such as the URL of a homepage). The 1997]) is XML encoded
quoted string SHOULD provide a means for directly contacting the
principal, such as a name and telephone number. The XML SHOULD provide information sufficient for either directly
contacting the principal (such as a telephone number or e-mail
URI), or for discovering the principal (such as the URL of a
homepage) who owns the lock. The quoted string SHOULD provide a
means for directly contacting the principal who owns the lock,
such as a name and telephone number.
5.2.10 Time-Out Header 5.2.10 Time-Out Header
5.2.10.1 Problem Description 5.2.10.1 Problem Description
In a perfect world principals take out locks, use the resource as In a perfect world principals take out locks, work on the
needed, and then remove the lock when it is no longer needed. resource, and then remove the lock when it is no longer needed.
However, this process is frequently not completed, leaving active
However, this scenario is frequently not completed, leaving but unused locks. Reasons for this include client programs
active but unused locks. Reasons for this include client programs crashing and losing information about locks, users leaving their
crashing and loosing information about locks, users leaving their
systems for the day and forgetting to remove their locks, etc. As systems for the day and forgetting to remove their locks, etc. As
a result of this behavior, servers need to establish a policy by a result of this behavior, servers need to establish a policy by
which they can remove a lock without input from the lock owner. which they can remove a lock without input from the lock owner.
Once such a policy is instituted, the server also needs a Once such a policy is instituted, the server also needs a
mechanism to inform the principal of the policy. mechanism to inform the principal of the policy.
5.2.10.2 Solution Requirements 5.2.10.2 Solution Requirements
There are two basic lock removal policies, administrator and time There are two basic lock removal policies: administrator and time
based remove. In the first case a principal other than the lock based removal. In the case of administrator based removal, a
owner has sufficient access rights to order the lock removed, principal other than the lock owner has sufficient access rights
even though they did not take it out. User-agents MUST assume to order the lock removed, even though they did not take it out.
that such a mechanism is available and thus locks may arbitrarily The second policy type is time based removal. In this case, a
disappear at any time. If their actions require confirmation of timer is set as soon as the lock is created. Every time a method
the existence of a lock then the If-State headers are available. is executed on any resource covered by the lock, the timer is
reset. If the timer runs out, the lock is removed.
The second solution, is the time based removal policy. Activity
based systems set a timer as soon as the lock is taken out. Every
time a method is executed on the resource, the timer is reset. If
the timer runs out, the lock is removed.
Finally, some systems only allow locks to exist for the duration User-agents MUST assume that locks may arbitrarily disappear at
of a session, where a session is defined as the time when the any time. If their actions require confirmation of the existence
HTTP connection that was used to take out the lock remains of a lock then the If-State headers are available.
connected. This mechanism is used to allow programs which are
likely to be improperly exited, such as JAVA programs running in
a browser, to take out locks without leaving a lot of ownerless
locks around when they are improperly exited.
5.2.10.3 Syntax 5.2.10.3 Syntax
TimeOut = "Time-Out" ":" ((TimeOutType SP Session) | TimeOutVal | TimeOut = "Time-Out" ":" 1#TimeType
Session) CRLF TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Extend)
TimeOutType = ClockType SP TimeType
ClockType = "ClockType" "=" ClockTypeValue
ClockTypeValue = "Activity"
TimeType = "TimeType" "=" TimeTypeValue
TimeTypeValue = "Second" ";" DAVTimeOutVal
DAVTimeOutVal = 1*digit DAVTimeOutVal = 1*digit
Session = "Session" "=" ("Yes" | "No") Extend = RFC-Reg | URL "-" Token ; The URL format is used for
unregistered TimeTypes
The "Second" TimeType specifies the number of seconds that may RFC-Req = Token ; This is a TimeType that has been published as
elapse before the lock is automatically removed. A server MUST an RFC
not generate a time out value for "second" greater than 2^32-1.
If no time based system is in use then a Time-Out header MUST NOT
be returned. The Time-Out header MUST only be returned in a
response to a LOCK request.When session is set to yes then
whatever clocktype and timetype is being used, their effects are
scoped within that particular session. So an absolute lock with a
ten day expiration period will only remain active so long as the
session remains active. A DAVTimeOutVal value must be greater
than zero.
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 the However the server is not required to honor or even consider the
request. The primary purpose in allowing clients to submit a request. Clients MUST NOT submit a Time-Out request header with
TimeOut header is to inform the server if the client is any method other than a LOCK method.
requesting a session based lock. If a timeout is associated with
the lock, the server MUST return a TimeOut header with a valid
value. A Time-Out request header MUST contain at least one TimeType and
MAY contain multiple TimeType entries. The purpose of listing
multiple TimeType is to indicate multiple different values and
value types that are acceptable to the client. The client lists
the TimeType entries in order of preference.
5.2.11 State-Token Header The Time-Out response header MUST use a Second value, Infinite,
or a TimeType the client has indicated familiarity with. The
server MAY assume a client is familiar with any TimeType
submitted in a Time-Out header.
5.2.11.1 Problem Definition The "Second" TimeType specifies the number of seconds that MUST
elapse between granting of the lock at the server, and the
Program A, used by User A, takes out a write lock on a resource. automatic removal of the lock. A server MUST not generate a time
Program B, also run by User A, then proceeds to perform a PUT to out value for "Second" greater than 2^32-1.
the locked resource. The PUT will succeed because locks are
associated with a principal, not a program, and thus program B,
because it is acting with principal A’s credential, will be
allowed to perform the PUT. In reality program B had no knowledge
of the lock and had it had such knowledge, would not have
overwritten the resource. Hence, a mechanism is needed to prevent
different programs from accidentally ignoring locks taken out by
other programs with the same authorization.
5.2.11.2 Solution Requirement The time out counter is restarted any time the client sends a
method to any member of the lock, including unsupported methods,
or methods which are unsuccessful. It is recommended that the
HEAD method be used when the goal is simply to restart the time
out counter.
If the timeout expires then the lock is lost. Specifically the
server SHOULD act as if an UNLOCK method was executed by the
server on the resource using the lock token of the timed-out
lock, performed with its override authority. Thus logs,
notifications, and other mechanisms that act as side effects to
the granting and removal of a lock will be properly informed as
to the disposition of the lock.
Servers are advised to pay close attention to the values
submitted by clients, as they will be indicative of the type of
activity the client intends to perform. For example, an applet
running in a browser may need to lock a resource, but because of
the instability of the environment within which the applet is
running, the applet may be turned off without warning. As a
result, the applet is likely to ask for a relatively small time-
out value so that if the applet dies, the lock can be quickly
harvested. However a document management system is likely to ask
for an extremely long time-out because its user may be planning
on going off-line.
5.2.11 Lock Response
A successful lock response MUST contain a Lock-Token response
header, a Time-Out header and a PROP element in the response body
which contains the value of the LockDiscovery property.
5.2.11.1 Lock-Token Response Header
If a resource is successfully locked then a lock-token header
will be returned containing the lock token that represents the
lock.
Lock-Token = "Lock-Token" ":" URI
5.2.12 Example - Simple Lock Request
LOCK /workspace/webdav/proposal.doc HTTP/1.1
Host: webdav.sb.aol.com
Lock-Info: LockType=Write LockScope=Exclusive
Time-Out: Infinite; Second-4100000000
Owner: <?XML: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 200 OK
Lock-Token: OpaqueLockToken:xyz122393481230912asdfa09s8df09s7df08
sd0f98a098sda
Time-Out: Second-604800
Content-Type: text/xml
Content-Length: xxxxx
<?XML:Namespace
href ="http://www.ietf.org/standards/dav/" AS = "D"/>
<D:Prop>
<lockdiscovery>
<activelock>
<locktype>write</locktype>
<lockscope>exclusive</lockscope>
<addlocks/>
<owner>
<HREF>http://www.ics.uci.edu/~ejw/contact.html</HREF>
</owner>
<timeout>Second-604800</timeout>
<locktoken>
<HREF>
OpaqueLockToken:xyz122393481230912asdfa09s8df09s7d
f08sd0f98a098sda
</HREF>
</locktoken>
</activelock>
</lockdiscovery>
</D:Prop>
This example shows the successful creation of an exclusive write
lock on resource
http://webdav.sb.aol.com/workspace/webdav/proposal.doc. The
resource http://www.ics.uci.edu/~ejw/contact.html contains
contact information for the owner of the lock. The server has an
activity-based timeout policy in place on this resource, which
causes the lock to automatically be removed after 1 week (604800
seconds). The response has a Lock-Token header that gives the
state token URL for the lock token generated by this lock
request.
5.2.13 Example - Multi-Resource Lock Request
LOCK /workspace/webdav/proposal.doc HTTP/1.1
Host: webdav.sb.aol.com
Lock-Info: LockType=Write LockScope=Exclusive
Addlocks=<http://webdav.sb.aol.com/workspace/><http://foo.bar/bla
h>
Time-Out: Infinite, Second-4100000000
Owner: <http://www.ics.uci.edu/~ejw/contact.html>
HTTP/1.1 409 Conflict
Content-Type: text/xml
Content-Length: xxxxx
<?XML:Namespace href =
"http://www.ietf.org/standards/dav/" As = "D"/>
<D:MultiResponse>
<Response>
<HREF>
http://webdav.sb.aol.com/workspace/webdav/proposal.doc
</HREF>
<HREF>
http://webdav.sb.aol.com/workspace/webdav/
</HREF>
<Status>HTTP/1.1 202 Accepted</Status>
</Response>
<Response>
<HREF>http://foo.bar/blah</HREF>
<Status>HTTP/1.1 403 Forbidden</Status>
</Response>
</D:MultiResponse>
This example shows a request for an exclusive write lock on three
resources,
http://webdav.sb.aol.com/workspace/webdav/proposal.doc,
http://webdav.sb.aol.com/workspace/, and http://foo.bar/blah. In
this request, the client has specified that it desires an
infinite length lock, if available, otherwise a timeout of 4.1
billion seconds, if available. The Owner header field specifies
the web address for contact information for the principal taking
out the lock.
This lock request has failed, because the server rejected the
lock request for http://foo.bar/blah. The 409 Conflict status
code indicates that the server was unable to satisfy the request
because there is a conflict between the state of the resources
and the operation named in the request. Within the
multiresponse, the 202 Accepted status code indicates that the
lock method was accepted by the resources, and would have been
completed if all resources named in the request were able to be
locked. The 403 Forbidden status code indicates that the server
does not allow lock requests on this resource.
5.3 Write Lock
This section describes the semantics specific to the write access
type for locks. The write lock is a specific instance of a lock
type, and is the only lock type described in this specification.
5.3.1 Methods Restricted by Write Locks
A write lock prevents a principal without the lock from
successfully executing a PUT, POST, PATCH, PROPPATCH, MOVE,
DELETE, MKCOL, ADDREF or DELREF on the locked resource. All other
current methods, GET in particular, function independent of the
lock.
Note, however, that as new methods are created it will be
necessary to specify how they interact with a write lock.
5.3.2 Write Locks and Properties
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 change, even while locked, due to the requirements of their
schemas. Only dead properties and live properties defined to
respect locks are guaranteed to not change while write locked.
If a property is write locked then a LOCK request on the
associated resource MUST fail with a 409 "Conflict". Note that a
write lock on a property MAY be extended to include the
associated resource without the principal having explicitly
requested the extension.
5.3.3 Write Locks and Null Resources
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 effectively makes the resource non-null as the resource
now has lock related properties defined on it.
5.3.4 Write Locks and Collections
A write lock on a collection prevents the addition or removal of
members of the collection. As a consequence, when a principal
issues a request to create a new internal member of a collection
using PUT or POST, or to remove an existing internal member of a
collection using DELETE, this request MUST fail if the principal
does not have a write lock on the collection.
However, if a write lock request is issued to a collection
containing internal member resources that are currently locked,
the request MUST fail with a 409 Conflict status code.
5.3.5 Write Locks and COPY/MOVE
The owner of a write lock MUST NOT execute a MOVE method on a
resource they have locked. This specification intentionally does
not define what happens if a MOVE method request is made on a
locked resource by the lock's owner.
A COPY method invocation MUST NOT duplicate any write locks
active on the source.
5.3.6 Re-issuing Write Locks
If a principal already owns a write lock on a resource, any
future 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.
5.3.7 Write Locks and The State-Token Header
5.3.7.1 Problem Definition
If a user agent is not required to have knowledge about a lock
when 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 resource. Program B, also run by User A, has no
knowledge of the lock taken out by Program A, yet performs a PUT
to the locked resource. In this scenario, the PUT succeeds
because locks are associated with a principal, not a program, and
thus program B, because it is acting with principal A’s
credential, is allowed to perform the PUT. However, had program B
known about the lock, it would not have overwritten the resource,
preferring instead to present a dialog box describing the
conflict to the user. Due to this scenario, a mechanism is needed
to prevent different programs from accidentally ignoring locks
taken out by other programs with the same authorization.
5.3.7.2 Solution Requirement
The solution must not require principals to perform discovery in The solution must not require principals to perform discovery in
order to prevent accidental overwrites as this could cause race order to prevent accidental overwrites as this could cause race
conditions. conditions.
The solution must not require that clients guess what sorts of The solution must not require that clients guess what sorts of
locks might be used and use if-state-match headers with wildcards locks might be used and use if-state-match headers with wildcards
to prevent collisions. The problem with trying to "guess" which to prevent collisions. The problem with trying to "guess" which
locks are being used is that new lock types might be introduced, locks are being used is that new lock types might be introduced,
and the program would not know to "guess them". So, for example, and the program would not know to "guess them". So, for example,
a client might put in an if-state-match header with a wildcard a client might put in an if-state-match header with a wildcard
specifying that if any write lock is outstanding then the specifying that if any write lock is outstanding then the
operation should fail. However a new read/write lock could be operation should fail. However a new read/write lock could be
introduced which the client would not know to put in the header. introduced which the client would not know to put in the header.
5.2.11.3 State-Token Header 5.3.7.3 State-Token Header
The State-Token header is returned in a successful response to The State-Token header, containing a lock token owned by the
the LOCK method or is used as a request header with the UNLOCK requesting principal, is used by the principal to indicate that
method. the principal is aware of the existence of the lock specified by
the lock token. It is used in the following way.
The State-Token header containing a lock token owned by the If the following conditions are met:
request principal is used by the principal on arbitrary method to 1. a user-agent has authenticated itself as a principal,
indicate that the principal is aware of the specified lock. If 2. the user-agent is submitting a method request to a
the State-Token header with the appropriate lock token is not resource
included the request MUST be rejected, even though the requesting on which the principal owns a write lock,
principal has authorization to make modifications specified by 3. the method is restricted by a write lock, as defined in
the lock type. This injunction does not apply to methods that are the
not affected by the principal’s lock. section "Methods Restricted by a Write Lock",
then the method request MUST include a State-Token header with
the lock token of the write lock, or the method fails with a 409
Conflict status code. If multiple resources are involved with a
method, such as a COPY or MOVE method, then the lock tokens, if
any, for all involved resources, MUST be included in the State-
Token request header.
For example, Program A, used by user A, takes out a write lock on 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 a resource. Program A then makes a number of PUT requests on the
locked resource, all the requests contain a State-Token header locked resource, all the requests contain a State-Token header
which includes the write lock state token. Program B, also run by which includes the write lock state token. Program B, also run by
User A, then proceeds to perform a PUT to the locked resource. User A, then proceeds to perform a PUT to the locked resource.
However program B was not aware of the existence of the lock and However program B was not aware of the existence of the lock and
so does not include the appropriate state-token header. The so does not include the appropriate state-token header. The
method is rejected even though principal A is authorized to method is rejected even though principal A is authorized to
perform the PUT. Program B can, if it so chooses, now perform perform the PUT. Program B can, if it so chooses, now perform
lock discovery and obtain the lock token. Note that program A and lock discovery and obtain the lock token. Note that program A and
B can perform GETs without using the state-token header because B can perform GETs without using the state-token header because
the ability to perform a GET is not affected by a write lock. the ability to perform a GET is not affected by a write lock.
Note that having a lock state token provides no special access Having a lock state token provides no special access rights.
rights. Anyone can find out anyone else’s lock state token by Anyone can find out anyone else’s lock state token by performing
performing lock discovery. Locks are to be enforced based upon lock discovery. Locks are to be enforced based upon whatever
whatever authentication mechanism is used by the server, not authentication mechanism is used by the server, not based on the
based on the secrecy of the token values. secrecy of the token values.
5.3 Write Lock
A write lock prevents a principal without the lock from 5.3.7.3.1 Example
successfully executing a PUT, POST, DELETE, MKCOL, PROPPATCH,
PATCH, ADDREF or DELREF on the locked resource. All other
methods, GET in particular, function independent of the lock.
While those without a write lock may not alter a property on a COPY /~fielding/index.html HTTP/1.1
resource it is still possible for the values of live properties Host: www.ics.uci.edu
to change, even while locked, due to the requirements of their Destination: http://www.ics.uci.edu/users/f/fielding/index.html
schemas. Only dead properties and live properties defined to State-Token: <OpaqueLockToken:123AbcEfg1284h23h2>
respect locks are guaranteed to not change while locked. <OpaqueLockToken:AAAASDFcalkjfdas12312>
It is possible to assert a write lock on a null resource in order HTTP/1.1 200 OK
to lock the name. Please note, however, that locking a null
resource effectively makes the resource non-null as the resource
now has lock related properties defined on it.
Write locking a container also prevents adding or removing In this example, both the source and destination are locked so
members of the container. This means that attempts to PUT/POST a two lock tokens must be submitted. If only one of the two
resource into the immediate name space of the write locked resources was locked, then only one token would have to be
container MUST fail if the principal requesting the action does submitted.
not have the write lock on the container. In order to keep the
behavior of locking containers consistent all locks on containers
MUST contain a Depth header equal to infinity, any other value is
illegal.
5.4 Lock Tokens 5.4 Lock Tokens
5.4.1 Problem Description 5.4.1 Problem Description
It is possible that once a lock has been granted it may be It is possible that once a lock has been granted it may be
removed without the lock owner’s knowledge. This can cause removed without the lock owner’s knowledge. This can cause
serialization problems if the lock owner executes methods serialization problems if the lock owner executes methods
thinking their lock is still in effect. Thus a mechanism is thinking their lock is still active. Due to this, a mechanism is
needed for a principal to predicate the successful execution of a needed for a principal to predicate the successful execution of a
message upon the continuing existence of a lock. message upon the continuing existence of a lock.
5.4.2 Proposed Solution 5.4.2 Lock Token Introduction
The proposed solution is to provide a lock token in the response A lock token is a type of state token that describes a particular
of a lock request. The lock token is a type of state token and lock. A lock token is returned by every successful LOCK
describes a particular lock. The same lock token must never be operation, and can also be discovered through lock discovery on a
repeated on a particular resource. This prevents problems with resource.
long held outstanding lock tokens being confused with newer
tokens. This uniqueness requirement is the same as for e-tags.
This requirement also allows for tokens to be submitted across
resources and servers without fear of confusion.
5.4.3 Lock Token Definition There are two types of lock tokens, a generic lock token, which
is unique only for a particular resource, and an opaque lock
token, which is unique across all resources for all time.
The lock token is returned in the State-Token header in the Uniqueness for a particular resource prevents problems with long
response to a LOCK method. The lock token can also be discovered held outstanding lock tokens being confused with newer tokens.
through lock discovery on a resource. This uniqueness requirement is the same as for e-tags. Uniqueness
Lock-Token-URL = "StateToken:" Type ":" Resources ":" State-Info across all resources for all time allows for tokens to be
submitted across resources and servers without fear of confusion.
Type = "Type" "=" "^DAV:/LOCK/DAVLOCK^" Generic lock tokens, because of their relaxed uniqueness
Resources = "Res" "=" 1*("^" Caret-Encoded-URI "^") requirements, are faster to generate than opaque lock tokens.
Caret-Encoded-URI = <This is a URI which has all "^"s % encoded.>
State-Info = DAVLockScope ":" DAVLockType ":" ServerID ;
DAVLockScope, DAVLockType defined in Lock-Info header
ServerID = "ServerID" "=" *(uchar | reserved)
The ServerID is a field for use by the server. Its most basic 5.4.3 Generic Lock Tokens
purpose is to put in a unique identifier to guarantee that a
server will never confuse an old lock token with a newer one. Any valid URI can be used by the resource as a generic lock
However the server is free to use the field to record whatever token. The only requirement is that the lock token MUST never
information it deems fit. The field is opaque to clients. have been issued previously on that resource. Because a lock
token is only guaranteed to be unique on the resource that
generated it, the lock token MUST NOT be submitted in a state-
token request header or an if-state[-not]-match header on any
resource but the resource that generated it.
5.4.4 OpaqueLockToken Lock Token
The opaquelocktoken scheme is designed to be unique across all
resources for all time. Due to this uniqueness quality, a client
MAY submit an opaque lock token in a state-token request header
and an if-state[-not]-match header on a resource other than the
one that returned it.
All resources MUST recognize the opaquelocktoken scheme and be
able to, at minimum, recognize that the lock token was not
generated by the resource. Note, however, that resources are not
required to generate opaquelocktokens.
In order to guarantee uniqueness across all resources for all
time the opaquelocktoken requires the use of the GUID mechanism.
Opaquelocktoken generators however have a choice of how they
create these tokens. They can either generate a new GUID for
every lock token they create, which is potentially very
expensive, or they can create a single GUID and then add
extension characters. If the second method is selected then the
program generating the extensions MUST guarantee that the same
extension will never be used twice with the associated GUID.
Opaque-Lock-Token = "OpaqueLockToken" ":" GUID [Extension]
GUID = ; As defined in [LEACH]
Extension = *urlc ;urlc is defined in [Berners-Lee et al.,
1997] (draft-fielding-url-syntax-07.txt)
5.5 UNLOCK Method 5.5 UNLOCK Method
5.5.1 Problem Definition 5.5.1 Problem Definition
The UNLOCK method removes the lock identified by the lock token The UNLOCK method removes the lock identified by the lock token
in the State-Token header from the Request-URI. in the State-Token header from the Request-URI, and all other
resources included in the lock.
5.5.2 Example 5.5.2 Example
UNLOCK /workspace/webdav/proposal.doc HTTP/1.1 UNLOCK /workspace/webdav/info.doc HTTP/1.1
Host: webdav.sb.aol.com Host: webdav.sb.aol.com
State-Token: StateToken:Type=^DAV:/LOCK/DAVLOCK^:Res=^http://www. State-Token: OpaqueLockToken:123AbcEfg1284h23h2
ics.uci.edu/workspace/webdav/proposal.doc^:LockType=Write:LockSco
pe=Exclusive:ServerID=12382349AdfFFF
HTTP/1.1 200 OK HTTP/1.1 200 OK
In this example, the lock from example of Section 2.9 is removed In this example, the lock identified by the lock token
from the resource at "OpaqueLockToken:123AbcEfg1284h23h2" is successfully removed from
http://webdav.sb.aol.com/workspace/webdav/proposal.doc the resource http://webdav.sb.aol.com/workspace/webdav/info.doc.
If this lock included more than just one resource, the lock is
removed from those resources as well.
5.6 Discovery Mechanisms 5.6 Discovery Mechanisms
5.6.1 Lock Type Discovery 5.6.1 Lock Capability Discovery
5.6.1.1 Problem Definition 5.6.1.1 Problem Definition
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 resource on a server can either try the lock and hope for the
best or can perform some form of discovery to determine what lock best, or perform some form of discovery to determine what lock
types the server actually supports, then formulate a supported capabilities the server supports. This is known as lock
request. This is known as lock type discovery. Lock type capability discovery. Lock capability discovery differs from
discovery is not the same as discovering what access control discovery of supported access control types, since there may be
types are supported, as there may be access control types without access control types without corresponding lock types.
corresponding lock types.
5.6.1.2 SupportedLock Property 5.6.1.2 SupportedLock Property
Name: http://www.ietf.org/standards/dav/lock/supportedlock Name: http://www.ietf.org/standards/dav/lock/supportedlock
Purpose: To provide a listing of the lock types supported by the Purpose: To provide a listing of the lock capabilities supported
resource. by the resource.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Values: An XML document containing zero or more LockEntry XML Values: An XML document containing zero or more LockEntry XML
elements. 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 listing of the combinations of scope and access types which may
be specified in a lock request on the resource. Note that the be specified in a lock request on the resource. Note that the
actual contents are themselves controlled by access controls so a actual contents are themselves controlled by access controls so a
server is not required to provide information the client is not server is not required to provide information the client is not
authorized to see. If SupportedLock is available on "*" then it authorized to see. If SupportedLock is available on "*" then it
MUST define the set of locks allowed on all resources on that MUST define the set of locks allowed on all resources on that
server. server.
5.6.1.3 LOCKENTRY XML Element 5.6.1.3 LOCKENTRY XML Element
Name: http://www.ietf.org/standards/dav/lockentry Name: http://www.ietf.org/standards/dav/lockentry
Purpose: Defines a DAVLockType/LockScope pair which may be Purpose: Defines a DAVLockType/LockScope pair which may be
legally used with a LOCK on the specified resource. legally used with a LOCK on the specified resource.
skipping to change at line 2962 skipping to change at line 3254
server is not required to provide information the client is not server is not required to provide information the client is not
authorized to see. If SupportedLock is available on "*" then it authorized to see. If SupportedLock is available on "*" then it
MUST define the set of locks allowed on all resources on that MUST define the set of locks allowed on all resources on that
server. server.
5.6.1.3 LOCKENTRY XML Element 5.6.1.3 LOCKENTRY XML Element
Name: http://www.ietf.org/standards/dav/lockentry Name: http://www.ietf.org/standards/dav/lockentry
Purpose: Defines a DAVLockType/LockScope pair which may be Purpose: Defines a DAVLockType/LockScope pair which may be
legally used with a LOCK on the specified resource. legally used with a LOCK on the specified resource.
Schema: HYPERLINK http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: A SupportedLock entry Parent: A SupportedLock entry
Values: LockType LockScope Values: LockType LockScope
5.6.1.4 LOCKTYPE XML Element 5.6.1.4 LOCKTYPE XML Element
Name: http://www.ietf.org/standards/dav/locktype Name: http://www.ietf.org/standards/dav/locktype
Purpose: Lists a DAVLockType Purpose: Lists a DAVLockType
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: LOCKENTRY Parent: LOCKENTRY
Values: DAVLockTypeValue Values: DAVLockTypeValue
5.6.1.5 LOCKSCOPE XML Element 5.6.1.5 LOCKSCOPE XML Element
Name: http://www.ietf.org/standards/dav/lockscope Name: http://www.ietf.org/standards/dav/lockscope
Purpose: Lists a DAVLockScope Purpose: Lists a DAVLockScope
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: LOCKENTRY Parent: LOCKENTRY
Values: DAVLockScopeValue Values: DAVLockScopeValue
5.6.1.6 Example
PROPFIND /container/ HTTP/1.1
Host: www.foo.bar
Content-Length: xxxx
Content-Type: text/xml
<?XML:Namespace href =
"http://www.ietf.org/standards/dav/" AS = "D"/>
<D:PROPFIND>
<prop><SupportedLock/></prop>
</D:PROPFIND>
HTTP/1.1 207 Multi-Response
Content-Type: text/xml
Content-Length: xxxxx
<?XML:Namespace
href ="http://www.ietf.org/standards/dav/" AS = "D"/>
<D:MultiResponse>
<Response>
<Prop>
<SupportedLock>
<LockEntry>
<LockType>Write</LockType>
<LockScope>Exclusive</LockScope>
</LockEntry>
<LockEntry>
<LockType>Write</LockType>
<LockScope>Shared</LockScope>
</LockEntry>
</SupportedLock>
</Prop>
<Status>HTTP/1.1 200 Success</Status>
</Response>
</D:MultiResponse>
5.6.2 Active Lock Discovery 5.6.2 Active Lock Discovery
5.6.2.1 Problem Definition 5.6.2.1 Problem Definition
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 access, it is useful for the second principal to be able to find
out who the first principal is. out who the first principal is.
5.6.2.2 Solution Requirements 5.6.2.2 Solution Requirements
The lock discovery mechanism should provide a list of who has the The lock discovery mechanism should provide a list of who has the
resource locked, what locks they have, and what their lock tokens resource locked, what locks they have, and what their lock tokens
are. The lock tokens are useful in shared lock situations where are. The lock tokens are useful in shared lock situations where
two principals in particular may want to guarantee that they do two principals may want to guarantee that they do not overwrite
not overwrite each other. The lock tokens are also useful for each other. The lock tokens are also useful for administrative
administrative purposes so that an administrator can remove a purposes so that an administrator can remove a lock by referring
lock by referring to its token. to its token.
5.6.2.3 LOCKDISCOVERY Property 5.6.2.3 LOCKDISCOVERY Property
Name: http://www.ietf.org/standards/dav/lockdiscovery Name: http://www.ietf.org/standards/dav/lockdiscovery
Purpose: To discover what locks are active on a resource Purpose: To discover what locks are active on a resource
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Values= An XML document containing zero or more ActiveLock XML Values= An XML document containing zero or more ActiveLock XML
elements. elements.
Description: The LOCKDISCOVERY property returns a listing of who Description: The LOCKDISCOVERY property returns a listing of who
has a lock, what type of lock they have, the time out type and has a lock, what type of lock they have, the time out type and
the time remaining on the time out, and the associated lock the time remaining on the time out, and the associated lock
token. The server is free to withhold any or all of this token. The server is free to withhold any or all of this
information if the requesting principal does not have sufficient information if the requesting principal does not have sufficient
access rights to see the requested data. access rights to see the requested data. A server which supports
locks MUST provide the LOCKDISCOVERY property on any resource
with locks on it.
5.6.2.4 ACTIVELOCK XML Element 5.6.2.4 ACTIVELOCK XML Element
Name: http://www.ietf.org/standards/dav/activelock Name: http://www.ietf.org/standards/dav/activelock
Purpose: A multivalued XML element that describes a particular Purpose: A multivalued XML element that describes a particular
active lock on a resource active lock on a resource
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: A LOCKDISCOVERY entry Parent: A LOCKDISCOVERY entry
Values= LOCKTYPE LOCKSCOPE OWNER TIMEOUT LOCKTOKEN Values= LOCKTYPE LOCKSCOPE [ADDLOCKS] OWNER TIMEOUT LOCKTOKEN
5.6.2.5 OWNER XML Element 5.6.2.5 OWNER XML Element
Name: http://www.ietf.org/standards/dav/lock/owner Name: http://www.ietf.org/standards/dav/lock/owner
Purpose: Returns owner information Purpose: Returns owner information
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: ACTIVELOCK Parent: ACTIVELOCK
Values= XML:REF | {any valid XML string} Values= XML:REF | {any valid XML string}
5.6.2.6 TIMEOUT XML Element 5.6.2.6 TIMEOUT XML Element
Name: http://www.ietf.org/standards/dav/timeout Name: http://www.ietf.org/standards/dav/timeout
Purpose: Returns information about the timeout associated with Purpose: Returns information about the timeout associated with
the lock the lock
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: ACTIVELOCK Parent: ACTIVELOCK
Values= CLOCKTYPE TIMETYPE TIMEOUTVAL Values= TimeType
5.6.2.7 CLOCKTYPE XML Element
Name: http://www.ietf.org/standards/dav/clocktype
Purpose: Returns the clock type used with this lock
Schema: http://www.ietf.org/standards/dav/
Parent: TIMEOUT
Values= ClockTypeValue
5.6.2.8 TIMETYPE XML Element 5.6.2.7 ADDLOCKS XML Element
Name: http://www.ietf.org/standards/dav/clocktype Name: http://www.ietf.org/standards/dav/addlocks
Purpose: Returns the time type used with this lock Purpose: Lists additional resources associated with this lock, if
any.
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: TIMEOUT Parent: ACTIVELOCK
Values= TimeTypeValue Values= 1*HREF
5.6.2.9 TIMEOUTVAL XML Element
Name: http://www.ietf.org/standards/dav/timeoutval 5.6.2.8 LOCKTOKEN XML Element
Purpose: Returns the amount of time left on the lock
Schema: http://www.ietf.org/standards/dav/
Parent: TIMEOUT
Values= DAVTimeOutVal
5.6.2.10 LOCKTOKEN XML Element
Name: http://www.ietf.org/standards/dav/statetoken Name: http://www.ietf.org/standards/dav/statetoken
Purpose: Returns the lock token Purpose: Returns the lock token
Schema: http://www.ietf.org/standards/dav/ Schema: http://www.ietf.org/standards/dav/
Parent: ACTIVELOCK Parent: ACTIVELOCK
Values= XML:REF Values= HREF
Description: The REF contains a Lock-Token-URL. Description: The HREF contains a Lock-Token-URL.
5.6.2.9 Example
PROPFIND /container/ HTTP/1.1
Host: www.foo.bar
Content-Length: xxxx
Content-Type: text/xml
<?XML:Namespace href =
"http://www.ietf.org/standards/dav/" AS = "D"/>
<D:PROPFIND>
<prop><lockdiscovery/></prop>
</D:PROPFIND>
HTTP/1.1 207 Multi-Response
Content-Type: text/xml
Content-Length: xxxxx
<?XML:Namespace
href ="http://www.ietf.org/standards/dav/" AS = "D"/>
<D:MultiResponse>
<Response>
<Prop>
<lockdiscovery>
<activelock>
<locktype>write</locktype>
<lockscope>exclusive</lockscope>
<addlocks>
<HREF>http://foo.com/doc/</HREF>
</addlocks>
<owner>Jane Smith</owner>
<timeout>Infinite</timeout>
<locktoken>
<HREF>iamuri:unique!!!!!</HREF>
</locktoken>
</activelock>
</lockdiscovery>
</Prop>
<Status>HTTP/1.1 200 Success</Status>
</Response>
</D:MultiResponse>
This resource has a single exclusive write lock on it, with an
infinite time out. This same lock also covers the resource
http://foo.com/doc/.
6 Version Control 6 Version Control
[TBD] [TBD]
7 Internationalization Support 7 Internationalization Support
[TBD] [TBD]
8 Security Considerations 8 Security Considerations
[TBD] [TBD]
9 Acknowledgements 9 Copyright
Copyright (C) The Internet Society October 13, 1997. All Rights
Reserved.
This document and translations of it may be copied and furnished
to others, and derivative works that comment on or otherwise
explain it or assist in its implementation may be prepared,
copied, published and distributed, in whole or in part, without
restriction of any kind, provided that the above copyright notice
and this paragraph are included on all such copies and derivative
works. However, this document itself may not be modified in any
way, such as by removing the copyright notice or references to
the Internet Society or other Internet organizations, except as
needed for the purpose of developing Internet standards in which
case the procedures for copyrights defined in the Internet
Standards process must be followed, or as required to translate
it into languages other than English.
The limited permissions granted above are perpetual and will not
be revoked by the Internet Society or its successors or
assignees.
This document and the information contained herein is provided on
an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET
ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE
OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY
IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
PURPOSE.
10 Acknowledgements
Terry Allen, Harald Alvestrand, Alan Babich, Dylan Barrell, Terry Allen, Harald Alvestrand, Alan Babich, Dylan Barrell,
Bernard Chester, Dan Connolly, Jim Cunningham, Ron Daniel, Jr., Bernard Chester, Dan Connolly, Jim Cunningham, Ron Daniel, Jr.,
Keith Dawson, Mark Day, Martin Duerst, David Durand, Lee Farrell, Jim Davis, Keith Dawson, Mark Day, Martin Duerst, David Durand,
Chuck Fay, Roy Fielding, Mark Fisher, Alan Freier, George Lee Farrell, Chuck Fay, Roy Fielding, Mark Fisher, Alan Freier,
Florentine, Jim Gettys, Phill Hallam-Baker, Dennis Hamilton, George Florentine, Jim Gettys, Phill Hallam-Baker, Dennis
Steve Henning, Alex Hopmann, Andre van der Hoek, Ben Laurie, Paul Hamilton, Steve Henning, Alex Hopmann, Andre van der Hoek, Ben
Leach, Ora Lassila, Karen MacArthur, Steven Martin, Larry Laurie, Paul Leach, Ora Lassila, Karen MacArthur, Steven Martin,
Masinter, Michael Mealling, Keith Moore, Henrik Nielsen, Kenji Larry Masinter, Michael Mealling, Keith Moore, Henrik Nielsen,
Ota, Bob Parker, Glenn Peterson, Jon Radoff, Saveen Reddy, Henry
Sanders, Christopher Seiwald, Judith Slein, Mike Spreitzer, Einar
Stefferud, Ralph Swick, Kenji Takahashi, Robert Thau, Sankar
Virdhagriswaran, Fabio Vitali, Gregory Woodhouse, Lauren Wood
10 References Kenji Ota, Bob Parker, Glenn Peterson, Jon Radoff, Saveen Reddy,
Henry Sanders, Christopher Seiwald, Judith Slein, Mike Spreitzer,
Einar Stefferud, Ralph Swick, Kenji Takahashi, Robert Thau, John
Turner, Sankar Virdhagriswaran, Fabio Vitali, Gregory Woodhouse,
Lauren Wood
11 References
[Berners-Lee, 1997] T. Berners-Lee, "Metadata Architecture." [Berners-Lee, 1997] T. Berners-Lee, "Metadata Architecture."
Unpublished white paper, January 1997. Unpublished white paper, January 1997.
http://www.w3.org/pub/WWW/DesignIssues/Metadata.html. http://www.w3.org/pub/WWW/DesignIssues/Metadata.html.
[Bradner, 1997] S. Bradner, "Key words for use in RFCs to
Indicate Requirement Levels." RFC 2119, BCP 14. Harvard
University. March, 1997.
[Bray, Sperberg-McQueen, 1997] T. Bray, C. M. Sperberg-McQueen, [Bray, Sperberg-McQueen, 1997] T. Bray, C. M. Sperberg-McQueen,
"Extensible Markup Language (XML): Part I. Syntax", WD-xml- "Extensible Markup Language (XML): Part I. Syntax", WD-xml-
lang.html, http://www.w3.org/pub/WWW/TR/WD-xml-lang.html. lang.html, http://www.w3.org/pub/WWW/TR/WD-xml-lang.html.
[Connolly et al, 1997] D. Connolly, R. Khare, H.F. Nielsen, "PEP [Connolly et al, 1997] D. Connolly, R. Khare, H.F. Nielsen, "PEP
- an Extension Mechanism for HTTP", Internet draft, work-in- - an Extension Mechanism for HTTP", Internet draft, work-in-
progress. draft-ietf-http-pep-04.txt, progress. draft-ietf-http-pep-04.txt,
ftp://ds.internic.net/internet-drafts/draft-ietf-http-pep-04.txt. ftp://ds.internic.net/internet-drafts/draft-ietf-http-pep-04.txt.
[Fielding et al., 1997] R. Fielding, J. Gettys, J. Mogul, H. [Fielding et al., 1997] R. Fielding, J. Gettys, J. Mogul, H.
Frystyk, T. Berners-Lee, "Hypertext Transfer Protocol -- Frystyk, T. Berners-Lee, "Hypertext Transfer Protocol --
HTTP/1.1." RFC 2068. U.C. Irvine, DEC, MIT/LCS. January, 1997. HTTP/1.1." RFC 2068. U.C. Irvine, DEC, MIT/LCS. January, 1997.
ftp://ds.internic.net/rfc/rfc2068.txt
[Lasher, Cohen, 1995] R. Lasher, D. Cohen, "A Format for [Lasher, Cohen, 1995] R. Lasher, D. Cohen, "A Format for
Bibliographic Records," RFC 1807. Stanford, Myricom. June, 1995. Bibliographic Records," RFC 1807. Stanford, Myricom. June, 1995.
ftp://ds.internic.net/rfc/rfc1807.txt
[Maloney, 1996] M. Maloney, "Hypertext Links in HTML." Internet [Maloney, 1996] M. Maloney, "Hypertext Links in HTML." Internet
draft (expired), work-in-progress, January, 1996. draft (expired), work-in-progress, January, 1996.
[MARC, 1994] Network Development and MARC Standards, Office, ed. [MARC, 1994] Network Development and MARC Standards, Office, ed.
1994. "USMARC Format for Bibliographic Data", 1994. Washington, 1994. "USMARC Format for Bibliographic Data", 1994. Washington,
DC: Cataloging Distribution Service, Library of Congress. DC: Cataloging Distribution Service, Library of Congress.
[Miller et al., 1996] J. Miller, T. Krauskopf, P. Resnick, W. [Miller et al., 1996] J. Miller, T. Krauskopf, P. Resnick, W.
Treese, "PICS Label Distribution Label Syntax and Communication Treese, "PICS Label Distribution Label Syntax and Communication
Protocols" Version 1.1, W3C Recommendation REC-PICS-labels- Protocols" Version 1.1, W3C Recommendation REC-PICS-labels-
961031. http://www.w3.org/pub/WWW/TR/REC-PICS-labels-961031.html. 961031. http://www.w3.org/pub/WWW/TR/REC-PICS-labels-961031.html.
[Slein et al., 1997] J. A. Slein, F. Vitali, E. J. Whitehead, [Slein et al., 1997] J. A. Slein, F. Vitali, E. J. Whitehead,
Jr., D. Durand, "Requirements for Distributed Authoring and Jr., D. Durand, "Requirements for Distributed Authoring and
Versioning on the World Wide Web." Internet-draft, work-in- Versioning on the World Wide Web." Internet-draft, work-in-
progress, draft-ietf-webdav-requirements-02.txt, progress, draft-ietf-webdav-requirements-04.txt,
ftp://ds.internic.net/internet-drafts/draft-ietf-webdav- ftp://ds.internic.net/internet-drafts/draft-ietf-webdav-
requirements-02.txt. requirements-04.txt.
[WebDAV, 1997] WEBDAV Design Team. "A Proposal for Web Metadata [WebDAV, 1997] WEBDAV Design Team. "A Proposal for Web Metadata
Operations." Unpublished manuscript. Operations." Unpublished manuscript.
http://www.ics.uci.edu/~ejw/authoring/proposals/metadata.html http://www.ics.uci.edu/~ejw/authoring/proposals/metadata.html
[Weibel et al., 1995] S. Weibel, J. Godby, E. Miller, R. Daniel, [Weibel et al., 1995] S. Weibel, J. Godby, E. Miller, R. Daniel,
"OCLC/NCSA Metadata Workshop Report." "OCLC/NCSA Metadata Workshop Report."
http://purl.oclc.org/metadata/dublin_core_report. http://purl.oclc.org/metadata/dublin_core_report.
[Yergeau, 1997] F. Yergeau, "UTF-8, a transformation format of [Yergeau, 1997] F. Yergeau, "UTF-8, a transformation format of
skipping to change at line 3148 skipping to change at line 3551
[WebDAV, 1997] WEBDAV Design Team. "A Proposal for Web Metadata [WebDAV, 1997] WEBDAV Design Team. "A Proposal for Web Metadata
Operations." Unpublished manuscript. Operations." Unpublished manuscript.
http://www.ics.uci.edu/~ejw/authoring/proposals/metadata.html http://www.ics.uci.edu/~ejw/authoring/proposals/metadata.html
[Weibel et al., 1995] S. Weibel, J. Godby, E. Miller, R. Daniel, [Weibel et al., 1995] S. Weibel, J. Godby, E. Miller, R. Daniel,
"OCLC/NCSA Metadata Workshop Report." "OCLC/NCSA Metadata Workshop Report."
http://purl.oclc.org/metadata/dublin_core_report. http://purl.oclc.org/metadata/dublin_core_report.
[Yergeau, 1997] F. Yergeau, "UTF-8, a transformation format of [Yergeau, 1997] F. Yergeau, "UTF-8, a transformation format of
Unicode and ISO 10646", Internet Draft, work-in-progress, draft- Unicode and ISO 10646", Internet Draft, work-in-progress, draft-
yergeau-utf8-rev-00.txt, http://www.internic.net/internet- yergeau-utf8-rev-00.txt, http://www.internic.net/internet-
drafts/draft-yergeau-utf8-rev-00.txt. drafts/draft-yergeau-utf8-rev-00.txt.
11 Authors' Addresses 12 Authors' Addresses
Y. Y. Goland Y. Y. Goland
Microsoft Corporation Microsoft Corporation
One Microsoft Way One Microsoft Way
Redmond, WA 98052-6399 Redmond, WA 98052-6399
Email yarong@microsoft.com Email yarong@microsoft.com
E. J. Whitehead, Jr. E. J. Whitehead, Jr.
Dept. Of Information and Computer Science Dept. Of Information and Computer Science
University of California, Irvine University of California, Irvine
 End of changes. 

This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/