- From: Roy T. Fielding <fielding@avron.ICS.UCI.EDU>
- Date: Tue, 13 Dec 1994 21:25:08 -0800
- To: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
Dan pointed out a general problem with the current content-negotiation scheme within the presence of a caching proxy. Paraphrasing, the problem is that a proxy cannot mirror the behavior of the origin server without knowing the same content availability information as the origin server. In other words, the caching proxy needs to know what variants are available in order to determine what the origin server's response would be, and thus whether that response has already been cached. Although it is possible to track cached responses via accept headers and user-agents (as Dan and Jeff mentioned), that solution will not scale because there is a much higher variability in Accept* and User-Agent request headers than there is in URIs with negotiable content. Since, in reality, only a small portion of URI space is capable of generating variants, I think a more general solution would be to have the server explicitly declare what variants are available (if any) as part of the response metainformation. The proxy could then use that information as the guide for determining the correct response. In fact, separating the metainformation from the message entity will be necessary in any case in order to cache multiple entities per URI. People who follow the URC discussions will probably notice that, in sending the information on variants, the server is essentially saying what subset of the URC for that resource is available from that server. In fact, I am sure that some would argue that, when variants are present for a specific URI, the server should just respond with a URC and allow client redirection to find the specific non-variant URL desired. So, the way I see it, we have several choices: 1) Keep the current model and just say it doesn't work with proxies 2) Patch the current model by adding a "Variants:" header like Variants: text/html;qs=1;bs=9653;ua="Mozzilla", text/html;qs=0.9;bs=8753, text/plain;qs=0.2;bs=7989, text/plain;qs=0.3;bs=8989;lang="en/gb", application/postscript;qs=0.7;bs=90267 which would ONLY be sent when the given URI allows variants; 3) Implement a standard scheme for client-based redirection upon receipt of variant metainformation (i.e. a URC). If the answer is (1), then I think all mention of content-negotiation and the Accept* headers should be removed from HTTP/1.0. (2) is easy to implement (because only proxies and servers sending variants would need to change), but it does not seem to be a good long-term solution. (3) is, surprisingly enough, relatively easy to implement -- all that would be needed is a new 3xx response code and at least one format for enclosing URCs in the message body. There are two that I can think of: Content-type: text/iafa-template Content-type: text/prdm The latter is for the Partial Redundant Distributed Metalanguage described at <http://www-pcd.stanford.edu/FRESCO/annotations.html>, though it is used in their implementation for a different purpose. This is a much better long-term solution (because it also enables URNs), but I think I'd have a hard time calling it HTTP/1.0. What do you think? ......Roy Fielding ICS Grad Student, University of California, Irvine USA <fielding@ics.uci.edu> <URL:http://www.ics.uci.edu/dir/grad/Software/fielding>
Received on Tuesday, 13 December 1994 21:31:31 UTC