To: Juergen Reuter <reuterj@ira.uka.de> Cc: ietf-dav-versioning@w3.org From: "Tim Ellison/OTT/OTI" <Tim_Ellison@oti.com> Message-ID: <OF5B60ADB4.5AC59530-ON852568E3.0055B26C@ott.oti.com> Date: Thu, 18 May 2000 11:38:14 -0400 Subject: Re: draft-ietf-deltav04.5 now available Juergen, I agree with most of your comments. I have sent separate messages to the list for areas that may require further discussion. Tim Juergen Reuter <reuterj@ira.uka.de> Sent by: ietf-dav-versioning-request@w3.org 17/05/00 11:20 AM To: "Clemm, Geoff" <gclemm@rational.com> cc: "DeltaV (E-mail)" <ietf-dav-versioning@w3.org>, jjh@ira.uka.de, reuterj@ira.uka.de Subject: Re: draft-ietf-deltav04.5 now available Hi, all! This is a partial review of draft-ietf-deltav-versioning-04.5.htm. It only covers those sections that are relevant for basic versioning. I apologize for this late review and for currently having not enough time for a full review; I also had not enough time to sort out those issues that others may already have pointed out. Nevertheless, I hope that this review helps to improve the protocol. Table of Contents ----------------- Many headlines end with a period where it probably should not occur (at least, the "." do not occur consistently). Section 1 --------- For the reader, it would be quite helpful to see a commented listing or table/figure of the protocols and their features that this protocol directly builds upon. For example, is the Bindings protocol required if a server just wants to support basic versioning? Is it required for advanced versioning? Is WebDAV locking required? If locking is required, why? Version control systems usually have some kind of built-in locking mechanism, depending on their versioning model. Is a DeltaV server supposed to map such internal locks to externally visible WebDAV locks (which might be difficult)? What about the redirection resources protocol which was mentioned in early versions of this protocol? It seems to have disappeared. Section 1.2 ----------- > A "versioned resource" ... , it must be checked out ... > A "working resource" ... by applying a CHECKOUT request ... > A "revision" ... by applying a CHECKIN request ... The intention of this section is to introduce terms. I think it is dangerous to refer here to methods like CHECKOUT or CHECKIN which are specified later, because this might lead to circular definitions. (In fact, the term "versionable resource" is defined circularly; cp. my comments to section 6.1). Therefore, I propose to prefer wording like "checking out" rather than "applying a CHECKOUT request". None the less, I do notice that wording like "checking out" is unprecise and therefore may lead the reader to some misconception, depending on the reader's a priori conception of versioning models; but I think this is still better than refering to definitions that appear later in the document and thereby pretending precision which is not really there. > Predecessor, Successor > ... Ancestor and descendant are defined in terms of predecessor and successor. Bearing object inheritence in mind, it would be nice to notice that a predecessor can be viewed as an immediate ancestor and a successor as an immediate descendent. > Foo.htm <sarcasm>CONGRTLS.W95?</sarcasm> :-) > Target DeltaV uses the concept of a single target which may be a a versioned resource, a revision, or a working resource; this is reflected in the Target-Selector header. Alternately, one could introduce a concept that uses a revision-target, a versioned-resource-target and a working-resource-target, reflected by three distinct headers. Just wondering: what was the design rationale for the concept of a single target? Section 1.3 ----------- > Because this augmented BNF uses the basic production rules provided in > Section 2.2 of [RFC2068], those rules apply to this document as well. Except for the LWS production, the augmented BNF in section 2.1 of [RFC2068] does *not* use any of the basic production rules provided in section 2.2. of [RFC2068]; hence, the argumentation is weak. I propose to change the wording e.g. into the following: "The basic production rules provided in Section 2.2 of [RFC2068] apply to this document as well." > The term "protected" is placed in parentheses following the definition > of a property that cannot up updated with a PROPPATCH request. Typo: replace "cannot up updated" with "cannot be updated". Btw, what does "cannot" mean? Return a 403 (Forbidden) or 409 (Conflict) as suggested in section 8.2.1 of [WebDAV] for read-only properties? What is the difference between a "protected" property and a "read-only" property? Yes, I know, a "protected" property may change e.g. as a side effect of a CHECKIN, but not via a PROPPATCH. Section 4.1 of [WebDAV] says: > Live properties include cases where a) the value of a property is > read-only, maintained by the server, and b) the value of the > property is maintained by the client, but the server performs syntax > checking on submitted values. So, a read-only property may also change. Hence I do not see any difference between "protected" and "read-only". Section 2.1 ----------- > An unversioned resource that can be put under version control is > called a versionable resource. What does "can be put under version control" mean? For a suggestion, see my comments to section 6.1. Section 2.2 ----------- > The default target is also selected for any versioned resource other > than the one identified by the request-URL. For example? Section 2.2.1 ------------- > A working resource id does not distinguish working resources from > different versioned resources ... since the same working resource id > can be assigned ... This probably should read: "A working resource id does not need to distinguish working resources from different versioned resources ... since the same working resource id may be assigned ..." Section 2.3 ----------- Could you give an example? Suppose you perform a LOCK request on a versioned resource, and the Target-Selector header of that request contains a label for some revision. Is this equivalent with LOCKing the stable URL of that revision? Section 3 --------- Cp. section 1.3. Section 3.1.2 ------------- > When an id is marshaled in the header of an HTTP request, the > characters are encoded using the UTF-8 encoding scheme. It may be worth noting that, according to the syntax of [HTTP/1.1], the encoded message header field may not contain any CTL character except LWS. Section 3.1.4 ------------- The href element is frequently used throughout WebDAV and should be known to the reader of this protocol, which is an extension to WebDAV; hence I think this section can be dropped. Section 3.2 ----------- WebDAV introduces a format to specify properties: it presents a table with name, namespace, purpose, value, and description of each property. It would be nice to continue this format throughout sections 3.2 ... 3.5, maybe extended by an additional item "type" that distinguishes between "protected", "read-only", and "read/write". Section 3.2.1 ------------- > This property is used to track the author of a resource. Each revision > of a versioned resource can have a different DAV:author values, > indicating who authored that revision. This sounds as if DAV:author is a revision property, but not a versioned resource property or working resource property. Then this section should be moved to section 3.4. Or is the property DAV:author available on revisions, versioned resources and working resources? Then, this should be clearly stated, e.g. by providing a definition of "resource property" in the introduction of section 3.2, for example: "For the purpose of this protocol, a resource property is defined to be a property as specified in [RFC2518] that is available on versioned resources, revisions and working resources." Section 3.2.2 ------------- See section 3.2.1. The same applies here. Section 3.3 ----------- > The DAV:resourcetype of a versioned resource ... This probably should read: "The value of the DAV:resourcetype property of a versioned resource ..." Section 3.3.1 ------------- > <!ELEMENT revision-set (href*)> If a versioned resource may be empty (i.e. contain no revision), then "(href*)" seems appropriate. Otherwise, I would like to vote for "(href+)". Section 2.1 of this protocol should clarify if a versioned resource may be empty. > <!ELEMENT working resource id-set (working-resource-id*)> Typo: replace this with: "<!ELEMENT working-resource-id-set (working-resource-id*)>" > <!ELEMENT working-resource-id (#PCDATA) Typo: missing ">": "<!ELEMENT working-resource-id (#PCDATA)>" Section 3.4 ----------- > ... all revision properties except ... are immutable. "immutable" should be defined somewhere and compared with "read-only" and "protected". "immutable" implies "protected", but not vice-versa, right? "immutable" implies "read-only", but not vice-versa, right? Section 3.4.2 ------------- > Since a revision id can be specified in a target selector header, the > length of a revision id should be compatible with common header length > constraints. Could you give a reference for "common header length constraints"? Were you thinking of section 3.4.8 of RFC 822? Section 3.4.3 ------------- > The DAV:predecessor-set of a revision contains a stable URL for the > revision that was checked out to produce this revision. The > DAV:predecessor-set property can contain multiple revisions if the > advanced versioning MERGE method is supported. > > <!ELEMENT predecessor-set (href*)> As far as I understand, the DAV:predecessor-set for the initial revision contains no href element, which should be mentioned. Otherwise, the predecessor-set element should be defined as "<!ELEMENT predecessor-set (href+)>". How about the following wording: "The DAV:predecessor-set of a revision contains a stable URL for each revision that is a predecessor as specified in section 1.2. Except for the initial revision which does not have any predecessor, each revision either has a single predecessor that was checked out to create this revision, or it has multiple predecessors which it was merged from." Section 3.4.4 ------------- > This property contains a stable URL for each of the revisions whose > DAV:predecessor-set identifies this revision. This probably should read: "This property contains a stable URL for each of the revisions whose DAV:predecessor-set contains a URL that identifies this revision." Section 3.4.5 ------------- > Value: id Yes, I know, I am nitpicking, but the "value" item usually refers to the property's value, while here it refers to the label element, which itself is the property's value. Hence, correctly, it should be read: <!ELEMENT label-set (label*)> Value: <!ELEMENT label (#PCDATA)>, with the child content of this element representing an id. > ... common header length constraints ... See section 3.4.2. > For efficiency ... may report only a subset of the labels ... Oops! Then there is, just because of efficiency reasons, no reliable way to recover all labels, even if I have full access rights? I think, this s a flaw. Section 3.4.7 ------------- > Value: id Cp. section 3.4.5. Section 3.5.2 ------------- Cp. section 3.4.3. Section 4 --------- It should be mentioned that all versioning headers obey the message header format as specified in section 4.2 of [HTTP/1.1]. Otherwise, the field-name, for example, does not need to be a token, but could be regarded as a literal string. But that would mean that there is no implied LWS between the field-name and the ":" (just as, for example, there is no implied LWS in the HTTP-Version production in section 3.1 of [HTTP/1.1]). Section 4.2 of [HTTP/1.1] also explicitly allows LWS between the ":" and the field-value. I would like to propose the following introduction in section 4: "This section defines some header fields additional to those defined in [WebDAV] and [HTTP/1.1]. They follow the format and conventions defined in section 4.2 of [HTTP/1.1]." Section 4.1 ----------- > ... there is no target for the versioned resource (primarily used with > the SET-TARGET method). For the reader's convenience, it would be nice to add a reference like: "... with the SET-TARGET method; see section 6.2)." Section 5 --------- > Note that if a method modifies only a binding to a resource and not > the resource itself (e.g. DELETE, MOVE, BIND, UNBIND), the method is > being applied to the collection containing that binding, so the method > is not affected by versioning unless that collection is under version > control. Ok, but what happens, for example, when you try to DELETE a stable URL? Does that mean that the associated revision is to be deleted? Trying to MOVE a stable URL should fail (e.g. 405 (Method not allowed)), right? The same questions arise when you apply DELETE or MOVE on a versioned resource whose target is a revision. Section 5.2 ----------- > When PROPFIND is applied to a versioned resource... This probably should read: "When PROPFIND is applied to a binding that binds a versioned resource..." > When PROPFIND is applied to a stable URL for a revision, the DAV:urn > for the revision will be returned. This probably should read: "When PROPFIND is applied to a binding that binds a stable URL for a revision, the DAV:urn for the revision will be returned." Section 5.4 ----------- > When a resource supports core versioning, the DAV response header for > an OPTIONS request MUST contain "VERSION". In the DAV response header, WebDAV uses a production called "extend" which is actually undefined. This has been put on the WebDAV issues list. On the w3c-dist-auth mailing list, there was a proposal to define: extend = "<" absoluteURI ">" However, the literal "VERSION" would not satisfy this production. I strongly recommend to achive agreement about the extend production (at least on the w3c-dist-auth mailing list) before using it. Section 5.5 ----------- > 4xx (No Such Target) Just to remind to: Do not forget to finally assign a number for this error. Btw, in section 6, you may want to list this error in the response status code sections, where appropriate. Section 6.1 ----------- > Preconditions: > The request-URL MUST identify a versionable resource. This is a circular dependency, because in section 1.2 "versionable resource" is defined as "resource that can be placed under version control with a VERSION request". To break this circularity, I would like to propose the following wording for the definition of "versionable resource" in section 1.2: "any resource that evolves over time, that can be tracked in a history, and that has not yet been put under version control (or, in other words, has no versioned resource associated)". > Return Status Codes: Why do you put the return status codes between the preconditions and postconditions? I would expect them behind the postconditions, because the postconditions are only relevant for the 200 (Ok) status, and hence the return status codes altogether present a more global view on what may happen and thus should be outside the scope of the pre-/postconditions block. Section 6.2 ----------- > SET-TARGET Although "SET-TARGET" is a valid token as required by the extension-method production in section 5.1.1 of [HTTP], I do not know of any method name that uses a hyphen to divide words (for example, cp. "MKCOL"). Is there a specific reason to break this silent convention? > A SET-TARGET request can be applied to a versioned resource whose > target is a revision to specify that revision to be the target when > the specified label is used in a Target-Selector header. Ugly wording -- hard to understand! What about the following: "A SET-TARGET request can be applied to a versioned resource to specify a revision to be the target. The label of the target must be specified in a Target-Selector header." (Is this what you intended to say?) > Preconditions: Maybe you want to add: "The request must contain a valid Target-Selector header." > <!ELEMENT label (#PCDATA)) Typo: replace "))" with ")>". > 404 (Not Found): The request-URL did not identify a resource. A null resource is a resource, but I suppose 404 should be returned also if the request-URL identifies a null resource. Hence, the wording shoud be slightly modified. It may be considerable to mention that 423 (Locked) might be returned. Section 6.2.2 ------------- > <? xml version="1.0" encoding="utf-8" ?> The white space between the "?" and "xml" is invalid; see rule [23] of [XML1.0]. Section 6.3 ----------- > A CHECKOUT request does not require a lock token, since it does not > modify an existing target. Yes, but even if it did modify an existing target, it would not require a lock token, as long as the target is not locked, right? > 404 (Not Found): The request-URL did not identify a resource. Problem: null resources (cp. section 6.2) > 405 (Method Not Allowed): The request-URL did not identify a versioned > resource whose target is a revision. "whose" is misleading: the target is determined not only from the versioned resource, but also from the target selector. Hence, I would like to suggest the following wording: "The request-URL MUST identify a versioned resource. The target of this resource as determined from the Target-Selector header MUST be a working resource". Section 6.4 ----------- > If the request-URL is write-locked for the specified target selector, > the CHECKIN request MUST include the appropriate lock token. This is (at least for me) misunderstanding. How about the following wording: "The request-URL together with the target selector determine a stable URL for the new revision. If this stable URL is write-locked, the CHECKIN request MUST include the appropriate lock token." > If the request body of the CHECKIN request contains a > DAV:keep-checked-out element, then instead of deleting the working > resource, CHECKIN will modify the DAV:predecessor-set of the working > resource to contain a stable URL for the newly created revision. Does that imply that you can do a series of CHECKIN requests without any intermediate CHECKOUT? > The request-URL MUST identify a versioned resource whose target is a > working resource. Problem: "whose" (cp. section 6.3) > <!ELEMENT checkin-policy (keep-checked-out|overwrite|ANY)* > This is an invalid element type declaration: mixed content can not be mixed with "ANY"; see rule [46] of [XML1.0]. > 201 (Created): The revision was successfully created. Why not use 200 (Ok)? Creating a new revision occurs in conjunction with deleting the working resource (unless keep-checked-out is set); hence, isn't it a transport of data rather than a creation? > 405 (Method Not Allowed): The request-URL does not identify a > versioned resource whose target is a working resource, or the > specified DAV:checkin-policy elements are invalid. ... or DAV:overwrite was applied on a server that does not support mutable revisions. Problem: "whose" (cp. section 6.3) Section 6.5 ----------- > The request-URL MUST identify a versioned resource whose target is a > working resource. Problem: "whose" (cp. section 6.3) > 404 (Not Found): The request-URL did not identify a resource. Problem: null resources (cp. section 6.2) > 405 (Method Not Allowed): The URL did not identify a versioned > resource whose target is a working resource. Problem: "whose" (cp. section 6.3) Section 6.6 ----------- > Unlike a resource property, a report depends on more than the state of > the resource identified by the request-URL. Could you give an example? Section 6.6.1 ------------- > >>RESPONSE > > HTTP/1.1 200 OK > > Host: www.webdav.org Host is a request header only, not a response header. Section 6.6.2 ------------- > Many properties consist of a set of one or more href elements. Probably this should read: "Many of the properties specified in sections 3.2 through 3.5 consist ... ". Or is property-report designed to handle user-defined properties as well? > The elements of a DAV:property-report identify which properties of the > resource are to be reported. "the resource" should be replaced with "the resources" or "each resource". > >>REQUEST > ... The example still contains identifiers from earlier versions of the draft: replace "<D:revisions>" with "<D:revision-set>" (2 times) replace "<D:revisions/>" with "<D:revision-set/>" (2 times) replace "<D:revision>" with "<D:revision-id>" (2 times) replace "<D:revision/>" with "<D:revision-id/>" (2 times) Section 18 ---------- > All other IANA considerations mentioned in [RFC2518] also applicable Typo: replace "applicable" with "apply". ########################################################################## Bye, Juergen