13.3.3 Weak and Strong Validators
Connected: An Internet Encyclopedia
13.3.3 Weak and Strong Validators
Up:
Connected: An Internet Encyclopedia
Up:
Requests For Comments
Up:
RFC 2068
Up:
13 Caching in HTTP
Up:
13.3 Validation Model
Prev: 13.3.2 Entity Tag Cache Validators
Next: 13.3.4 Rules for When to Use Entity Tags and Last-modified Dates
13.3.3 Weak and Strong Validators
13.3.3 Weak and Strong Validators
Since both origin servers and caches will compare two validators to
decide if they represent the same or different entities, one normally
would expect that if the entity (the entity-body or any entity-
headers) changes in any way, then the associated validator would
change as well. If this is true, then we call this validator a
"strong validator."
However, there may be cases when a server prefers to change the
validator only on semantically significant changes, and not when
insignificant aspects of the entity change. A validator that does not
always change when the resource changes is a "weak validator."
Entity tags are normally "strong validators," but the protocol
provides a mechanism to tag an entity tag as "weak." One can think of
a strong validator as one that changes whenever the bits of an entity
changes, while a weak value changes whenever the meaning of an entity
changes. Alternatively, one can think of a strong validator as part
of an identifier for a specific entity, while a weak validator is
part of an identifier for a set of semantically equivalent entities.
Note: One example of a strong validator is an integer that is
incremented in stable storage every time an entity is changed.
An entity's modification time, if represented with one-second
resolution, could be a weak validator, since it is possible that
the resource may be modified twice during a single second.
Support for weak validators is optional; however, weak validators
allow for more efficient caching of equivalent objects; for
example, a hit counter on a site is probably good enough if it is
updated every few days or weeks, and any value during that period
is likely "good enough" to be equivalent.
A "use" of a validator is either when a client generates a request
and includes the validator in a validating header field, or when a
server compares two validators.
Strong validators are usable in any context. Weak validators are only
usable in contexts that do not depend on exact equality of an entity.
For example, either kind is usable for a conditional GET of a full
entity. However, only a strong validator is usable for a sub-range
retrieval, since otherwise the client may end up with an internally
inconsistent entity.
The only function that the HTTP/1.1 protocol defines on validators is
comparison. There are two validator comparison functions, depending
on whether the comparison context allows the use of weak validators
or not:
- The strong comparison function: in order to be considered equal,
both validators must be identical in every way, and neither may be
weak.
- The weak comparison function: in order to be considered equal, both
validators must be identical in every way, but either or both of
them may be tagged as "weak" without affecting the result.
The weak comparison function MAY be used for simple (non-subrange)
GET requests. The strong comparison function MUST be used in all
other cases.
An entity tag is strong unless it is explicitly tagged as weak.
Section 3.11 gives the syntax for entity tags.
A Last-Modified time, when used as a validator in a request, is
implicitly weak unless it is possible to deduce that it is strong,
using the following rules:
- The validator is being compared by an origin server to the actual
current validator for the entity and,
- That origin server reliably knows that the associated entity did
not change twice during the second covered by the presented
validator.
or
- The validator is about to be used by a client in an If-Modified-
Since or If-Unmodified-Since header, because the client has a cache
entry for the associated entity, and
- That cache entry includes a Date value, which gives the time when
the origin server sent the original response, and
- The presented Last-Modified time is at least 60 seconds before the
Date value.
or
- The validator is being compared by an intermediate cache to the
validator stored in its cache entry for the entity, and
- That cache entry includes a Date value, which gives the time when
the origin server sent the original response, and
- The presented Last-Modified time is at least 60 seconds before the
Date value.
This method relies on the fact that if two different responses were
sent by the origin server during the same second, but both had the
same Last-Modified time, then at least one of those responses would
have a Date value equal to its Last-Modified time. The arbitrary 60-
second limit guards against the possibility that the Date and Last-
Modified values are generated from different clocks, or at somewhat
different times during the preparation of the response. An
implementation may use a value larger than 60 seconds, if it is
believed that 60 seconds is too short.
If a client wishes to perform a sub-range retrieval on a value for
which it has only a Last-Modified time and no opaque validator, it
may do this only if the Last-Modified time is strong in the sense
described here.
A cache or origin server receiving a cache-conditional request, other
than a full-body GET request, MUST use the strong comparison function
to evaluate the condition.
These rules allow HTTP/1.1 caches and clients to safely perform sub-
range retrievals on values that have been obtained from HTTP/1.0
servers.
Next: 13.3.4 Rules for When to Use Entity Tags and Last-modified Dates
Connected: An Internet Encyclopedia
13.3.3 Weak and Strong Validators
|