- From: Koen Holtman <koen@win.tue.nl>
- Date: Sun, 7 Jan 1996 12:37:31 +0100 (MET)
- To: ddubois@rafiki.spyglass.com (Daniel DuBois)
- Cc: conneg@organic.com, http-caching@pa.dec.com
Daniel DuBois: > >The following verbiage is my idea of what the content negotiation scheme now >looks like, based on 1) my opinions, 2) my opinions of the HTTP 1.1 draft, >3) my opinions of Koen's posts, 4) my opinions of the recent content >negotiation meeting. > >The short version: We want to add a Vary: header. > >The long version: (Anyone who reads this deserves a virtual cookie. God >this is long.) > [...] >5) Other proposals: >Koen Holtman introduced a "Send-No-Body-For:" header for the purpose of >negotiation on URI headers, but he was under the influence of User-Agent >negotiation which I contend can't be easily done under the >transparent-proxy-has-all-data-and- algorithms-URI scheme. I proposed "Send-No-Body-For:" for the `vary' negotiation case. User-agent negotiation (_not_ html feature negotiation) is a subset of `vary' negotiation. > It should be >done under the Vary: scheme. As he intended it to work under some URI >scheme, The thing is that I do _not_ assume, as you do, that an URI header would contain all necessary data for a proxy to replicate the negotiation. I believe that in Roy's 1.1 draft design, the `user-agent' keyword, if present in an URI header, tells the proxy `no, you cannot replicate negotiation for this negotiation port'. >he sought "Send-No-Body-For: URL". Under my thoughts on transparent >negotiation, one would never make a request with "Send-No-Body-For: URL". >It would be redundant, if the proxy had that variant, it would be serving >it. Under transparent negotiation, the proxy knows that variant is >servable, it doesn't need approval from the origin server. Yes. But in my mind, URI header != transparent negotiation. The bottom line is that we seem to agree on mechanisms, we are just using terminology in a different way. [...easy, hard, impossible replication of negotiation...] > It mimics what Koen was trying to do with >Send-No-Body-For. I see Vary: as the method for the 'impossible' case, and >URI: as the method for the 'hard' case. I see things that way too. With the note that in my `known range negotiation', I am building the `vary' header into the `URI' header using the `qvary' field (though I have not put in something to express that the server has 200 variants (yet)). Let me quote the relevant part from the `known range negotiation' draft: ||After having computed the variant set, the URI header representing it ||may look like this. [I am using a verbose syntax for clarity, we can ||shorten keywords later.] || || URI: { variant "http://blah.com/some/report.html.1" || 0.7 || { type "text/html" } } || { variant "http://blah.com/some/report.html.2" || 0.8 { qvary 0-0.8 fixed-for-agents } || { type "text/html" } } || { variant "http://blah.com/some/report.html.3" || 0 { qvary 0-0.9 fixed-for-agents } || { type "text/html" } } || { variant "http://blah.com/some/report.dvi" || 1 || { type "application/x-dvi" } } || ||This URI header follows the syntax of the HTTP 1.1 URI header, except ||that the `qvary' field is new. || ||The intended interpretation of this URI header (this variant set) is ||as follows: || || - there are 4 different variants in the variant set for this || particular request, with quality factors 0.7, 0,8, 0, and 1 and || MIME types ..... . || Here is the vary-like part: || - the computed (source) quality factors of the second and third || variants can change (vary) from request to request. The variation || of the quality factors is in the ranges 0-0.8, and 0-0.9. || A user agent (or proxy cache) receiving the URI header does not || know the algorithm used for the computation of the factors, but || the `fixed-for-agents' identifier does indicate that the result of || the computation does not vary as long as the same user agent is || used. Note that my qvary mechanism does _not_ tell proxies for exactly which request headers the response varies. I don't think this information is particularly relevant. Also, in my scheme, the response could vary on the phase of the moon, not on something in a request header. The most important thing to send in vary negotiation would be the bit saying `don't try this yourself, contact the origin server'. On top of that, information like `I will not give a different answer for the same user agent/client IP address/whatever' would be nice. >--- >OK, everything from here is flakey and needs to be worked out: >--- > >7) Problem >Larry doesn't think a "Send-No-Body-For" construct should have URLs as >parameters; it should have some other unique content-id value. This concern >stems from the idea that not all variants are nameable. Separately, I have >come to the conclusion that if all variants are nameable, and the algorithm >is exposed properly, "Send-No-Body-For: URL" is unnecessary. (See #5). But if all variants are nameable, and the algorithm is _not_ exposed, the "Send-No-Body-For: URL" is necessary (if there is no other known-to-be-reliable variant identifier scheme). >8) Solution - Maybe? >The Cache-Validator: header as I understand it could be sent on subsequent >requests for an opaquely negotiated resource. Now instead of asking "Is my >copy of the resource still good?" it is effectively asking "Is my copy of >the variant of the resource still good AND the variant you would give me?" Such a scheme could work, with some care. A requirement would be that no two variants could ever have the same cache validator. [...] > c1) Do we need to give the server a way of saying "clear all your variants"? No. > c2) Do we need to give the serve a way of saying "clear these particular > variants"? (Presumably they'll clear eventually anyway as the proxy runs > out of space and/or pushes them out of their working set.) They will be cleared if they expire, or sooner. > d) Do cache-control messages (or ANY headers on the response for that >matter) on > the opaquely negotiated response apply to all variants, just the > server-chosen variant, or just the base resource 'negotiation port'? This is one of the issues we need to resolve, I mentioned it already in my notes on content negotiation. Currently, my opinion on this is that the URI header (and possibly a future vary: header) applies to the negotiation port, and that everything else applies to the variant. This is the only way we can avoid speccing the semantics of many response headers twice: once for negotiated, and once for un-negotiated responses. > e) What about renegade proxies who serve variants willy-nilly without >contacting > the server? etc... We can't spec for renegade proxies. Leave it to market forces, or something. > f) Are we getting too complicated to hope for consistant implementations? Good question. I for one would greatly prefer having a scheme in which each variant has an URI as its name, not some opaque thing. The reason is that I want to avoid caches having to store variants under keys like (port-URI, opaque thing) instead of just (variant-URI), that I want to avoid speccing and implementing a GET variant-called-X-of-negotiation-port-Y access mechanism for reactive negotiation, etc. Also, if we use cache validators as variant IDs, it will be much harder to make a mechanism for reliably replacing old variant copies in a cache with new variant copies. Eek, the more I think about it, the nastier use of cache validators for variant IDs gets. Maybe a `variant ID = opaque string, not necessarily an URI, but quaranteed to stay the same even if the variant content changes' scheme would be best. >Dan DuBois, Software Animal http://www.spyglass.com/~ddubois/ Koen.
Received on Sunday, 7 January 1996 11:47:23 UTC