- From: Anselm Baird_Smith <abaird@www43.inria.fr>
- Date: Mon, 23 Dec 1996 13:30:14 +0100 (MET)
- To: Jeffrey Mogul <mogul@pa.dec.com>
- Cc: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
Jeffrey Mogul writes:
> I'll take you up on your offer to help ... if you can figure out
> how to add these to the table, please do so. It would be nice if
> it still fits in a 72-column fixed-width format, because then I
> can stick it into an Internet-Draft without any glitches.
No wonder my implementation of HTTP/1.1 caching proxy is wrong. I had
a real hard time trying figuring out the semantics and interactions
of all the caching rules express in draft 07 (I should have checked
this before).
For my own sanity, I have tried to build up a richer table (it may be a
mistake). The most difficult part in the exercise was to find an
appropriate layout for the tables (I really don't want to miss some
cases). I would rather have taken a top down approach (define the
cases, and see how they are expressed through HTTP/1.1), but for the
time being, I tried the bottom up approach (given cache-control
directives, define the semantics).
If you find any cases missing, or if they are any mistakes, please let
me know so that I can fix my implementation before it's too late.
Thanks for your attention,
Anselm.
----------
My first table defines a "fresh" function, which returns a boolean,
and which takes as parameters:
Ar: The max-age value specified in the request
Sr: The max-stale value specified in the request
Fr: The min-fresh value specified in the request
Ap: The max age value of the reply (expressed either through the
max-age directive, or the expires header)
Ae: The current entity age, computed as defined in section 13.2.3
This table defines the "fresh" function, along with any warnings to be
emitted when needed. Warnings accumulate: if, further on, this
document define some cases where warnings are required, then the
warnings should be aggregated, and all of them should be emitted.
+-----------------------------------------------------------------------+
| Request | Reply | fresh | warnings |
| max | max | min | max-age | | |
| age | stale | fresh |(or)expires | | |
+-----+-------+-------+----------------+-----------------+--------------+
+ * | * | * | Ap | Ae<Ap | 13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ Ar | * | * | Ap | Ae<Ar && Ae<Ap | 13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ * | Sr | NA | Ap | Ae<Ap+Sr |Ae<Ap=>10,13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ * | * | Fr | Ap | Ae+Fr<Ap | 13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ * | * | * | (undefined) | Ae < Ap | 13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ Ar | Sr | NA | Ap |Ae<Ap+Sr && Ae<Ar|Ae<Ap=>10,13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ Ar | NA | Fr | Ap |Ae+Fr<Ap && Ae<Ap| 13? |
+-----+-------+-------+----------------+-----------------+--------------+
+ 0 | NA | NA | Ap | false | 13? |
+-----+-------+-------+----------------+-----------------+--------------+
* : undefined (has no value)
NA: Not applicable
The "loose" function is true when "fresh" is true and a warning is
defined.
Given that definition of the fresh and loose functions, I then tried
to rebuild Jeff's table, inverting the layout, though (to make sure
all cases where available at a glance). This now defines the "valid"
function:
The valid row returns a boolean, indicating wether the cached reply
can be used to answer the given request. It also adds one or more of
the following comments in parenthesis:
NC: not cached (in that situation, the reply should not even be cached)
ii: The class of the warning to be emitted.
The "Cache site" is overloaded: it can be either the type of cache, or
the number of a section in the HTTP/1.1 spec (draft v07), that defines
that configuration.
F: is the result of the "fresh" function as defined above
L: is the result of the "loose" function as defined above
C: means that a check (revalidation or more) must be performed to the
origin server
U: means that the cached reply can be used as is.
+--------+
| Cache |
| site | public | private | must-reval | proxy-reval | hasAuth | valid
+--------+--------+---------+------------+-------------+---------+-----------
| shared | * | * | * | * | * | F?U:C
+--------+--------+---------+------------+-------------+---------+-----------
| 14.9.4 | * | * | * | X | * | F&&!L?U:C
+--------+--------+---------+------------+-------------+---------+-----------
| 14.9.4 | * | * | X | * | * | F&&!L?U:C
+--------+--------+---------+------------+-------------+---------+-----------
| 14.8 | * | * | * | * | X | (NC)
+--------+--------+---------+------------+-------------+---------+-----------
| 14.8/1 | * | * | * | X | X | C
+--------+--------+---------+------------+-------------+---------+-----------
| 14.8/3 | X | * | * | NA | X | F?U:C
+--------+--------+---------+------------+-------------+---------+-----------
| 14.9.1 | NA | X | ? | NA | ? | (NC)
+--------+--------+---------+------------+-------------+---------+-----------
| 14.9.1 | X | * | * | NA | ? | F?U:C
+--------+--------+---------+------------+-------------+---------+-----------
| priv |
+--------+--------+---------+------------+-------------+---------+-----------
| 14.8/2 | * | * | * | X | X | C
+--------+--------+---------+------------+-------------+---------+-----------
| All remaining cases obtained by swapping <public>, <private> and
| <must-reval>, <proxy-reval>, keeping valid constant.
+--------+--------+---------+------------+-------------+---------+-----------
| discon | (12)
<to be specififed>
Some comments on the spec:
- 14.8/1 changes the general semantics of proxy-revalidate, when an
authorization field is present. It also probably assumes that a proxy
is a shared cache, while a "cache" is a single client cache.
- [a question] 14.9.4 says under "End to end reload" that "... No
field names may be included with the no-cache directive in a
request". I assume an "In that case, " is implicitly assumed at the
beginning of the sentence ? [I can see good reasons for using
no-cache with field names in a request, as does]
- In general, understanding HTTP/1.1 caching rules requires tricky
navigation between sections 13 and 14.8 and 14.9; I often feel
uncomfortable because when I read one, I am afraid that the other
changes the semantics (not to mention interactions with
negotiation).
- BTW State management also got "proxy-revalide" wrong (I guess):
--- state management, draft, v05; section 4.2.3 -----
The origin server should send the following additional HTTP/1.1 response
headers, depending on circumstances:
* To allow caching of a document and require that it be validated
before returning it to the client: Cache-control: must-revalidate.
* To allow caching of a document, but to require that proxy caches
(not user agent caches) validate it before returning it to the
client: Cache-control: proxy-revalidate.
---
The first point here, seems to rely on the fact that
must-revalidate/proxy-revalidate is interpreted as "*always*
revalidate the document before returning it"; which was my
interpretation when I implemented Jigsaw proxy.
Received on Monday, 23 December 1996 04:49:26 UTC