- From: David Robinson <drtr1@cus.cam.ac.uk>
- Date: Fri, 12 Jan 96 18:18 GMT
- To: http-caching@pa.dec.com
- Cc: drtr1@cus.cam.ac.uk
Firstly, apologies for my terse message.
Here is a fuller description of the Vary header.
David Robinson.
1. Variant URLs and Parameters
Increasing use is being made of `variant' URLs; these are URLs which
provide different documents to the client depending on the exact
circumstances of the request. Principally this is a dependence on the
headers sent by the client, although it could be a dependence on other
parameters of the request, such as those defined at the transport
level. (The client IP address is one example of such a parameter.)
A parameter is defined as that feature of the request which affects
the document returned by the server. Parameters may be encoded in the
HTTP header information supplied by the client, but a parameter does
not necessarily refer to a complete HTTP header.
Note that URLs which vary with time or internal server state are not
considered to be variant URLs, as _all_ URLs are expected to vary
with time or server state. Thus a URL is considered to be variant if
two different access at a particular instant would return different
documents.
2. Caching of variant URLs
[What happens currently with HTTP/1.0? I believe that caches
can not and do not take account of variant URLs.]
It is important that caches do not obstruct the servers use of
variant URLs (as almost certainly happens at present). Thus there is
a need to inform the cache of the variance of a URL.
Also, variant URLs are almost as `cacheable' as non-variant URLs.
Firstly, because the most common use of caching is by browsers on a
per-user basis; repeat requests from the same user with the same
browser are very likely to result in the same variant being sent by
the server. Secondly, because the most common implementation is by
the server selecting one of a small group of documents; the cache
could usefully cache all the possible variants.
Thus the information provided to the cache should also improve the
cacheability of variant URLs, as well as simply enabling their use
through caches.
The simplest approach is for the server to indicate which parameters
affect the document. More complicated would be detailing a complete
prescription for the algorithm the server uses to produce the
document.
3. The Vary header
3.1 Rationale
The Vary header implements the simplest option. It is based on the
observation that equating parameters with HTTP header values is
simple to implement and should provide sufficient information for the
most common uses.
3.2 Syntax
Vary = "Vary" ":" 1#varying
varying = vary-name * ( ";" option)
vary-name = http-name | "{" extension-vary "}"
http-name = token
extension-vary = token
option = attribute "=" value
attribute = token
value = token | quoted-string
http-name is the field-name for an HTTP General-Header,
Request-Header or Entity Header which contains the parameter
affecting the document. extension-vary is an identifier of a
parameter affecting the document which is not contained in an HTTP
header; no extension-vary values are defined here. They are provided
for future enhancement. The "{" and "}" are required to distinguish
extension-vary values from field-names for HTTP extension-headers.
'option' provides more information how the parameter is contained
within the feature identified by vary-name; options are specific to
each vary-name. None are defined here; they are provided for future
enhancement.
3.3 Use
The Vary header describes which parameters of the request affect the
document returned by the server. The identification of a parameter
indicates that different requests with semantically different values
for the parameter may result in differing documents being returned by
the server. The definition of `semantically different' should be
specified with the definition of each parameter. If a cache cannot
determine that two named parameter values are not semantically the
same, then it should not return the response provide for one value of
the parameter to a request with the other value of the parameter. In
the absence of any information about the semantics of the parameter,
the cache should do a direct comparison of the octets comprising the
parameter values.
If the Vary header is not supplied, then the cache is provided with
no information about the variance of the document. For a 200
response it should assume that the document does not have variants,
unless a URI header is supplied.
If the Vary header is supplied by the server, then it should be
complete.
Given sufficient information, the cache may use a more sophisticated
algorithm for equality testing than simple octet comparison. For
example, for parameters which are whole HTTP headers, the
'implied *LWS' rule means that spaces between tokens can be ignored.
3.4 HTTP considerations
Error responses
Vary headers may be used for unsuccessful responses, where the
default caching assumption of HTTP/1.0 may be to assume variance.
Host header
The document is assumed to always vary with the Host header, and
so this need not be included in the Vary header.
URI header
If a URI header and a Vary header are both supplied, then the
Vary header must include any variant parameters identified by the
URI header. However, the cache may use the information in the URI
header to refine its equality testing of parameters.
Appendices
These appendices are provided for informational reasons only.
A. Sample use of 'option'
The option to a vary-name further identifies the parameter which
affects the document returned by the server. For example, if the
document varies with the Accept-Charset, but only depending on
whether "iso-8859-1" and "unicode-1-1" are or are not contained in
the header then
Vary: Accept-Charset ; exist="iso-8859-1" ; exist="unicode-1-1"
could be returned to indicted that the document does not depend on
the presence or absence of any other character set name in the
Accept-Charset header.
If this option is needed, then it may reflect a poorly designed
HTTP header.
B. Sample use of `extension-vary'
The `extension-vary' syntax could be defined to identify other
parameters; for example
Vary: {bandwidth}
would indicate that the document returned by the server depends on
the bandwidth to the client.
Received on Friday, 12 January 1996 18:41:36 UTC