- From: Koen Holtman <koen@win.tue.nl>
- Date: Sat, 13 Jan 1996 18:00:45 +0100 (MET)
- To: ddubois@rafiki.spyglass.com (Daniel DuBois)
- Cc: conneg@organic.com, http-caching@pa.dec.com, fielding@avron.ICS.UCI.EDU
[First, a note on distribution.
This thread started out on the content negotiation list
conneg@organic.com, and at some point moved to the caching list
http-caching@pa.dec.com. I believe this move was unintentional.
I have included both conneg@organic.com and http-caching@pa.dec.com in
the cc: of this message, please restrict followups to
conneg@organic.com.
Note for conneg people not on the http-caching list: you can find the
messages you missed in the the http-caching archive:
<URL:http://www.roads.lut.ac.uk/lists/http-caching/>.
]
Daniel DuBois:
[Koen Holtman:]
>> varying = field-name | "external-factor"
>
>I was thinking just "Vary:" with an empty value would indicate that it
>varied but not on any header. A special tag would work too, but obviously
>it would have to be a tag that could never be a header.
I agree. I prefer a special tag, because think that a special tag is
less confusing than an empty Vary header. An empty Vary header could
to easily be interpreted as `does not vary' (varies on nothing).
>>200.3) No URI, a Vary, no Location:
>>
>> - opaque negotiation
>> - response body varies on things in the Vary header,
>> - but no `send-no-body-for' possible
>
>'Send-no-body-for' might still be possible if we adopt a content-id opaque
>validator scheme in addition to the Location scheme.
Yes. Something like Variant-ID: <opaque value> and
Send-no-body-for-variant-ID: 1#<opaque value> seems entirely
reasonable to me.
>So basically I'm advocating a 2^4 combination. Just great...
>>200.8) A URI, a Vary, a Location:
>> - partly opaque, partly transparent negotiation:
>> - URI header varies on the things in the Vary header
>> - Location and response body are a variant given by preemptive
>> negotiation using the variants in the URI header
>> - `send-no-body-for' possible
>>300.7) A URI, a Vary, no Location:
>> - do transparent reactive negotiation using the URI header
>> - URI header varies on the things in the Vary header
>>300.8) A URI, a Vary, a Location:
>> - as 300.7.
>> - If not capable of reactive negotiation, use the URI in the Location
>> header.
>
>I'm a little fuzzy on the behavior in these cases (especailly the 300s), so
>let's make sure if we allow this, what it mean gets explained in great
>detail.
Yes. The basic idea behind 200.8 and 300.[78] is a two-step scheme:
1) opaque negotiation is used to produce an URI header
2) the URI header produced is used in transparent
negotiation, which can be either preemptive or reactive
A custom variant rating algorithm can only be applied in step 1. In
particular,
Location and response body are a variant given by preemptive
negotiation using the variants in the URI header
The Location-URI --> body mapping is _not_ supposed to map to
different bodies for different request header combinations. The only
variance is in step 1), in the selection of the Location-URIs to go
into the URI header.
Note that we need such a two-step scheme if we want to allow use of
both user-agent negotiation and reactive negotiation on the same
negotiable resource.
>It's not clear to me that a proxy can do anything with 200.8 except
>call the server, unless it takes on the responsibility of saving previous
>request headers to compare on the Vary: header.
Yes, It would have to save request headers.
> I suppose that's a proxy
>implementation choice, but I'd like it to be explicit.
A proxy that wants to do elaborate caching for the `a URI, a vary'
cases in which (according my model) the
URI header varies on the things in the Vary header
would have to store, for each response:
- The request headers listed in the Vary header
- The URI header
in such a way that it can look up the URI header when given the
request URI and the varying request headers as a key.
If the response includes a request body, it would also have to store
- the Location (variant-URI) of the response
- the response body
- the response headers that apply to the response body
(Content-type would be saved, URI would not)
in such a way that it can look up the response headers and body when
given the Location (variant-URI) as a key.
When getting a new request on the same URI, the proxy could then
perform a 3-step algorithm:
1) Using the request URI and the varying request headers as a key,
look up the matching URI header U (if no URI header U is cached for
the given combination of varying request headers, relay the request to
the origin server (*))
(*) Send-no-body-for is possible here. The storing of information
that allows the cache to make a good send-no-body-for header is not
covered above.
2) Using the URI header U found, do preemptive negotiation to
determine the best variant-URI V (if preemptive negotiation cannot
determine the best variant, send a `do reactive negotiation' response
to the client with the URI header U)
3) Using the variant-URI V found, look up the variant response headers
and body, and send these to the client (if no headers and body are
cached for the variant-URI V, request the variant from the origin
server).
This scheme is a bit complicated, but remember that proxies are not
required to do all the things above, they can do less and still be
correct, though less as efficient.
>We might also need to explore in more detail whether or not Vary:
>Authentication needs to be sent, and if it actually indicates anything in
>terms of behavior. [Personally, I think I'd like to see "Vary:
>Authentication" safely ignore-able, and WWW-Authenticate'd responses not
>proxy-cached unless there was a Cache-Control: public directive (for
>needlessly Authenticaiton:'ed imagaes and the like).]
I agree here. Basically, responses vary by default on the
Authentication header, so there is no need to ever include this header
name in a list of Vary headers. The same is true for the Host header.
>Dan DuBois, Software Animal http://www.spyglass.com/~ddubois/
Koen.
Received on Saturday, 13 January 1996 18:28:51 UTC