15. DAV属性

对于DAV属性,属性的名称也与包含其值的XML元素的名称相同。在下面的内容中,每个部分的最后一行使用[REC-XML]中定义的格式给出元素类型声明。“value”字段(如果存在)使用BNF指定对XML元素的内容进行限制(即,进一步限制PCDATA元素的值)。

受保护的属性是不能通过PROPPATCH请求进行更改的属性。可能还有其他请求会导致对受保护属性的更改(例如,LOCK请求会影响DAV:lockdiscovery的值时)。请注意,给定的属性可以在一种类型的资源上受保护,而不能在另一种类型的资源上受保护。

计算属性是一种通过计算才能得出值的属性(基于该资源,甚至某些其他资源的内容和其他属性)。计算属性始终是受保护的属性。

COPY和MOVE行为会导向一个本地COPY和MOVE操作。

对基于HTTP GET响应标头(DAV:get*)定义的属性,header值可以包含[RFC2616]第4.2节中定义的LWS。服务器实现者应在用作WebDAV属性值之前从这些值中除去LWS。

15.1 creationdate

Name: creationdate

Purpose: 记录资源创建的日期和事件

Value: 日期时间(在[RFC3339]中定义,请参见第5.6节中的ABNF。)

Protected: 可能受到保护。一些服务器允许更改DAV:creationdate,以反映文档创建的时间(如果对用户更有意义)而不是上传时间。因此,客户端不应在同步逻辑中使用此属性(请改用DAV:getetag)。

COPY/MOVE behavior: 该属性值应在MOVE操作期间保留,但通常在使用COPY创建资源时会重新初始化。不应在COPY中设置。

Description: DAV:creationdate属性应在所有DAV兼容的资源上定义。如果存在,它应当包含创建资源时的时间戳。无法永久记录创建日期的服务器应改为undefined(即报告“404 未找到”)。

