- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Mon, 04 Mar 96 16:01:05 PST
- To: "Roy T. Fielding" <fielding@avron.ICS.UCI.EDU>
- Cc: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
That is not what I mean. First, I don't think that opaque validators are necessary -- they may be useful, but not necessary. Of course they are not "necessary." But then, neither is caching. However, I am willing to give-in to that notion IF the opaque validator is sufficiently useful to cover the cost of sending it. That is, the opaque validator must be generally interoperable with existing systems and carry sufficient semantics for use for things other than cache updates. First of all, the generally understood meaning of the word "opaque" is "has no meaning to clients", and therefore if you want the validator to carry other semantics, you're not talking about an "opaque" validator. Second, while I agree with your emphasis on the cost of sending it (vs. the benefit, of course), I have no idea what your next sentence has to do with "cost". Interoperability is a requirement of all HTTP/1.1 additions; it's not a "cost" issue. In order to provide that additional usefulness, we need three things: 1) A guarantee that the validator will change if the content changes and should not change if the content remains the same; 2) A guarantee that the validator is byte-comparable (i.e., equal validators mean equal content); 3) A guarantee that the validator is world-unique. (1) is obvious. Not necessarily. To be useful as a cache validator (unburdened by any other semantics), it is sufficient that the value changes if the content is semantically different. It is not necessary that the value change on every insignificant change in the content (where "significant" is defined by the application that generates the content). (3) is necessary for it to be used as a cache key. Who said anything about using the validator as a cache key? This is something that might be an interesting design point (using something beside the URL as a cache key) but this is so clearly at variance with current practice that I think you are being highly inconsistent with your insistence (stated elsewhere) that we ought to stick to current practice. Not too surprisingly, this also happens to be the definition of Content-ID in MIME. Therefore, for maximum interoperabilty with existing systems, we should use Content-ID if we are to have an opaque validator. What existing systems? So, if people would like a simple precondition syntax that is useful for all of the currently identified protocol needs, including cache validation, byte ranges, and content negotiation, then I have the following suggestion: 1) Require Content-ID in HTTP/1.1 responses Content-ID = "Content-ID" ":" cid cid = <a content-id as defined in RFC 1521> 2) Implement the following precondition syntax: If-ID = "If-ID" ":" 1#cid wherein the condition evaluates to true if the response to the request would have had a Content-ID equal to one of the ones given in the If-ID header field value. Like the current definition of Unless in draft 01, the response to a "false" evaluation depends on whether or not Range or IMS is also present. That should make a sufficient number of people happy to make the overhead of doing it worthwhile. If not, then the only reasonable solution is to use an IF header field with a generic syntax. I don't think it's possible to solve both the conditional-GET problem and the byte-range problem with a single If-ID header; we would need both If-ID and If-not-ID (or some other syntax). While you try to get around this by using this table: ID is in ID not in Check-ID Check-ID (or IMS true) --------- --------- GET 200 412 GET + IMS 304 200 GET + Range 206 412 GET + IMS + Range 206 200 other methods as normal 412 it's not at all clear that this is easier to implement than simply having two different headers, and probably easier to get the specification right (Koen has pointed out several problems). And this is almost certainly not extensible! As Koen points out, there are circumstances when one needs "action-if-something-matches" and other circumstances when one needs "no-action-if-something-matches", so why not just do the obvious thing and have paired headers? -Jeff
Received on Monday, 4 March 1996 16:18:57 UTC