diff options
Diffstat (limited to 'src/dav/types.rs')
-rw-r--r-- | src/dav/types.rs | 950 |
1 files changed, 0 insertions, 950 deletions
diff --git a/src/dav/types.rs b/src/dav/types.rs deleted file mode 100644 index 5ea38d1..0000000 --- a/src/dav/types.rs +++ /dev/null @@ -1,950 +0,0 @@ -#![allow(dead_code)] -use std::fmt::Debug; - -use chrono::{DateTime,FixedOffset}; -use super::xml; -use super::error; - -/// It's how we implement a DAV extension -/// (That's the dark magic part...) -pub trait Extension: std::fmt::Debug + PartialEq { - type Error: xml::Node<Self::Error>; - type Property: xml::Node<Self::Property>; - type PropertyRequest: xml::Node<Self::PropertyRequest>; - type ResourceType: xml::Node<Self::ResourceType>; -} - -/// 14.1. activelock XML Element -/// -/// Name: activelock -/// -/// Purpose: Describes a lock on a resource. -/// <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?, -/// locktoken?, lockroot)> -#[derive(Debug, PartialEq)] -pub struct ActiveLock { - pub lockscope: LockScope, - pub locktype: LockType, - pub depth: Depth, - pub owner: Option<Owner>, - pub timeout: Option<Timeout>, - pub locktoken: Option<LockToken>, - pub lockroot: LockRoot, -} - -/// 14.3 collection XML Element -/// -/// Name: collection -/// -/// Purpose: Identifies the associated resource as a collection. The -/// DAV:resourcetype property of a collection resource MUST contain -/// this element. It is normally empty but extensions may add sub- -/// elements. -/// -/// <!ELEMENT collection EMPTY > -#[derive(Debug, PartialEq)] -pub struct Collection{} - -/// 14.4 depth XML Element -/// -/// Name: depth -/// -/// Purpose: Used for representing depth values in XML content (e.g., -/// in lock information). -/// -/// Value: "0" | "1" | "infinity" -/// -/// <!ELEMENT depth (#PCDATA) > -#[derive(Debug, PartialEq)] -pub enum Depth { - Zero, - One, - Infinity -} - -/// 14.5 error XML Element -/// -/// Name: error -/// -/// Purpose: Error responses, particularly 403 Forbidden and 409 -/// Conflict, sometimes need more information to indicate what went -/// wrong. In these cases, servers MAY return an XML response body -/// with a document element of 'error', containing child elements -/// identifying particular condition codes. -/// -/// Description: Contains at least one XML element, and MUST NOT -/// contain text or mixed content. Any element that is a child of the -/// 'error' element is considered to be a precondition or -/// postcondition code. Unrecognized elements MUST be ignored. -/// -/// <!ELEMENT error ANY > -#[derive(Debug, PartialEq)] -pub struct Error<E: Extension>(pub Vec<Violation<E>>); -#[derive(Debug, PartialEq)] -pub enum Violation<E: Extension> { - /// Name: lock-token-matches-request-uri - /// - /// Use with: 409 Conflict - /// - /// Purpose: (precondition) -- A request may include a Lock-Token header - /// to identify a lock for the UNLOCK method. However, if the - /// Request-URI does not fall within the scope of the lock identified - /// by the token, the server SHOULD use this error. The lock may have - /// a scope that does not include the Request-URI, or the lock could - /// have disappeared, or the token may be invalid. - LockTokenMatchesRequestUri, - - /// Name: lock-token-submitted (precondition) - /// - /// Use with: 423 Locked - /// - /// Purpose: The request could not succeed because a lock token should - /// have been submitted. This element, if present, MUST contain at - /// least one URL of a locked resource that prevented the request. In - /// cases of MOVE, COPY, and DELETE where collection locks are - /// involved, it can be difficult for the client to find out which - /// locked resource made the request fail -- but the server is only - /// responsible for returning one such locked resource. The server - /// MAY return every locked resource that prevented the request from - /// succeeding if it knows them all. - /// - /// <!ELEMENT lock-token-submitted (href+) > - LockTokenSubmitted(Vec<Href>), - - /// Name: no-conflicting-lock (precondition) - /// - /// Use with: Typically 423 Locked - /// - /// Purpose: A LOCK request failed due the presence of an already - /// existing conflicting lock. Note that a lock can be in conflict - /// although the resource to which the request was directed is only - /// indirectly locked. In this case, the precondition code can be - /// used to inform the client about the resource that is the root of - /// the conflicting lock, avoiding a separate lookup of the - /// "lockdiscovery" property. - /// - /// <!ELEMENT no-conflicting-lock (href)* > - NoConflictingLock(Vec<Href>), - - /// Name: no-external-entities - /// - /// Use with: 403 Forbidden - /// - /// Purpose: (precondition) -- If the server rejects a client request - /// because the request body contains an external entity, the server - /// SHOULD use this error. - NoExternalEntities, - - /// Name: preserved-live-properties - /// - /// Use with: 409 Conflict - /// - /// Purpose: (postcondition) -- The server received an otherwise-valid - /// MOVE or COPY request, but cannot maintain the live properties with - /// the same behavior at the destination. It may be that the server - /// only supports some live properties in some parts of the - /// repository, or simply has an internal error. - PreservedLiveProperties, - - /// Name: propfind-finite-depth - /// - /// Use with: 403 Forbidden - /// - /// Purpose: (precondition) -- This server does not allow infinite-depth - /// PROPFIND requests on collections. - PropfindFiniteDepth, - - - /// Name: cannot-modify-protected-property - /// - /// Use with: 403 Forbidden - /// - /// Purpose: (precondition) -- The client attempted to set a protected - /// property in a PROPPATCH (such as DAV:getetag). See also - /// [RFC3253], Section 3.12. - CannotModifyProtectedProperty, - - /// Specific errors - Extension(E::Error), -} - -/// 14.6. exclusive XML Element -/// -/// Name: exclusive -/// -/// Purpose: Specifies an exclusive lock. -/// -/// <!ELEMENT exclusive EMPTY > -#[derive(Debug, PartialEq)] -pub struct Exclusive {} - -/// 14.7. href XML Element -/// -/// Name: href -/// -/// Purpose: MUST contain a URI or a relative reference. -/// -/// Description: There may be limits on the value of 'href' depending -/// on the context of its use. Refer to the specification text where -/// 'href' is used to see what limitations apply in each case. -/// -/// Value: Simple-ref -/// -/// <!ELEMENT href (#PCDATA)> -#[derive(Debug, PartialEq)] -pub struct Href(pub String); - - -/// 14.8. include XML Element -/// -/// Name: include -/// -/// Purpose: Any child element represents the name of a property to be -/// included in the PROPFIND response. All elements inside an -/// 'include' XML element MUST define properties related to the -/// resource, although possible property names are in no way limited -/// to those property names defined in this document or other -/// standards. This element MUST NOT contain text or mixed content. -/// -/// <!ELEMENT include ANY > -#[derive(Debug, PartialEq)] -pub struct Include<E: Extension>(pub Vec<PropertyRequest<E>>); - -/// 14.9. location XML Element -/// -/// Name: location -/// -/// Purpose: HTTP defines the "Location" header (see [RFC2616], Section -/// 14.30) for use with some status codes (such as 201 and the 300 -/// series codes). When these codes are used inside a 'multistatus' -/// element, the 'location' element can be used to provide the -/// accompanying Location header value. -/// -/// Description: Contains a single href element with the same value -/// that would be used in a Location header. -/// -/// <!ELEMENT location (href)> -#[derive(Debug, PartialEq)] -pub struct Location(pub Href); - -/// 14.10. lockentry XML Element -/// -/// Name: lockentry -/// -/// Purpose: Defines the types of locks that can be used with the -/// resource. -/// -/// <!ELEMENT lockentry (lockscope, locktype) > -#[derive(Debug, PartialEq)] -pub struct LockEntry { - pub lockscope: LockScope, - pub locktype: LockType, -} - -/// 14.11. lockinfo XML Element -/// -/// Name: lockinfo -/// -/// Purpose: The 'lockinfo' XML element is used with a LOCK method to -/// specify the type of lock the client wishes to have created. -/// -/// <!ELEMENT lockinfo (lockscope, locktype, owner?) > -#[derive(Debug, PartialEq)] -pub struct LockInfo { - pub lockscope: LockScope, - pub locktype: LockType, - pub owner: Option<Owner>, -} - -/// 14.12. lockroot XML Element -/// -/// Name: lockroot -/// -/// Purpose: Contains the root URL of the lock, which is the URL -/// through which the resource was addressed in the LOCK request. -/// -/// Description: The href element contains the root of the lock. The -/// server SHOULD include this in all DAV:lockdiscovery property -/// values and the response to LOCK requests. -/// -/// <!ELEMENT lockroot (href) > -#[derive(Debug, PartialEq)] -pub struct LockRoot(pub Href); - -/// 14.13. lockscope XML Element -/// -/// Name: lockscope -/// -/// Purpose: Specifies whether a lock is an exclusive lock, or a shared -/// lock. -/// <!ELEMENT lockscope (exclusive | shared) > -#[derive(Debug, PartialEq)] -pub enum LockScope { - Exclusive, - Shared -} - -/// 14.14. locktoken XML Element -/// -/// Name: locktoken -/// -/// Purpose: The lock token associated with a lock. -/// -/// Description: The href contains a single lock token URI, which -/// refers to the lock. -/// -/// <!ELEMENT locktoken (href) > -#[derive(Debug, PartialEq)] -pub struct LockToken(pub Href); - -/// 14.15. locktype XML Element -/// -/// Name: locktype -/// -/// Purpose: Specifies the access type of a lock. At present, this -/// specification only defines one lock type, the write lock. -/// -/// <!ELEMENT locktype (write) > -#[derive(Debug, PartialEq)] -pub enum LockType { - /// 14.30. write XML Element - /// - /// Name: write - /// - /// Purpose: Specifies a write lock. - /// - /// - /// <!ELEMENT write EMPTY > - Write -} - -/// 14.16. multistatus XML Element -/// -/// Name: multistatus -/// -/// Purpose: Contains multiple response messages. -/// -/// Description: The 'responsedescription' element at the top level is -/// used to provide a general message describing the overarching -/// nature of the response. If this value is available, an -/// application may use it instead of presenting the individual -/// response descriptions contained within the responses. -/// -/// <!ELEMENT multistatus (response*, responsedescription?) > -#[derive(Debug, PartialEq)] -pub struct Multistatus<E: Extension, N: xml::Node<N>> { - pub responses: Vec<Response<E, N>>, - pub responsedescription: Option<ResponseDescription>, -} - -/// 14.17. owner XML Element -/// -/// Name: owner -/// -/// Purpose: Holds client-supplied information about the creator of a -/// lock. -/// -/// Description: Allows a client to provide information sufficient for -/// either directly contacting a principal (such as a telephone number -/// or Email URI), or for discovering the principal (such as the URL -/// of a homepage) who created a lock. The value provided MUST be -/// treated as a dead property in terms of XML Information Item -/// preservation. The server MUST NOT alter the value unless the -/// owner value provided by the client is empty. For a certain amount -/// of interoperability between different client implementations, if -/// clients have URI-formatted contact information for the lock -/// creator suitable for user display, then clients SHOULD put those -/// URIs in 'href' child elements of the 'owner' element. -/// -/// Extensibility: MAY be extended with child elements, mixed content, -/// text content or attributes. -/// -/// <!ELEMENT owner ANY > -//@FIXME might need support for an extension -#[derive(Debug, PartialEq)] -pub enum Owner { - Txt(String), - Href(Href), - Unknown, -} - -/// 14.18. prop XML Element -/// -/// Name: prop -/// -/// Purpose: Contains properties related to a resource. -/// -/// Description: A generic container for properties defined on -/// resources. All elements inside a 'prop' XML element MUST define -/// properties related to the resource, although possible property -/// names are in no way limited to those property names defined in -/// this document or other standards. This element MUST NOT contain -/// text or mixed content. -/// -/// <!ELEMENT prop ANY > -#[derive(Debug, PartialEq)] -pub struct PropName<E: Extension>(pub Vec<PropertyRequest<E>>); - -#[derive(Debug, PartialEq)] -pub struct PropValue<E: Extension>(pub Vec<Property<E>>); - -/// 14.19. propertyupdate XML Element -/// -/// Name: propertyupdate -/// -/// Purpose: Contains a request to alter the properties on a resource. -/// -/// Description: This XML element is a container for the information -/// required to modify the properties on the resource. -/// -/// <!ELEMENT propertyupdate (remove | set)+ > -#[derive(Debug, PartialEq)] -pub struct PropertyUpdate<E: Extension>(pub Vec<PropertyUpdateItem<E>>); - -#[derive(Debug, PartialEq)] -pub enum PropertyUpdateItem<E: Extension> { - Remove(Remove<E>), - Set(Set<E>), -} - -/// 14.2 allprop XML Element -/// -/// Name: allprop -/// -/// Purpose: Specifies that all names and values of dead properties and -/// the live properties defined by this document existing on the -/// resource are to be returned. -/// -/// <!ELEMENT allprop EMPTY > -/// -/// --- -/// -/// 14.21. propname XML Element -/// -/// Name: propname -/// -/// Purpose: Specifies that only a list of property names on the -/// resource is to be returned. -/// -/// <!ELEMENT propname EMPTY > -/// -/// --- -/// -/// 14.20. propfind XML Element -/// -/// Name: propfind -/// -/// Purpose: Specifies the properties to be returned from a PROPFIND -/// method. Four special elements are specified for use with -/// 'propfind': 'prop', 'allprop', 'include', and 'propname'. If -/// 'prop' is used inside 'propfind', it MUST NOT contain property -/// values. -/// -/// <!ELEMENT propfind ( propname | (allprop, include?) | prop ) > -#[derive(Debug, PartialEq)] -pub enum PropFind<E: Extension> { - PropName, - AllProp(Option<Include<E>>), - Prop(PropName<E>), -} - -/// 14.22 propstat XML Element -/// -/// Name: propstat -/// -/// Purpose: Groups together a prop and status element that is -/// associated with a particular 'href' element. -/// -/// Description: The propstat XML element MUST contain one prop XML -/// element and one status XML element. The contents of the prop XML -/// element MUST only list the names of properties to which the result -/// in the status element applies. The optional precondition/ -/// postcondition element and 'responsedescription' text also apply to -/// the properties named in 'prop'. -/// -/// <!ELEMENT propstat (prop, status, error?, responsedescription?) > -#[derive(Debug, PartialEq)] -pub struct PropStat<E: Extension, N: xml::Node<N>> { - pub prop: N, - pub status: Status, - pub error: Option<Error<E>>, - pub responsedescription: Option<ResponseDescription>, -} - -/// 14.23. remove XML Element -/// -/// Name: remove -/// -/// Purpose: Lists the properties to be removed from a resource. -/// -/// Description: Remove instructs that the properties specified in prop -/// should be removed. Specifying the removal of a property that does -/// not exist is not an error. All the XML elements in a 'prop' XML -/// element inside of a 'remove' XML element MUST be empty, as only -/// the names of properties to be removed are required. -/// -/// <!ELEMENT remove (prop) > -#[derive(Debug, PartialEq)] -pub struct Remove<E: Extension>(pub PropName<E>); - -/// 14.24. response XML Element -/// -/// Name: response -/// -/// Purpose: Holds a single response describing the effect of a method -/// on resource and/or its properties. -/// -/// Description: The 'href' element contains an HTTP URL pointing to a -/// WebDAV resource when used in the 'response' container. A -/// particular 'href' value MUST NOT appear more than once as the -/// child of a 'response' XML element under a 'multistatus' XML -/// element. This requirement is necessary in order to keep -/// processing costs for a response to linear time. Essentially, this -/// prevents having to search in order to group together all the -/// responses by 'href'. There are, however, no requirements -/// regarding ordering based on 'href' values. The optional -/// precondition/postcondition element and 'responsedescription' text -/// can provide additional information about this resource relative to -/// the request or result. -/// -/// <!ELEMENT response (href, ((href*, status)|(propstat+)), -/// error?, responsedescription? , location?) > -/// -/// --- rewritten as --- -/// <!ELEMENT response ((href+, status)|(href, propstat+), error?, responsedescription?, location?> -#[derive(Debug, PartialEq)] -pub enum StatusOrPropstat<E: Extension, N: xml::Node<N>> { - // One status, multiple hrefs... - Status(Vec<Href>, Status), - // A single href, multiple properties... - PropStat(Href, Vec<PropStat<E, N>>), -} - -#[derive(Debug, PartialEq)] -pub struct Response<E: Extension, N: xml::Node<N>> { - pub status_or_propstat: StatusOrPropstat<E, N>, - pub error: Option<Error<E>>, - pub responsedescription: Option<ResponseDescription>, - pub location: Option<Location>, -} - -/// 14.25. responsedescription XML Element -/// -/// Name: responsedescription -/// -/// Purpose: Contains information about a status response within a -/// Multi-Status. -/// -/// Description: Provides information suitable to be presented to a -/// user. -/// -/// <!ELEMENT responsedescription (#PCDATA) > -#[derive(Debug, PartialEq)] -pub struct ResponseDescription(pub String); - -/// 14.26. set XML Element -/// -/// Name: set -/// -/// Purpose: Lists the property values to be set for a resource. -/// -/// Description: The 'set' element MUST contain only a 'prop' element. -/// The elements contained by the 'prop' element inside the 'set' -/// element MUST specify the name and value of properties that are set -/// on the resource identified by Request-URI. If a property already -/// exists, then its value is replaced. Language tagging information -/// appearing in the scope of the 'prop' element (in the "xml:lang" -/// attribute, if present) MUST be persistently stored along with the -/// property, and MUST be subsequently retrievable using PROPFIND. -/// -/// <!ELEMENT set (prop) > -#[derive(Debug, PartialEq)] -pub struct Set<E: Extension>(pub PropValue<E>); - -/// 14.27. shared XML Element -/// -/// Name: shared -/// -/// Purpose: Specifies a shared lock. -/// -/// -/// <!ELEMENT shared EMPTY > -#[derive(Debug, PartialEq)] -pub struct Shared {} - - -/// 14.28. status XML Element -/// -/// Name: status -/// -/// Purpose: Holds a single HTTP status-line. -/// -/// Value: status-line (defined in Section 6.1 of [RFC2616]) -/// -/// <!ELEMENT status (#PCDATA) > -//@FIXME: Better typing is possible with an enum for example -#[derive(Debug, PartialEq)] -pub struct Status(pub http::status::StatusCode); - -/// 14.29. timeout XML Element -/// -/// Name: timeout -/// -/// Purpose: The number of seconds remaining before a lock expires. -/// -/// Value: TimeType (defined in Section 10.7) -/// -/// -/// <!ELEMENT timeout (#PCDATA) > -/// -/// TimeOut = "Timeout" ":" 1#TimeType -/// TimeType = ("Second-" DAVTimeOutVal | "Infinite") -/// ; No LWS allowed within TimeType -/// DAVTimeOutVal = 1*DIGIT -/// -/// Clients MAY include Timeout request headers in their LOCK requests. -/// However, the server is not required to honor or even consider these -/// requests. Clients MUST NOT submit a Timeout request header with any -/// method other than a LOCK method. -/// -/// The "Second" TimeType specifies the number of seconds that will -/// elapse between granting of the lock at the server, and the automatic -/// removal of the lock. The timeout value for TimeType "Second" MUST -/// NOT be greater than 2^32-1. -#[derive(Debug, PartialEq)] -pub enum Timeout { - Seconds(u32), - Infinite, -} - - -/// 15. DAV Properties -/// -/// For DAV properties, the name of the property is also the same as the -/// name of the XML element that contains its value. In the section -/// below, the final line of each section gives the element type -/// declaration using the format defined in [REC-XML]. The "Value" -/// field, where present, specifies further restrictions on the allowable -/// contents of the XML element using BNF (i.e., to further restrict the -/// values of a PCDATA element). -/// -/// A protected property is one that cannot be changed with a PROPPATCH -/// request. There may be other requests that would result in a change -/// to a protected property (as when a LOCK request affects the value of -/// DAV:lockdiscovery). Note that a given property could be protected on -/// one type of resource, but not protected on another type of resource. -/// -/// A computed property is one with a value defined in terms of a -/// computation (based on the content and other properties of that -/// resource, or even of some other resource). A computed property is -/// always a protected property. -/// -/// COPY and MOVE behavior refers to local COPY and MOVE operations. -/// -/// For properties defined based on HTTP GET response headers (DAV:get*), -/// the header value could include LWS as defined in [RFC2616], Section -/// 4.2. Server implementors SHOULD strip LWS from these values before -/// using as WebDAV property values. -#[derive(Debug, PartialEq)] -pub enum PropertyRequest<E: Extension> { - CreationDate, - DisplayName, - GetContentLanguage, - GetContentLength, - GetContentType, - GetEtag, - GetLastModified, - LockDiscovery, - ResourceType, - SupportedLock, - Extension(E::PropertyRequest), -} - -#[derive(Debug, PartialEq)] -pub enum Property<E: Extension> { - /// 15.1. creationdate Property - /// - /// Name: creationdate - /// - /// Purpose: Records the time and date the resource was created. - /// - /// Value: date-time (defined in [RFC3339], see the ABNF in Section - /// 5.6.) - /// - /// Protected: MAY be protected. Some servers allow DAV:creationdate - /// to be changed to reflect the time the document was created if that - /// is more meaningful to the user (rather than the time it was - /// uploaded). Thus, clients SHOULD NOT use this property in - /// synchronization logic (use DAV:getetag instead). - /// - /// COPY/MOVE behavior: This property value SHOULD be kept during a - /// MOVE operation, but is normally re-initialized when a resource is - /// created with a COPY. It should not be set in a COPY. - /// - /// Description: The DAV:creationdate property SHOULD be defined on all - /// DAV compliant resources. If present, it contains a timestamp of - /// the moment when the resource was created. Servers that are - /// incapable of persistently recording the creation date SHOULD - /// instead leave it undefined (i.e. report "Not Found"). - /// - /// <!ELEMENT creationdate (#PCDATA) > - CreationDate(DateTime<FixedOffset>), - - /// 15.2. displayname Property - /// - /// Name: displayname - /// - /// Purpose: Provides a name for the resource that is suitable for - /// presentation to a user. - /// - /// Value: Any text. - /// - /// Protected: SHOULD NOT be protected. Note that servers implementing - /// [RFC2518] might have made this a protected property as this is a - /// new requirement. - /// - /// COPY/MOVE behavior: This property value SHOULD be preserved in COPY - /// and MOVE operations. - /// - /// Description: Contains a description of the resource that is - /// suitable for presentation to a user. This property is defined on - /// the resource, and hence SHOULD have the same value independent of - /// the Request-URI used to retrieve it (thus, computing this property - /// based on the Request-URI is deprecated). While generic clients - /// might display the property value to end users, client UI designers - /// must understand that the method for identifying resources is still - /// the URL. Changes to DAV:displayname do not issue moves or copies - /// to the server, but simply change a piece of meta-data on the - /// individual resource. Two resources can have the same DAV: - /// displayname value even within the same collection. - /// - /// <!ELEMENT displayname (#PCDATA) > - DisplayName(String), - - - /// 15.3. getcontentlanguage Property - /// - /// Name: getcontentlanguage - /// - /// Purpose: Contains the Content-Language header value (from Section - /// 14.12 of [RFC2616]) as it would be returned by a GET without - /// accept headers. - /// - /// Value: language-tag (language-tag is defined in Section 3.10 of - /// [RFC2616]) - /// - /// Protected: SHOULD NOT be protected, so that clients can reset the - /// language. Note that servers implementing [RFC2518] might have - /// made this a protected property as this is a new requirement. - /// - /// COPY/MOVE behavior: This property value SHOULD be preserved in COPY - /// and MOVE operations. - /// - /// Description: The DAV:getcontentlanguage property MUST be defined on - /// any DAV-compliant resource that returns the Content-Language - /// header on a GET. - /// - /// <!ELEMENT getcontentlanguage (#PCDATA) > - GetContentLanguage(String), - - /// 15.4. getcontentlength Property - /// - /// Name: getcontentlength - /// - /// Purpose: Contains the Content-Length header returned by a GET - /// without accept headers. - /// - /// Value: See Section 14.13 of [RFC2616]. - /// - /// Protected: This property is computed, therefore protected. - /// - /// Description: The DAV:getcontentlength property MUST be defined on - /// any DAV-compliant resource that returns the Content-Length header - /// in response to a GET. - /// - /// COPY/MOVE behavior: This property value is dependent on the size of - /// the destination resource, not the value of the property on the - /// source resource. - /// - /// <!ELEMENT getcontentlength (#PCDATA) > - GetContentLength(u64), - - /// 15.5. getcontenttype Property - /// - /// Name: getcontenttype - /// - /// Purpose: Contains the Content-Type header value (from Section 14.17 - /// of [RFC2616]) as it would be returned by a GET without accept - /// headers. - /// - /// Value: media-type (defined in Section 3.7 of [RFC2616]) - /// - /// Protected: Potentially protected if the server prefers to assign - /// content types on its own (see also discussion in Section 9.7.1). - /// - /// COPY/MOVE behavior: This property value SHOULD be preserved in COPY - /// and MOVE operations. - /// - /// Description: This property MUST be defined on any DAV-compliant - /// resource that returns the Content-Type header in response to a - /// GET. - /// - /// <!ELEMENT getcontenttype (#PCDATA) > - GetContentType(String), - - /// 15.6. getetag Property - /// - /// Name: getetag - /// - /// Purpose: Contains the ETag header value (from Section 14.19 of - /// [RFC2616]) as it would be returned by a GET without accept - /// headers. - /// - /// Value: entity-tag (defined in Section 3.11 of [RFC2616]) - /// - /// Protected: MUST be protected because this value is created and - /// controlled by the server. - /// - /// COPY/MOVE behavior: This property value is dependent on the final - /// state of the destination resource, not the value of the property - /// on the source resource. Also note the considerations in - /// Section 8.8. - /// - /// Description: The getetag property MUST be defined on any DAV- - /// compliant resource that returns the Etag header. Refer to Section - /// 3.11 of RFC 2616 for a complete definition of the semantics of an - /// ETag, and to Section 8.6 for a discussion of ETags in WebDAV. - /// - /// <!ELEMENT getetag (#PCDATA) > - GetEtag(String), - - /// 15.7. getlastmodified Property - /// - /// Name: getlastmodified - /// - /// Purpose: Contains the Last-Modified header value (from Section - /// 14.29 of [RFC2616]) as it would be returned by a GET method - /// without accept headers. - /// - /// Value: rfc1123-date (defined in Section 3.3.1 of [RFC2616]) - /// - /// Protected: SHOULD be protected because some clients may rely on the - /// value for appropriate caching behavior, or on the value of the - /// Last-Modified header to which this property is linked. - /// - /// COPY/MOVE behavior: This property value is dependent on the last - /// modified date of the destination resource, not the value of the - /// property on the source resource. Note that some server - /// implementations use the file system date modified value for the - /// DAV:getlastmodified value, and this can be preserved in a MOVE - /// even when the HTTP Last-Modified value SHOULD change. Note that - /// since [RFC2616] requires clients to use ETags where provided, a - /// server implementing ETags can count on clients using a much better - /// mechanism than modification dates for offline synchronization or - /// cache control. Also note the considerations in Section 8.8. - /// - /// Description: The last-modified date on a resource SHOULD only - /// reflect changes in the body (the GET responses) of the resource. - /// A change in a property only SHOULD NOT cause the last-modified - /// date to change, because clients MAY rely on the last-modified date - /// to know when to overwrite the existing body. The DAV: - /// getlastmodified property MUST be defined on any DAV-compliant - /// resource that returns the Last-Modified header in response to a - /// GET. - /// - /// <!ELEMENT getlastmodified (#PCDATA) > - GetLastModified(DateTime<FixedOffset>), - - /// 15.8. lockdiscovery Property - /// - /// Name: lockdiscovery - /// - /// Purpose: Describes the active locks on a resource - /// - /// Protected: MUST be protected. Clients change the list of locks - /// through LOCK and UNLOCK, not through PROPPATCH. - /// - /// COPY/MOVE behavior: The value of this property depends on the lock - /// state of the destination, not on the locks of the source resource. - /// Recall that locks are not moved in a MOVE operation. - /// - /// Description: Returns a listing of who has a lock, what type of lock - /// he has, the timeout type and the time remaining on the timeout, - /// and the associated lock token. Owner information MAY be omitted - /// if it is considered sensitive. If there are no locks, but the - /// server supports locks, the property will be present but contain - /// zero 'activelock' elements. If there are one or more locks, an - /// 'activelock' element appears for each lock on the resource. This - /// property is NOT lockable with respect to write locks (Section 7). - /// - /// <!ELEMENT lockdiscovery (activelock)* > - LockDiscovery(Vec<ActiveLock>), - - - /// 15.9. resourcetype Property - /// - /// Name: resourcetype - /// - /// Purpose: Specifies the nature of the resource. - /// - /// Protected: SHOULD be protected. Resource type is generally decided - /// through the operation creating the resource (MKCOL vs PUT), not by - /// PROPPATCH. - /// - /// COPY/MOVE behavior: Generally a COPY/MOVE of a resource results in - /// the same type of resource at the destination. - /// - /// Description: MUST be defined on all DAV-compliant resources. Each - /// child element identifies a specific type the resource belongs to, - /// such as 'collection', which is the only resource type defined by - /// this specification (see Section 14.3). If the element contains - /// the 'collection' child element plus additional unrecognized - /// elements, it should generally be treated as a collection. If the - /// element contains no recognized child elements, it should be - /// treated as a non-collection resource. The default value is empty. - /// This element MUST NOT contain text or mixed content. Any custom - /// child element is considered to be an identifier for a resource - /// type. - /// - /// Example: (fictional example to show extensibility) - /// - /// <x:resourcetype xmlns:x="DAV:"> - /// <x:collection/> - /// <f:search-results xmlns:f="http://www.example.com/ns"/> - /// </x:resourcetype> - ResourceType(Vec<ResourceType<E>>), - - /// 15.10. supportedlock Property - /// - /// Name: supportedlock - /// - /// Purpose: To provide a listing of the lock capabilities supported by - /// the resource. - /// - /// Protected: MUST be protected. Servers, not clients, determine what - /// lock mechanisms are supported. - /// COPY/MOVE behavior: This property value is dependent on the kind of - /// locks supported at the destination, not on the value of the - /// property at the source resource. Servers attempting to COPY to a - /// destination should not attempt to set this property at the - /// destination. - /// - /// Description: Returns a listing of the combinations of scope and - /// access types that may be specified in a lock request on the - /// resource. Note that the actual contents are themselves controlled - /// by access controls, so a server is not required to provide - /// information the client is not authorized to see. This property is - /// NOT lockable with respect to write locks (Section 7). - /// - /// <!ELEMENT supportedlock (lockentry)* > - SupportedLock(Vec<LockEntry>), - - /// Any extension - Extension(E::Property), -} - -#[derive(Debug, PartialEq)] -pub enum ResourceType<E: Extension> { - Collection, - Extension(E::ResourceType), -} |