<!ELEMENT creationdate (#PCDATA) >

15.2 displayname

Name: displayname

Purpose: 提供适合呈现给用户的资源名称。

Value: 任意文字

Protected: 不应该受到保护。请注意,实施[RFC2518]的服务器可能已将此设置为受保护属性,因为这是一项新要求。

COPY/MOVE behavior: 此属性值应在COPY和MOVE操作中得以保留。

Description: 包含适合呈现给用户的资源描述。此属性是在资源上定义的,因此应具有与用于检索它的Request-URI无关的相同值(因此,基于Request-URI计算此属性已经被废弃)。虽然通用客户端可能会向最终用户显示这个属性值,但客户端UI设计人员必须理解,用于标识资源的方法仍然是URL。对DAV:displayname的更改不会向服务器发出MOVE或COPY,而只是更改单个资源上的一部分元数据。即使在同一集合中,两个资源也可以具有相同的DAV:displayname值。

<!ELEMENT displayname (#PCDATA) >

15.3 getcontentlanguage

Name: getcontentlanguage

Purpose: 包含了Content-Language header值(来自[RFC2616]的14.12节),因为当收到一个没有accept headers的GET时要用到它。

Value: 语言标签(语言标签在[RFC2616]的第3.10节中定义)

Protected: 不应受到保护,以便客户端可以重置语言。请注意,实施[RFC2518]的服务器可能已将此设置为受保护属性,因为这是一项新要求。

COPY/MOVE behavior: 此属性值应在COPY和MOVE操作中得以保留。

Description: 必须在任何DAV兼容的资源上定义DAV:getcontentlanguage属性,并且将其作为内容Content-Language header返回给GET请求。

<!ELEMENT getcontentlanguage (#PCDATA) >

15.4 getcontentlength

Name: getcontentlength

Purpose: 包含了一个不带Accept header的GET请求返回的Content-Length header。

Value: 参见[RFC2616]的14.13节。

Protected: 此属性由计算得来,因此受到保护。

Description: 必须在任何DAV兼容的资源上定义DAV:getcontentlength属性。并在响应GET请求时返回Content-Length header。

COPY/MOVE behavior: 此属性值取决于目标资源的大小,而不取决于源资源上的属性的值。

<!ELEMENT getcontentlength (#PCDATA) >

15.5 getcontenttype

Name: getcontenttype

Purpose: 包含了Content-Type header值(来自[RFC2616]的14.17节),因为它会被一个没有accept header的GET请求返回。

Value: 媒体类型(在[RFC2616]的3.7节中定义)

Protected: 如果服务器希望自己分配内容类型,则可能受到保护(另请参见第9.7.1节中的讨论)。

COPY/MOVE behavior: 此属性值应在COPY和MOVE操作中被保留。

Description: 必须在任何需要返回响应内容Content-Type header的任何DAV兼容资源上定义此属性。

<!ELEMENT getcontenttype (#PCDATA) >

15.6 getetag

Name: getetag

Purpose: 包含ETag header值(来自[RFC2616]的14.19节),因为它将会由一个没有accept header的GET返回。

Value: 实体标签(在[RFC2616]的3.11节中定义)

Protected: 必须对此值进行保护,因为此值是由服务器创建和控制的。

COPY/MOVE behavior: 此属性值取决于目标资源的最终状态,而不取决于源资源上的属性值。还要注意第8.8节中的注意事项。

Description: 必须在需要返回Etag header的任何DAV兼容资源上定义getetag属性。有关ETag语义的完整定义,请参阅RFC 2616的3.11节;有关WebDAV中ETag的讨论,请参阅8.6节。

<!ELEMENT getetag (#PCDATA) >

15.7 getlastmodified

Name: getlastmodified

Purpose: 包含Last-Modified header的值(来自[RFC2616]的14.29节),因为该值将由没有accept header的GET方法返回。

Value: rfc1123-date(在[RFC2616]的3.3.1节中定义)

Protected: 应该保护它,因为某些客户端可能依赖于该值来实现适当的缓存行为,或者依赖于此属性链接到的Last-Modified header的值。

COPY/MOVE behavior: 此属性值取决于目标资源的最后修改日期,而不取决于源资源上的值。请注意,某些服务器实现会把文件系统的最后修改时间作为DAV:getlastmodified的值,这样的话它就可以被保留在MOVE中,即使HTTP Last-Modified值应该更改了。请注意,由于[RFC2616]要求客户端在有可能的情况下使用ETag,因此实现ETag的服务器可以依靠客户端来设计比lastmodified属性更好的机制以进行脱机同步或缓存控制。还要注意第8.8节中的注意事项。

Description: 资源上的最后修改日期应仅反映资源正文(GET响应)中的更改。属性的更改不应导致最后修改日期发生更改,因为客户可能依赖于最后修改日期才能知道是否该覆盖现有主体。必须在任何DAV兼容的资源上定义DAV:getlastmodified属性,该资源会在响应GET请求时以这个属性的值来返回Last-Modified header。

<!ELEMENT getlastmodified (#PCDATA) >

15.8 lockdiscovery

Name: lockdiscovery

Purpose: 描述资源上的活动锁

Protected: 必须受到保护。客户端通过LOCK和UNLOCK而不是通过PROPPATCH来更改锁的列表。

COPY/MOVE behavior: 此属性的值取决于目标的锁状态,而不取决于源资源的锁。回顾一下,在MOVE操作中锁并没有被移动。

Description: 返回一个列表,它列出了所有拥有锁的人、锁的类型、超时类型和剩余超时时长以及相关锁令牌的列表。如果所有者信息被认为是敏感的,则可以省略。如果没有锁,但是服务器支持锁,则该属性将存在,但包含零个“ activelock”元素。如果有一个或多个锁,则资源上的每个锁都会出现一个“activelock”元素。由于写入锁的存在,此属性是不可锁定的(第7节)。

<!ELEMENT lockdiscovery (activelock)* >

15.8.1 实例 - 获得 DAV:lockdiscovery

请求内容:

  1. PROPFIND /container/ HTTP/1.1
  2. Host: www.example.com
  3. Content-Length: xxxx
  4. Content-Type: application/xml; charset="utf-8"
  5. <?xml version="1.0" encoding="utf-8" ?>
  6. <D:propfind xmlns:D='DAV:'>
  7. <D:prop><D:lockdiscovery/></D:prop>
  8. </D:propfind>

返回内容:

  1. HTTP/1.1 207 Multi-Status
  2. Content-Type: application/xml; charset="utf-8"
  3. Content-Length: xxxx
  4. <?xml version="1.0" encoding="utf-8" ?>
  5. <D:multistatus xmlns:D='DAV:'>
  6. <D:response>
  7. <D:href>http://www.example.com/container/</D:href>
  8. <D:propstat>
  9. <D:prop>
  10. <D:lockdiscovery>
  11. <D:activelock>
  12. <D:locktype><D:write/></D:locktype>
  13. <D:lockscope><D:exclusive/></D:lockscope>
  14. <D:depth>0</D:depth>
  15. <D:owner>Jane Smith</D:owner>
  16. <D:timeout>Infinite</D:timeout>
  17. <D:locktoken>
  18. <D:href>urn:uuid:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76</D:href>
  19. </D:locktoken>
  20. <D:lockroot>
  21. <D:href>http://www.example.com/container/</href>
  22. </D:lockroot>
  23. </D:activelock>
  24. </D:lockdiscovery>
  25. </D:prop>
  26. <D:status>HTTP/1.1 200 OK</D:status>
  27. </D:propstat>
  28. </D:response>
  29. </D:multistatus>

该资源有一个无限超时时长的排他写入锁。

15.9 resourcetype

Name: resourcetype

Purpose: 指定资源的性质(集合或者内容)。

Protected: 应该受到保护。资源类型通常是通过创建资源的操作(MKCOL与PUT)决定的,而不是由PROPPATCH决定的。

COPY/MOVE behavior: 通常,资源的COPY / MOVE会在目标位置产生相同类型的资源。

Description: 必须在所有DAV兼容的资源上定义此属性。每个子元素标识资源所属的特定类型,例如“collection”,这是本规范定义的唯一资源类型(请参阅第14.3节)。如果该元素包含“collection”子元素以及其他无法识别的元素,则通常应将其视为集合。如果元素不包含可识别的子元素,则应将其视为非集合资源。默认值为空。该元素不能包含文本或混合内容。任何自定义子元素都被视为资源类型的标识符。

实例:一个虚构的例子来演示扩展性

  1. <x:resourcetype xmlns:x="DAV:">
  2. <x:collection/>
  3. <f:search-results xmlns:f="http://www.example.com/ns"/>
  4. </x:resourcetype>

15.10 supportedlock

Name: supportedlock

Purpose: 提供资源支持的锁定功能的列表。

Protected: 必须受到保护。由服务器而不是客户端来确定支持哪些锁定机制。

COPY/MOVE behavior: 此属性值取决于目标上支持的锁的类型,而不取决于源资源上的属性的值。 服务器尝试复制内容到目标时不应尝试在目标上设置此属性。

Description: 返回一个列表,列表项是一个锁的范围和权限类型的集合体。请注意,实际内容本身由访问控制来控制,因此不需要服务器为一个无查看权限的客户端提供信息。 对于写入锁的存在,此属性不可锁定(第7节)。

<!ELEMENT supportedlock (lockentry)* >

15.10.1 实例 - 获得 DAV:supportedlock

请求内容:

  1. PROPFIND /container/ HTTP/1.1
  2. Host: www.example.com
  3. Content-Length: xxxx
  4. Content-Type: application/xml; charset="utf-8"
  5. <?xml version="1.0" encoding="utf-8" ?>
  6. <D:propfind xmlns:D="DAV:">
  7. <D:prop><D:supportedlock/></D:prop>
  8. </D:propfind>

返回内容:

  1. HTTP/1.1 207 Multi-Status
  2. Content-Type: application/xml; charset="utf-8"
  3. Content-Length: xxxx
  4. <?xml version="1.0" encoding="utf-8" ?>
  5. <D:multistatus xmlns:D="DAV:">
  6. <D:response>
  7. <D:href>http://www.example.com/container/</D:href>
  8. <D:propstat>
  9. <D:prop>
  10. <D:supportedlock>
  11. <D:lockentry>
  12. <D:lockscope><D:exclusive/></D:lockscope>
  13. <D:locktype><D:write/></D:locktype>
  14. </D:lockentry>
  15. <D:lockentry>
  16. <D:lockscope><D:shared/></D:lockscope>
  17. <D:locktype><D:write/></D:locktype>
  18. </D:lockentry>
  19. </D:supportedlock>
  20. </D:prop>
  21. <D:status>HTTP/1.1 200 OK</D:status>
  22. </D:propstat>
  23. </D:response>
  24. </D:multistatus>