- From: Jason Crawford <nn683849@smallcue.com>
- Date: Sun, 13 Oct 2002 01:05:37 -0400
- To: "Clemm, Geoff" <gclemm@rational.com>
- Cc: "'Webdav WG'" <w3c-dist-auth@w3c.org>
Geoff suggested I start a new thread... I'm going to propose that ALL of the IF: header be evaluated by the server the server. I've actually said much of this in a recent posting on a different topic, and I doubt it got read because it was buried. I also probably say it a bit better here this time anyway... RFC2518 seems to spend a lot of time talking about If: header and all it's details but not about how it's used to submit lock tokens. It's use for lock token submission seems to simply be an afterthought. It even says the following when it begins to talk about the If; header. The If header is intended to have similar functionality to the If- Match header defined in section 14.24 of [RFC2616]. However the If header is intended for use with any URI which represents state information, referred to as a state token, about a resource as well as ETags. A typical example of a state token is a lock token, and lock tokens are the only state tokens defined in this specification. And I've taken this opening statement, and the fact that it never talks about lock token submission in the "IF Header" section, to mean that the primary purpose of the If: header was for a client to verify various aspects of server state (like If-Match) before doing an operation. Above I outlined what I thought the *primary* purpose of the If: header was in 2518. But there are stray comments in the 2518 that make the If; header's purpose confused. We've fixed one of those in 2518bis. But 2518bis still has the statement that the server will only check the assertions on the URL's it chooses: When the If header is applied to a particular resource, the Tagged- list productions MUST be searched to determine if any of the listed resources match the operand resource(s) for the current method. If none of the resource productions match the current resource then the header MUST be ignored. If one of the resource productions does match the name of the resource under consideration then the list productions following the resource production MUST be applied to the resource in the manner specified in the previous section. With that statement, the semantics and purpose of the If: header gets confusing. It's like the server saying, "you can ask me to check somethings, and I'll only check the one's I want, and I won't tell you which one's I didn't check" It (2518) just doesn't make sense. I undermines what was presented as the primary purpose of that header: For the client to be able to request that the request be contingent on assertions that he submits. A trivial, but non fatal, example of the problem the partial evaluation creates for the client. Let's say a client has locked a subtree of the URL space and is working with various resources in it. He/She/It GET's and PUT's a lot of resources. Perhaps it's making sure all the pages fit some corporate guidelines and tries to correct mistakes. To be careful, it uses the IF: header to make sure the resources are still locked as it progresses. But unfortunately the server will only evaluate that request if thinks it needs to. And for example, it might not evaluate it for GET requests. If the resource is a large resource, a lot of time and bandwidth could be wasted getting the resource if the operation is later aborted/restarted when the client later finds out that the lock has gone away. If the server had respected the check in the first place, the client could have corrected the situation more quickly. Again, it's not a fatal example, but I think it points out the problem this can pose for the client. Another more significant example might be a COPY command where one wants to make sure the copy of the file one copies is the one that matches an ETAG or is still locked. But the server might not even make that check before doing the operation. I'd like to propose that we change the spec to say ALL of the tagged assertions that the client submits in the IF: header be evaluated by the server. This proposal is not contingent on any of the current IF: header related proposals. All proposals should be able to benefit from this change. Interoperability... if there are clients out there that submit assertions on secondary resource that are actually false but never evaluated by current servers, then those clients will break, but that seems highly unlikely. Similarly, because it's unlikely that clients are currently submitting assertions on secondary resources that actually would evaluate to false but passing through, servers can feel safe going ahead and evaluating the whole If: header. The only compatibility issue is transitional. New clients can submit extra assertions, but they don't know if the server is evaluating all of them because the server might be following 2518 rather than a new spec. This means that for a while, clients can only take advantage of this for helpful checks, not critical checks. Thoughts? J. ------------------------------------------ Phone: 914-784-7569
Received on Sunday, 13 October 2002 01:06:34 UTC