forked from friendica/friendica-addons
1513 lines
54 KiB
Plaintext
1513 lines
54 KiB
Plaintext
|
|
|||
|
|
|||
|
|
|||
|
HTTPbis Working Group R. Fielding, Ed.
|
|||
|
Internet-Draft Day Software
|
|||
|
Obsoletes: 2616 (if approved) J. Gettys
|
|||
|
Intended status: Standards Track Alcatel-Lucent
|
|||
|
Expires: February 5, 2011 J. Mogul
|
|||
|
HP
|
|||
|
H. Frystyk
|
|||
|
Microsoft
|
|||
|
L. Masinter
|
|||
|
Adobe Systems
|
|||
|
P. Leach
|
|||
|
Microsoft
|
|||
|
T. Berners-Lee
|
|||
|
W3C/MIT
|
|||
|
Y. Lafon, Ed.
|
|||
|
W3C
|
|||
|
J. Reschke, Ed.
|
|||
|
greenbytes
|
|||
|
August 4, 2010
|
|||
|
|
|||
|
|
|||
|
HTTP/1.1, part 4: Conditional Requests
|
|||
|
draft-ietf-httpbis-p4-conditional-11
|
|||
|
|
|||
|
Abstract
|
|||
|
|
|||
|
The Hypertext Transfer Protocol (HTTP) is an application-level
|
|||
|
protocol for distributed, collaborative, hypermedia information
|
|||
|
systems. HTTP has been in use by the World Wide Web global
|
|||
|
information initiative since 1990. This document is Part 4 of the
|
|||
|
seven-part specification that defines the protocol referred to as
|
|||
|
"HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 4 defines
|
|||
|
request header fields for indicating conditional requests and the
|
|||
|
rules for constructing responses to those requests.
|
|||
|
|
|||
|
Editorial Note (To be removed by RFC Editor)
|
|||
|
|
|||
|
Discussion of this draft should take place on the HTTPBIS working
|
|||
|
group mailing list (ietf-http-wg@w3.org). The current issues list is
|
|||
|
at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
|
|||
|
documents (including fancy diffs) can be found at
|
|||
|
<http://tools.ietf.org/wg/httpbis/>.
|
|||
|
|
|||
|
The changes in this draft are summarized in Appendix C.12.
|
|||
|
|
|||
|
Status of This Memo
|
|||
|
|
|||
|
This Internet-Draft is submitted in full conformance with the
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 1]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
provisions of BCP 78 and BCP 79.
|
|||
|
|
|||
|
Internet-Drafts are working documents of the Internet Engineering
|
|||
|
Task Force (IETF). Note that other groups may also distribute
|
|||
|
working documents as Internet-Drafts. The list of current Internet-
|
|||
|
Drafts is at http://datatracker.ietf.org/drafts/current/.
|
|||
|
|
|||
|
Internet-Drafts are draft documents valid for a maximum of six months
|
|||
|
and may be updated, replaced, or obsoleted by other documents at any
|
|||
|
time. It is inappropriate to use Internet-Drafts as reference
|
|||
|
material or to cite them other than as "work in progress."
|
|||
|
|
|||
|
This Internet-Draft will expire on February 5, 2011.
|
|||
|
|
|||
|
Copyright Notice
|
|||
|
|
|||
|
Copyright (c) 2010 IETF Trust and the persons identified as the
|
|||
|
document authors. All rights reserved.
|
|||
|
|
|||
|
This document is subject to BCP 78 and the IETF Trust's Legal
|
|||
|
Provisions Relating to IETF Documents
|
|||
|
(http://trustee.ietf.org/license-info) in effect on the date of
|
|||
|
publication of this document. Please review these documents
|
|||
|
carefully, as they describe your rights and restrictions with respect
|
|||
|
to this document. Code Components extracted from this document must
|
|||
|
include Simplified BSD License text as described in Section 4.e of
|
|||
|
the Trust Legal Provisions and are provided without warranty as
|
|||
|
described in the Simplified BSD License.
|
|||
|
|
|||
|
This document may contain material from IETF Documents or IETF
|
|||
|
Contributions published or made publicly available before November
|
|||
|
10, 2008. The person(s) controlling the copyright in some of this
|
|||
|
material may not have granted the IETF Trust the right to allow
|
|||
|
modifications of such material outside the IETF Standards Process.
|
|||
|
Without obtaining an adequate license from the person(s) controlling
|
|||
|
the copyright in such materials, this document may not be modified
|
|||
|
outside the IETF Standards Process, and derivative works of it may
|
|||
|
not be created outside the IETF Standards Process, except to format
|
|||
|
it for publication as an RFC or to translate it into languages other
|
|||
|
than English.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 2]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
|
|||
|
1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 4
|
|||
|
1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 4
|
|||
|
1.2.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 5
|
|||
|
1.2.2. ABNF Rules defined in other Parts of the
|
|||
|
Specification . . . . . . . . . . . . . . . . . . . . 5
|
|||
|
2. Entity-Tags . . . . . . . . . . . . . . . . . . . . . . . . . 5
|
|||
|
2.1. Example: Entity-tags varying on Content-Negotiated
|
|||
|
Resources . . . . . . . . . . . . . . . . . . . . . . . . 6
|
|||
|
3. Status Code Definitions . . . . . . . . . . . . . . . . . . . 7
|
|||
|
3.1. 304 Not Modified . . . . . . . . . . . . . . . . . . . . . 7
|
|||
|
3.2. 412 Precondition Failed . . . . . . . . . . . . . . . . . 7
|
|||
|
4. Weak and Strong Validators . . . . . . . . . . . . . . . . . . 8
|
|||
|
5. Rules for When to Use Entity-tags and Last-Modified Dates . . 10
|
|||
|
6. Header Field Definitions . . . . . . . . . . . . . . . . . . . 12
|
|||
|
6.1. ETag . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
|
|||
|
6.2. If-Match . . . . . . . . . . . . . . . . . . . . . . . . . 13
|
|||
|
6.3. If-Modified-Since . . . . . . . . . . . . . . . . . . . . 14
|
|||
|
6.4. If-None-Match . . . . . . . . . . . . . . . . . . . . . . 16
|
|||
|
6.5. If-Unmodified-Since . . . . . . . . . . . . . . . . . . . 17
|
|||
|
6.6. Last-Modified . . . . . . . . . . . . . . . . . . . . . . 18
|
|||
|
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18
|
|||
|
7.1. Status Code Registration . . . . . . . . . . . . . . . . . 19
|
|||
|
7.2. Header Field Registration . . . . . . . . . . . . . . . . 19
|
|||
|
8. Security Considerations . . . . . . . . . . . . . . . . . . . 19
|
|||
|
9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 19
|
|||
|
10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 19
|
|||
|
10.1. Normative References . . . . . . . . . . . . . . . . . . . 19
|
|||
|
10.2. Informative References . . . . . . . . . . . . . . . . . . 20
|
|||
|
Appendix A. Changes from RFC 2616 . . . . . . . . . . . . . . . . 20
|
|||
|
Appendix B. Collected ABNF . . . . . . . . . . . . . . . . . . . 21
|
|||
|
Appendix C. Change Log (to be removed by RFC Editor before
|
|||
|
publication) . . . . . . . . . . . . . . . . . . . . 21
|
|||
|
C.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 21
|
|||
|
C.2. Since draft-ietf-httpbis-p4-conditional-00 . . . . . . . . 22
|
|||
|
C.3. Since draft-ietf-httpbis-p4-conditional-01 . . . . . . . . 22
|
|||
|
C.4. Since draft-ietf-httpbis-p4-conditional-02 . . . . . . . . 22
|
|||
|
C.5. Since draft-ietf-httpbis-p4-conditional-03 . . . . . . . . 22
|
|||
|
C.6. Since draft-ietf-httpbis-p4-conditional-04 . . . . . . . . 23
|
|||
|
C.7. Since draft-ietf-httpbis-p4-conditional-05 . . . . . . . . 23
|
|||
|
C.8. Since draft-ietf-httpbis-p4-conditional-06 . . . . . . . . 23
|
|||
|
C.9. Since draft-ietf-httpbis-p4-conditional-07 . . . . . . . . 23
|
|||
|
C.10. Since draft-ietf-httpbis-p4-conditional-08 . . . . . . . . 23
|
|||
|
C.11. Since draft-ietf-httpbis-p4-conditional-09 . . . . . . . . 23
|
|||
|
C.12. Since draft-ietf-httpbis-p4-conditional-10 . . . . . . . . 24
|
|||
|
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 3]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
1. Introduction
|
|||
|
|
|||
|
This document defines HTTP/1.1 response metadata for indicating
|
|||
|
potential changes to payload content, including modification time
|
|||
|
stamps and opaque entity-tags, and the HTTP conditional request
|
|||
|
mechanisms that allow preconditions to be placed on a request method.
|
|||
|
Conditional GET requests allow for efficient cache updates. Other
|
|||
|
conditional request methods are used to protect against overwriting
|
|||
|
or misunderstanding the state of a resource that has been changed
|
|||
|
unbeknownst to the requesting client.
|
|||
|
|
|||
|
This document is currently disorganized in order to minimize the
|
|||
|
changes between drafts and enable reviewers to see the smaller errata
|
|||
|
changes. The next draft will reorganize the sections to better
|
|||
|
reflect the content. In particular, the sections on resource
|
|||
|
metadata will be discussed first and then followed by each
|
|||
|
conditional request-header, concluding with a definition of
|
|||
|
precedence and the expectation of ordering strong validator checks
|
|||
|
before weak validator checks. It is likely that more content from
|
|||
|
[Part6] will migrate to this part, where appropriate. The current
|
|||
|
mess reflects how widely dispersed these topics and associated
|
|||
|
requirements had become in [RFC2616].
|
|||
|
|
|||
|
1.1. Requirements
|
|||
|
|
|||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
|||
|
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
|||
|
document are to be interpreted as described in [RFC2119].
|
|||
|
|
|||
|
An implementation is not compliant if it fails to satisfy one or more
|
|||
|
of the "MUST" or "REQUIRED" level requirements for the protocols it
|
|||
|
implements. An implementation that satisfies all the "MUST" or
|
|||
|
"REQUIRED" level and all the "SHOULD" level requirements for its
|
|||
|
protocols is said to be "unconditionally compliant"; one that
|
|||
|
satisfies all the "MUST" level requirements but not all the "SHOULD"
|
|||
|
level requirements for its protocols is said to be "conditionally
|
|||
|
compliant".
|
|||
|
|
|||
|
1.2. Syntax Notation
|
|||
|
|
|||
|
This specification uses the ABNF syntax defined in Section 1.2 of
|
|||
|
[Part1] (which extends the syntax defined in [RFC5234] with a list
|
|||
|
rule). Appendix B shows the collected ABNF, with the list rule
|
|||
|
expanded.
|
|||
|
|
|||
|
The following core rules are included by reference, as defined in
|
|||
|
[RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
|
|||
|
(CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 4]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
|
|||
|
sequence of data), SP (space), VCHAR (any visible USASCII character),
|
|||
|
and WSP (whitespace).
|
|||
|
|
|||
|
1.2.1. Core Rules
|
|||
|
|
|||
|
The core rules below are defined in Section 1.2.2 of [Part1]:
|
|||
|
|
|||
|
quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
|
|||
|
OWS = <OWS, defined in [Part1], Section 1.2.2>
|
|||
|
|
|||
|
1.2.2. ABNF Rules defined in other Parts of the Specification
|
|||
|
|
|||
|
The ABNF rules below are defined in other parts:
|
|||
|
|
|||
|
HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
|
|||
|
|
|||
|
2. Entity-Tags
|
|||
|
|
|||
|
Entity-tags are used for comparing two or more representations of the
|
|||
|
same resource. HTTP/1.1 uses entity-tags in the ETag (Section 6.1),
|
|||
|
If-Match (Section 6.2), If-None-Match (Section 6.4), and If-Range
|
|||
|
(Section 5.3 of [Part5]) header fields. The definition of how they
|
|||
|
are used and compared as cache validators is in Section 4. An
|
|||
|
entity-tag consists of an opaque quoted string, possibly prefixed by
|
|||
|
a weakness indicator.
|
|||
|
|
|||
|
entity-tag = [ weak ] opaque-tag
|
|||
|
weak = %x57.2F ; "W/", case-sensitive
|
|||
|
opaque-tag = quoted-string
|
|||
|
|
|||
|
A "strong entity-tag" MAY be shared by two representations of a
|
|||
|
resource only if they are equivalent by octet equality.
|
|||
|
|
|||
|
A "weak entity-tag", indicated by the "W/" prefix, MAY be shared by
|
|||
|
two representations of a resource only if the representations are
|
|||
|
equivalent and could be substituted for each other with no
|
|||
|
significant change in semantics. A weak entity-tag can only be used
|
|||
|
for weak comparison.
|
|||
|
|
|||
|
An entity-tag MUST be unique across all versions of all
|
|||
|
representations associated with a particular resource. A given
|
|||
|
entity-tag value MAY be used for representations obtained by requests
|
|||
|
on different URIs. The use of the same entity-tag value in
|
|||
|
conjunction with representations obtained by requests on different
|
|||
|
URIs does not imply the equivalence of those representations.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 5]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
2.1. Example: Entity-tags varying on Content-Negotiated Resources
|
|||
|
|
|||
|
Consider a resource that is subject to content negotiation (Section 5
|
|||
|
of [Part3]), and where the representations returned upon a GET
|
|||
|
request vary based on the Accept-Encoding request header field
|
|||
|
(Section 6.3 of [Part3]):
|
|||
|
|
|||
|
>> Request:
|
|||
|
|
|||
|
GET /index HTTP/1.1
|
|||
|
Host: www.example.com
|
|||
|
Accept-Encoding: gzip
|
|||
|
|
|||
|
|
|||
|
In this case, the response might or might not use the gzip content
|
|||
|
coding. If it does not, the response might look like:
|
|||
|
|
|||
|
>> Response:
|
|||
|
|
|||
|
HTTP/1.1 200 OK
|
|||
|
Date: Thu, 26 Mar 2010 00:05:00 GMT
|
|||
|
ETag: "123-a"
|
|||
|
Content-Length: 70
|
|||
|
Vary: Accept-Encoding
|
|||
|
Content-Type: text/plain
|
|||
|
|
|||
|
Hello World!
|
|||
|
Hello World!
|
|||
|
Hello World!
|
|||
|
Hello World!
|
|||
|
Hello World!
|
|||
|
|
|||
|
An alternative representation that does use gzip content coding would
|
|||
|
be:
|
|||
|
|
|||
|
>> Response:
|
|||
|
|
|||
|
HTTP/1.1 200 OK
|
|||
|
Date: Thu, 26 Mar 2010 00:05:00 GMT
|
|||
|
ETag: "123-b"
|
|||
|
Content-Length: 43
|
|||
|
Vary: Accept-Encoding
|
|||
|
Content-Type: text/plain
|
|||
|
Content-Encoding: gzip
|
|||
|
|
|||
|
...binary data...
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 6]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
Note: Content codings are a property of the representation, so
|
|||
|
therefore an entity-tag of an encoded representation must be
|
|||
|
distinct from an unencoded representation to prevent conflicts
|
|||
|
during cache updates and range requests. In contrast, transfer
|
|||
|
codings (Section 6.2 of [Part1]) apply only during message
|
|||
|
transfer and do not require distinct entity-tags.
|
|||
|
|
|||
|
3. Status Code Definitions
|
|||
|
|
|||
|
3.1. 304 Not Modified
|
|||
|
|
|||
|
If the client has performed a conditional GET request and access is
|
|||
|
allowed, but the document has not been modified, the server SHOULD
|
|||
|
respond with this status code. The 304 response MUST NOT contain a
|
|||
|
message-body, and thus is always terminated by the first empty line
|
|||
|
after the header fields.
|
|||
|
|
|||
|
A 304 response MUST include a Date header field (Section 9.3 of
|
|||
|
[Part1]) unless its omission is required by Section 9.3.1 of [Part1].
|
|||
|
If a 200 response to the same request would have included any of the
|
|||
|
header fields Cache-Control, Content-Location, ETag, Expires, Last-
|
|||
|
Modified, or Vary, then those same header fields MUST be sent in a
|
|||
|
304 response.
|
|||
|
|
|||
|
Since the goal of a 304 response is to minimize information transfer
|
|||
|
when the recipient already has one or more cached representations,
|
|||
|
the response SHOULD NOT include representation metadata other than
|
|||
|
the above listed fields unless said metadata exists for the purpose
|
|||
|
of guiding cache updates (e.g., future HTTP extensions).
|
|||
|
|
|||
|
If a 304 response includes an entity-tag that indicates a
|
|||
|
representation not currently cached, then the recipient MUST NOT use
|
|||
|
the 304 to update its own cache. If that conditional request
|
|||
|
originated with an outbound client, such as a user agent with its own
|
|||
|
cache sending a conditional GET to a shared proxy, then the 304
|
|||
|
response MAY be forwarded to the outbound client. Otherwise,
|
|||
|
disregard the response and repeat the request without the
|
|||
|
conditional.
|
|||
|
|
|||
|
If a cache uses a received 304 response to update a cache entry, the
|
|||
|
cache MUST update the entry to reflect any new field values given in
|
|||
|
the response.
|
|||
|
|
|||
|
3.2. 412 Precondition Failed
|
|||
|
|
|||
|
The precondition given in one or more of the request-header fields
|
|||
|
evaluated to false when it was tested on the server. This response
|
|||
|
code allows the client to place preconditions on the current resource
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 7]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
metadata (header field data) and thus prevent the requested method
|
|||
|
from being applied to a resource other than the one intended.
|
|||
|
|
|||
|
4. Weak and Strong Validators
|
|||
|
|
|||
|
Since both origin servers and caches will compare two validators to
|
|||
|
decide if they represent the same or different representations, one
|
|||
|
normally would expect that if the representation (including both
|
|||
|
representation header fields and representation body) 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 might be cases when a server prefers to change the
|
|||
|
validator only on semantically significant changes, and not when
|
|||
|
insignificant aspects of the representation change. A validator that
|
|||
|
does not always change when the representation changes is a "weak
|
|||
|
validator".
|
|||
|
|
|||
|
An entity-tag is normally a strong validator, 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 sequence of
|
|||
|
bits in a representation changes, while a weak value changes whenever
|
|||
|
the meaning of a representation changes. Alternatively, one can
|
|||
|
think of a strong validator as part of an identifier for a specific
|
|||
|
representation, whereas a weak validator is part of an identifier for
|
|||
|
a set of semantically equivalent representations.
|
|||
|
|
|||
|
Note: One example of a strong validator is an integer that is
|
|||
|
incremented in stable storage every time a representation is
|
|||
|
changed.
|
|||
|
|
|||
|
A representation's modification time, if defined with only one-
|
|||
|
second resolution, could be a weak validator, since it is possible
|
|||
|
that the representation might 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 a
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 8]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
representation. For example, either kind is usable for a normal
|
|||
|
conditional GET. However, only a strong validator is usable for a
|
|||
|
sub-range retrieval, since otherwise the client might end up with an
|
|||
|
internally inconsistent representation.
|
|||
|
|
|||
|
Clients MUST NOT use weak validators in range requests ([Part5]).
|
|||
|
|
|||
|
The only function that HTTP/1.1 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:
|
|||
|
|
|||
|
o The strong comparison function: in order to be considered equal,
|
|||
|
both opaque-tags MUST be identical character-by-character, and
|
|||
|
both MUST NOT be weak.
|
|||
|
|
|||
|
o The weak comparison function: in order to be considered equal,
|
|||
|
both opaque-tags MUST be identical character-by-character, but
|
|||
|
either or both of them MAY be tagged as "weak" without affecting
|
|||
|
the result.
|
|||
|
|
|||
|
The example below shows the results for a set of entity-tag pairs,
|
|||
|
and both the weak and strong comparison function results:
|
|||
|
|
|||
|
+--------+--------+-------------------+-----------------+
|
|||
|
| ETag 1 | ETag 2 | Strong Comparison | Weak Comparison |
|
|||
|
+--------+--------+-------------------+-----------------+
|
|||
|
| W/"1" | W/"1" | no match | match |
|
|||
|
| W/"1" | W/"2" | no match | no match |
|
|||
|
| W/"1" | "1" | no match | match |
|
|||
|
| "1" | "1" | match | match |
|
|||
|
+--------+--------+-------------------+-----------------+
|
|||
|
|
|||
|
An entity-tag is strong unless it is explicitly tagged as weak.
|
|||
|
Section 2 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:
|
|||
|
|
|||
|
o The validator is being compared by an origin server to the actual
|
|||
|
current validator for the representation and,
|
|||
|
|
|||
|
o That origin server reliably knows that the associated
|
|||
|
representation did not change twice during the second covered by
|
|||
|
the presented validator.
|
|||
|
|
|||
|
or
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 9]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
o 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 representation, and
|
|||
|
|
|||
|
o That cache entry includes a Date value, which gives the time when
|
|||
|
the origin server sent the original response, and
|
|||
|
|
|||
|
o The presented Last-Modified time is at least 60 seconds before the
|
|||
|
Date value.
|
|||
|
|
|||
|
or
|
|||
|
|
|||
|
o The validator is being compared by an intermediate cache to the
|
|||
|
validator stored in its cache entry for the representation, and
|
|||
|
|
|||
|
o That cache entry includes a Date value, which gives the time when
|
|||
|
the origin server sent the original response, and
|
|||
|
|
|||
|
o 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 conditional range request
|
|||
|
([Part5]) 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.
|
|||
|
|
|||
|
5. Rules for When to Use Entity-tags and Last-Modified Dates
|
|||
|
|
|||
|
We adopt a set of rules and recommendations for origin servers,
|
|||
|
clients, and caches regarding when various validator types ought to
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 10]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
be used, and for what purposes.
|
|||
|
|
|||
|
HTTP/1.1 origin servers:
|
|||
|
|
|||
|
o SHOULD send an entity-tag validator unless it is not feasible to
|
|||
|
generate one.
|
|||
|
|
|||
|
o MAY send a weak entity-tag instead of a strong entity-tag, if
|
|||
|
performance considerations support the use of weak entity-tags, or
|
|||
|
if it is unfeasible to send a strong entity-tag.
|
|||
|
|
|||
|
o SHOULD send a Last-Modified value if it is feasible to send one,
|
|||
|
unless the risk of a breakdown in semantic transparency that could
|
|||
|
result from using this date in an If-Modified-Since header would
|
|||
|
lead to serious problems.
|
|||
|
|
|||
|
In other words, the preferred behavior for an HTTP/1.1 origin server
|
|||
|
is to send both a strong entity-tag and a Last-Modified value.
|
|||
|
|
|||
|
In order to be legal, a strong entity-tag MUST change whenever the
|
|||
|
associated representation changes in any way. A weak entity-tag
|
|||
|
SHOULD change whenever the associated representation changes in a
|
|||
|
semantically significant way.
|
|||
|
|
|||
|
Note: In order to provide semantically transparent caching, an
|
|||
|
origin server must avoid reusing a specific strong entity-tag
|
|||
|
value for two different representations, or reusing a specific
|
|||
|
weak entity-tag value for two semantically different
|
|||
|
representations. Cache entries might persist for arbitrarily long
|
|||
|
periods, regardless of expiration times, so it might be
|
|||
|
inappropriate to expect that a cache will never again attempt to
|
|||
|
validate an entry using a validator that it obtained at some point
|
|||
|
in the past.
|
|||
|
|
|||
|
HTTP/1.1 clients:
|
|||
|
|
|||
|
o MUST use that entity-tag in any cache-conditional request (using
|
|||
|
If-Match or If-None-Match) if an entity-tag has been provided by
|
|||
|
the origin server.
|
|||
|
|
|||
|
o SHOULD use the Last-Modified value in non-subrange cache-
|
|||
|
conditional requests (using If-Modified-Since) if only a Last-
|
|||
|
Modified value has been provided by the origin server.
|
|||
|
|
|||
|
o MAY use the Last-Modified value in subrange cache-conditional
|
|||
|
requests (using If-Unmodified-Since) if only a Last-Modified value
|
|||
|
has been provided by an HTTP/1.0 origin server. The user agent
|
|||
|
SHOULD provide a way to disable this, in case of difficulty.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 11]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
o SHOULD use both validators in cache-conditional requests if both
|
|||
|
an entity-tag and a Last-Modified value have been provided by the
|
|||
|
origin server. This allows both HTTP/1.0 and HTTP/1.1 caches to
|
|||
|
respond appropriately.
|
|||
|
|
|||
|
An HTTP/1.1 origin server, upon receiving a conditional request that
|
|||
|
includes both a Last-Modified date (e.g., in an If-Modified-Since or
|
|||
|
If-Unmodified-Since header field) and one or more entity-tags (e.g.,
|
|||
|
in an If-Match, If-None-Match, or If-Range header field) as cache
|
|||
|
validators, MUST NOT return a response status code of 304 (Not
|
|||
|
Modified) unless doing so is consistent with all of the conditional
|
|||
|
header fields in the request.
|
|||
|
|
|||
|
An HTTP/1.1 caching proxy, upon receiving a conditional request that
|
|||
|
includes both a Last-Modified date and one or more entity-tags as
|
|||
|
cache validators, MUST NOT return a locally cached response to the
|
|||
|
client unless that cached response is consistent with all of the
|
|||
|
conditional header fields in the request.
|
|||
|
|
|||
|
Note: The general principle behind these rules is that HTTP/1.1
|
|||
|
servers and clients ought to transmit as much non-redundant
|
|||
|
information as is available in their responses and requests.
|
|||
|
HTTP/1.1 systems receiving this information will make the most
|
|||
|
conservative assumptions about the validators they receive.
|
|||
|
|
|||
|
HTTP/1.0 clients and caches will ignore entity-tags. Generally,
|
|||
|
last-modified values received or used by these systems will
|
|||
|
support transparent and efficient caching, and so HTTP/1.1 origin
|
|||
|
servers should provide Last-Modified values. In those rare cases
|
|||
|
where the use of a Last-Modified value as a validator by an
|
|||
|
HTTP/1.0 system could result in a serious problem, then HTTP/1.1
|
|||
|
origin servers should not provide one.
|
|||
|
|
|||
|
6. Header Field Definitions
|
|||
|
|
|||
|
This section defines the syntax and semantics of HTTP/1.1 header
|
|||
|
fields related to conditional requests.
|
|||
|
|
|||
|
6.1. ETag
|
|||
|
|
|||
|
The "ETag" response-header field provides the current value of the
|
|||
|
entity-tag (see Section 2) for one representation of the target
|
|||
|
resource. An entity-tag is intended for use as a resource-local
|
|||
|
identifier for differentiating between representations of the same
|
|||
|
resource that vary over time or via content negotiation (see
|
|||
|
Section 4).
|
|||
|
|
|||
|
ETag = "ETag" ":" OWS ETag-v
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 12]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
ETag-v = entity-tag
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
ETag: "xyzzy"
|
|||
|
ETag: W/"xyzzy"
|
|||
|
ETag: ""
|
|||
|
|
|||
|
An entity-tag provides an "opaque" cache validator that allows for
|
|||
|
more reliable validation than modification dates in situations where
|
|||
|
it is inconvenient to store modification dates, where the one-second
|
|||
|
resolution of HTTP date values is not sufficient, or where the origin
|
|||
|
server wishes to avoid certain paradoxes that might arise from the
|
|||
|
use of modification dates.
|
|||
|
|
|||
|
The principle behind entity-tags is that only the service author
|
|||
|
knows the semantics of a resource well enough to select an
|
|||
|
appropriate cache validation mechanism, and the specification of any
|
|||
|
validator comparison function more complex than byte-equality would
|
|||
|
open up a can of worms. Thus, comparisons of any other headers
|
|||
|
(except Last-Modified, for compatibility with HTTP/1.0) are never
|
|||
|
used for purposes of validating a cache entry.
|
|||
|
|
|||
|
6.2. If-Match
|
|||
|
|
|||
|
The "If-Match" request-header field is used to make a request method
|
|||
|
conditional. A client that has one or more representations
|
|||
|
previously obtained from the resource can verify that one of those
|
|||
|
representations is current by including a list of their associated
|
|||
|
entity-tags in the If-Match header field.
|
|||
|
|
|||
|
This allows efficient updates of cached information with a minimum
|
|||
|
amount of transaction overhead. It is also used when updating
|
|||
|
resources, to prevent inadvertent modification of the wrong version
|
|||
|
of a resource. As a special case, the value "*" matches any current
|
|||
|
representation of the resource.
|
|||
|
|
|||
|
If-Match = "If-Match" ":" OWS If-Match-v
|
|||
|
If-Match-v = "*" / 1#entity-tag
|
|||
|
|
|||
|
If any of the entity-tags match the entity-tag of the representation
|
|||
|
that would have been returned in the response to a similar GET
|
|||
|
request (without the If-Match header) on that resource, or if "*" is
|
|||
|
given and any current representation exists for that resource, then
|
|||
|
the server MAY perform the requested method as if the If-Match header
|
|||
|
field did not exist.
|
|||
|
|
|||
|
If none of the entity-tags match, or if "*" is given and no current
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 13]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
representation exists, the server MUST NOT perform the requested
|
|||
|
method, and MUST return a 412 (Precondition Failed) response. This
|
|||
|
behavior is most useful when the client wants to prevent an updating
|
|||
|
method, such as PUT, from modifying a resource that has changed since
|
|||
|
the client last retrieved it.
|
|||
|
|
|||
|
If the request would, without the If-Match header field, result in
|
|||
|
anything other than a 2xx or 412 status code, then the If-Match
|
|||
|
header MUST be ignored.
|
|||
|
|
|||
|
The meaning of "If-Match: *" is that the method SHOULD be performed
|
|||
|
if the representation selected by the origin server (or by a cache,
|
|||
|
possibly using the Vary mechanism, see Section 3.5 of [Part6])
|
|||
|
exists, and MUST NOT be performed if the representation does not
|
|||
|
exist.
|
|||
|
|
|||
|
A request intended to update a resource (e.g., a PUT) MAY include an
|
|||
|
If-Match header field to signal that the request method MUST NOT be
|
|||
|
applied if the representation corresponding to the If-Match value (a
|
|||
|
single entity-tag) is no longer a representation of that resource.
|
|||
|
This allows the user to indicate that they do not wish the request to
|
|||
|
be successful if the resource has been changed without their
|
|||
|
knowledge. Examples:
|
|||
|
|
|||
|
If-Match: "xyzzy"
|
|||
|
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
|
|||
|
If-Match: *
|
|||
|
|
|||
|
The result of a request having both an If-Match header field and
|
|||
|
either an If-None-Match or an If-Modified-Since header fields is
|
|||
|
undefined by this specification.
|
|||
|
|
|||
|
6.3. If-Modified-Since
|
|||
|
|
|||
|
The "If-Modified-Since" request-header field is used to make a
|
|||
|
request method conditional by date: if the representation that would
|
|||
|
have been transferred in a 200 response to a GET request has not been
|
|||
|
modified since the time specified in this field, then do not perform
|
|||
|
the method; instead, respond as detailed below.
|
|||
|
|
|||
|
If-Modified-Since = "If-Modified-Since" ":" OWS
|
|||
|
If-Modified-Since-v
|
|||
|
If-Modified-Since-v = HTTP-date
|
|||
|
|
|||
|
An example of the field is:
|
|||
|
|
|||
|
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 14]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
A GET method with an If-Modified-Since header and no Range header
|
|||
|
requests that the representation be transferred only if it has been
|
|||
|
modified since the date given by the If-Modified-Since header. The
|
|||
|
algorithm for determining this includes the following cases:
|
|||
|
|
|||
|
1. If the request would normally result in anything other than a 200
|
|||
|
(OK) status code, or if the passed If-Modified-Since date is
|
|||
|
invalid, the response is exactly the same as for a normal GET. A
|
|||
|
date which is later than the server's current time is invalid.
|
|||
|
|
|||
|
2. If the representation has been modified since the If-Modified-
|
|||
|
Since date, the response is exactly the same as for a normal GET.
|
|||
|
|
|||
|
3. If the representation has not been modified since a valid If-
|
|||
|
Modified-Since date, the server SHOULD return a 304 (Not
|
|||
|
Modified) response.
|
|||
|
|
|||
|
The purpose of this feature is to allow efficient updates of cached
|
|||
|
information with a minimum amount of transaction overhead.
|
|||
|
|
|||
|
Note: The Range request-header field modifies the meaning of If-
|
|||
|
Modified-Since; see Section 5.4 of [Part5] for full details.
|
|||
|
|
|||
|
Note: If-Modified-Since times are interpreted by the server, whose
|
|||
|
clock might not be synchronized with the client.
|
|||
|
|
|||
|
Note: When handling an If-Modified-Since header field, some
|
|||
|
servers will use an exact date comparison function, rather than a
|
|||
|
less-than function, for deciding whether to send a 304 (Not
|
|||
|
Modified) response. To get best results when sending an If-
|
|||
|
Modified-Since header field for cache validation, clients are
|
|||
|
advised to use the exact date string received in a previous Last-
|
|||
|
Modified header field whenever possible.
|
|||
|
|
|||
|
Note: If a client uses an arbitrary date in the If-Modified-Since
|
|||
|
header instead of a date taken from the Last-Modified header for
|
|||
|
the same request, the client needs to be aware that this date is
|
|||
|
interpreted in the server's understanding of time. Unsynchronized
|
|||
|
clocks and rounding problems, due to the different encodings of
|
|||
|
time between the client and server, are concerns. This includes
|
|||
|
the possibility of race conditions if the document has changed
|
|||
|
between the time it was first requested and the If-Modified-Since
|
|||
|
date of a subsequent request, and the possibility of clock-skew-
|
|||
|
related problems if the If-Modified-Since date is derived from the
|
|||
|
client's clock without correction to the server's clock.
|
|||
|
Corrections for different time bases between client and server are
|
|||
|
at best approximate due to network latency.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 15]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
The result of a request having both an If-Modified-Since header field
|
|||
|
and either an If-Match or an If-Unmodified-Since header fields is
|
|||
|
undefined by this specification.
|
|||
|
|
|||
|
6.4. If-None-Match
|
|||
|
|
|||
|
The "If-None-Match" request-header field is used to make a request
|
|||
|
method conditional. A client that has one or more representations
|
|||
|
previously obtained from the resource can verify that none of those
|
|||
|
representations is current by including a list of their associated
|
|||
|
entity-tags in the If-None-Match header field.
|
|||
|
|
|||
|
This allows efficient updates of cached information with a minimum
|
|||
|
amount of transaction overhead. It is also used to prevent a method
|
|||
|
(e.g., PUT) from inadvertently modifying an existing resource when
|
|||
|
the client believes that the resource does not exist.
|
|||
|
|
|||
|
As a special case, the value "*" matches any current representation
|
|||
|
of the resource.
|
|||
|
|
|||
|
If-None-Match = "If-None-Match" ":" OWS If-None-Match-v
|
|||
|
If-None-Match-v = "*" / 1#entity-tag
|
|||
|
|
|||
|
If any of the entity-tags match the entity-tag of the representation
|
|||
|
that would have been returned in the response to a similar GET
|
|||
|
request (without the If-None-Match header) on that resource, or if
|
|||
|
"*" is given and any current representation exists for that resource,
|
|||
|
then the server MUST NOT perform the requested method, unless
|
|||
|
required to do so because the resource's modification date fails to
|
|||
|
match that supplied in an If-Modified-Since header field in the
|
|||
|
request. Instead, if the request method was GET or HEAD, the server
|
|||
|
SHOULD respond with a 304 (Not Modified) response, including the
|
|||
|
cache-related header fields (particularly ETag) of one of the
|
|||
|
representations that matched. For all other request methods, the
|
|||
|
server MUST respond with a 412 (Precondition Failed) status code.
|
|||
|
|
|||
|
If none of the entity-tags match, then the server MAY perform the
|
|||
|
requested method as if the If-None-Match header field did not exist,
|
|||
|
but MUST also ignore any If-Modified-Since header field(s) in the
|
|||
|
request. That is, if no entity-tags match, then the server MUST NOT
|
|||
|
return a 304 (Not Modified) response.
|
|||
|
|
|||
|
If the request would, without the If-None-Match header field, result
|
|||
|
in anything other than a 2xx or 304 status code, then the If-None-
|
|||
|
Match header MUST be ignored. (See Section 5 for a discussion of
|
|||
|
server behavior when both If-Modified-Since and If-None-Match appear
|
|||
|
in the same request.)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 16]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
The meaning of "If-None-Match: *" is that the method MUST NOT be
|
|||
|
performed if the representation selected by the origin server (or by
|
|||
|
a cache, possibly using the Vary mechanism, see Section 3.5 of
|
|||
|
[Part6]) exists, and SHOULD be performed if the representation does
|
|||
|
not exist. This feature is intended to be useful in preventing races
|
|||
|
between PUT operations.
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
If-None-Match: "xyzzy"
|
|||
|
If-None-Match: W/"xyzzy"
|
|||
|
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
|
|||
|
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
|
|||
|
If-None-Match: *
|
|||
|
|
|||
|
The result of a request having both an If-None-Match header field and
|
|||
|
either an If-Match or an If-Unmodified-Since header fields is
|
|||
|
undefined by this specification.
|
|||
|
|
|||
|
6.5. If-Unmodified-Since
|
|||
|
|
|||
|
The "If-Unmodified-Since" request-header field is used to make a
|
|||
|
request method conditional. If the representation that would have
|
|||
|
been transferred in a 200 response to a GET request on the same
|
|||
|
resource has not been modified since the time specified in this
|
|||
|
field, the server SHOULD perform the requested operation as if the
|
|||
|
If-Unmodified-Since header were not present.
|
|||
|
|
|||
|
If the representation has been modified since the specified time, the
|
|||
|
server MUST NOT perform the requested operation, and MUST return a
|
|||
|
412 (Precondition Failed).
|
|||
|
|
|||
|
If-Unmodified-Since = "If-Unmodified-Since" ":" OWS
|
|||
|
If-Unmodified-Since-v
|
|||
|
If-Unmodified-Since-v = HTTP-date
|
|||
|
|
|||
|
An example of the field is:
|
|||
|
|
|||
|
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
|
|||
|
|
|||
|
If the request normally (i.e., without the If-Unmodified-Since
|
|||
|
header) would result in anything other than a 2xx or 412 status code,
|
|||
|
the If-Unmodified-Since header SHOULD be ignored.
|
|||
|
|
|||
|
If the specified date is invalid, the header is ignored.
|
|||
|
|
|||
|
The result of a request having both an If-Unmodified-Since header
|
|||
|
field and either an If-None-Match or an If-Modified-Since header
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 17]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
fields is undefined by this specification.
|
|||
|
|
|||
|
6.6. Last-Modified
|
|||
|
|
|||
|
The "Last-Modified" header field indicates the date and time at which
|
|||
|
the origin server believes the representation was last modified.
|
|||
|
|
|||
|
Last-Modified = "Last-Modified" ":" OWS Last-Modified-v
|
|||
|
Last-Modified-v = HTTP-date
|
|||
|
|
|||
|
An example of its use is
|
|||
|
|
|||
|
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
|
|||
|
|
|||
|
The exact meaning of this header field depends on the implementation
|
|||
|
of the origin server and the nature of the original resource. For
|
|||
|
files, it might be just the file system last-modified time. For
|
|||
|
representations with dynamically included parts, it might be the most
|
|||
|
recent of the set of last-modify times for its component parts. For
|
|||
|
database gateways, it might be the last-update time stamp of the
|
|||
|
record. For virtual objects, it might be the last time the internal
|
|||
|
state changed.
|
|||
|
|
|||
|
An origin server MUST NOT send a Last-Modified date which is later
|
|||
|
than the server's time of message origination. In such cases, where
|
|||
|
the resource's last modification would indicate some time in the
|
|||
|
future, the server MUST replace that date with the message
|
|||
|
origination date.
|
|||
|
|
|||
|
An origin server SHOULD obtain the Last-Modified value of the
|
|||
|
representation as close as possible to the time that it generates the
|
|||
|
Date value of its response. This allows a recipient to make an
|
|||
|
accurate assessment of the representation's modification time,
|
|||
|
especially if the representation changes near the time that the
|
|||
|
response is generated.
|
|||
|
|
|||
|
HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.
|
|||
|
|
|||
|
The Last-Modified header field value is often used as a cache
|
|||
|
validator. In simple terms, a cache entry is considered to be valid
|
|||
|
if the representation has not been modified since the Last-Modified
|
|||
|
value.
|
|||
|
|
|||
|
7. IANA Considerations
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 18]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
7.1. Status Code Registration
|
|||
|
|
|||
|
The HTTP Status Code Registry located at
|
|||
|
<http://www.iana.org/assignments/http-status-codes> shall be updated
|
|||
|
with the registrations below:
|
|||
|
|
|||
|
+-------+---------------------+-------------+
|
|||
|
| Value | Description | Reference |
|
|||
|
+-------+---------------------+-------------+
|
|||
|
| 304 | Not Modified | Section 3.1 |
|
|||
|
| 412 | Precondition Failed | Section 3.2 |
|
|||
|
+-------+---------------------+-------------+
|
|||
|
|
|||
|
7.2. Header Field Registration
|
|||
|
|
|||
|
The Message Header Field Registry located at <http://www.iana.org/
|
|||
|
assignments/message-headers/message-header-index.html> shall be
|
|||
|
updated with the permanent registrations below (see [RFC3864]):
|
|||
|
|
|||
|
+---------------------+----------+----------+-------------+
|
|||
|
| Header Field Name | Protocol | Status | Reference |
|
|||
|
+---------------------+----------+----------+-------------+
|
|||
|
| ETag | http | standard | Section 6.1 |
|
|||
|
| If-Match | http | standard | Section 6.2 |
|
|||
|
| If-Modified-Since | http | standard | Section 6.3 |
|
|||
|
| If-None-Match | http | standard | Section 6.4 |
|
|||
|
| If-Unmodified-Since | http | standard | Section 6.5 |
|
|||
|
| Last-Modified | http | standard | Section 6.6 |
|
|||
|
+---------------------+----------+----------+-------------+
|
|||
|
|
|||
|
The change controller is: "IETF (iesg@ietf.org) - Internet
|
|||
|
Engineering Task Force".
|
|||
|
|
|||
|
8. Security Considerations
|
|||
|
|
|||
|
No additional security considerations have been identified beyond
|
|||
|
those applicable to HTTP in general [Part1].
|
|||
|
|
|||
|
9. Acknowledgments
|
|||
|
|
|||
|
10. References
|
|||
|
|
|||
|
10.1. Normative References
|
|||
|
|
|||
|
[Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
|
|||
|
Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
|
|||
|
and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
|
|||
|
and Message Parsing", draft-ietf-httpbis-p1-messaging-11
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 19]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
(work in progress), August 2010.
|
|||
|
|
|||
|
[Part3] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
|
|||
|
Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
|
|||
|
and J. Reschke, Ed., "HTTP/1.1, part 3: Message Payload
|
|||
|
and Content Negotiation", draft-ietf-httpbis-p3-payload-11
|
|||
|
(work in progress), August 2010.
|
|||
|
|
|||
|
[Part5] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
|
|||
|
Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
|
|||
|
and J. Reschke, Ed., "HTTP/1.1, part 5: Range Requests and
|
|||
|
Partial Responses", draft-ietf-httpbis-p5-range-11 (work
|
|||
|
in progress), August 2010.
|
|||
|
|
|||
|
[Part6] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
|
|||
|
Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
|
|||
|
Nottingham, M., Ed., and J. Reschke, Ed., "HTTP/1.1, part
|
|||
|
6: Caching", draft-ietf-httpbis-p6-cache-11 (work in
|
|||
|
progress), August 2010.
|
|||
|
|
|||
|
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
|
|||
|
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
|||
|
|
|||
|
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
|
|||
|
Specifications: ABNF", STD 68, RFC 5234, January 2008.
|
|||
|
|
|||
|
10.2. Informative References
|
|||
|
|
|||
|
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
|
|||
|
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
|
|||
|
Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
|
|||
|
|
|||
|
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
|
|||
|
Procedures for Message Header Fields", BCP 90, RFC 3864,
|
|||
|
September 2004.
|
|||
|
|
|||
|
Appendix A. Changes from RFC 2616
|
|||
|
|
|||
|
Allow weak entity-tags in all requests except range requests
|
|||
|
(Sections 4 and 6.4).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 20]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
Appendix B. Collected ABNF
|
|||
|
|
|||
|
ETag = "ETag:" OWS ETag-v
|
|||
|
ETag-v = entity-tag
|
|||
|
|
|||
|
HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
|
|||
|
|
|||
|
If-Match = "If-Match:" OWS If-Match-v
|
|||
|
If-Match-v = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS
|
|||
|
entity-tag ] ) )
|
|||
|
If-Modified-Since = "If-Modified-Since:" OWS If-Modified-Since-v
|
|||
|
If-Modified-Since-v = HTTP-date
|
|||
|
If-None-Match = "If-None-Match:" OWS If-None-Match-v
|
|||
|
If-None-Match-v = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS
|
|||
|
entity-tag ] ) )
|
|||
|
If-Unmodified-Since = "If-Unmodified-Since:" OWS
|
|||
|
If-Unmodified-Since-v
|
|||
|
If-Unmodified-Since-v = HTTP-date
|
|||
|
|
|||
|
Last-Modified = "Last-Modified:" OWS Last-Modified-v
|
|||
|
Last-Modified-v = HTTP-date
|
|||
|
|
|||
|
OWS = <OWS, defined in [Part1], Section 1.2.2>
|
|||
|
|
|||
|
entity-tag = [ weak ] opaque-tag
|
|||
|
|
|||
|
opaque-tag = quoted-string
|
|||
|
|
|||
|
quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
|
|||
|
|
|||
|
weak = %x57.2F ; W/
|
|||
|
|
|||
|
ABNF diagnostics:
|
|||
|
|
|||
|
; ETag defined but not used
|
|||
|
; If-Match defined but not used
|
|||
|
; If-Modified-Since defined but not used
|
|||
|
; If-None-Match defined but not used
|
|||
|
; If-Unmodified-Since defined but not used
|
|||
|
; Last-Modified defined but not used
|
|||
|
|
|||
|
Appendix C. Change Log (to be removed by RFC Editor before publication)
|
|||
|
|
|||
|
C.1. Since RFC2616
|
|||
|
|
|||
|
Extracted relevant partitions from [RFC2616].
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 21]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
C.2. Since draft-ietf-httpbis-p4-conditional-00
|
|||
|
|
|||
|
Closed issues:
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
|
|||
|
Informative references"
|
|||
|
|
|||
|
Other changes:
|
|||
|
|
|||
|
o Move definitions of 304 and 412 condition codes from Part2.
|
|||
|
|
|||
|
C.3. Since draft-ietf-httpbis-p4-conditional-01
|
|||
|
|
|||
|
Ongoing work on ABNF conversion
|
|||
|
(<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
|
|||
|
|
|||
|
o Add explicit references to BNF syntax and rules imported from
|
|||
|
other parts of the specification.
|
|||
|
|
|||
|
C.4. Since draft-ietf-httpbis-p4-conditional-02
|
|||
|
|
|||
|
Closed issues:
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/116>: "Weak ETags on
|
|||
|
non-GET requests"
|
|||
|
|
|||
|
Ongoing work on IANA Message Header Registration
|
|||
|
(<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
|
|||
|
|
|||
|
o Reference RFC 3984, and update header registrations for headers
|
|||
|
defined in this document.
|
|||
|
|
|||
|
C.5. Since draft-ietf-httpbis-p4-conditional-03
|
|||
|
|
|||
|
Closed issues:
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/71>: "Examples for
|
|||
|
ETag matching"
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/124>: "'entity
|
|||
|
value' undefined"
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/126>: "bogus 2068
|
|||
|
Date header reference"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 22]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
C.6. Since draft-ietf-httpbis-p4-conditional-04
|
|||
|
|
|||
|
Ongoing work on ABNF conversion
|
|||
|
(<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
|
|||
|
|
|||
|
o Use "/" instead of "|" for alternatives.
|
|||
|
|
|||
|
o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
|
|||
|
whitespace ("OWS") and required whitespace ("RWS").
|
|||
|
|
|||
|
o Rewrite ABNFs to spell out whitespace rules, factor out header
|
|||
|
value format definitions.
|
|||
|
|
|||
|
C.7. Since draft-ietf-httpbis-p4-conditional-05
|
|||
|
|
|||
|
Final work on ABNF conversion
|
|||
|
(<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
|
|||
|
|
|||
|
o Add appendix containing collected and expanded ABNF, reorganize
|
|||
|
ABNF introduction.
|
|||
|
|
|||
|
C.8. Since draft-ietf-httpbis-p4-conditional-06
|
|||
|
|
|||
|
Closed issues:
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/153>: "case-
|
|||
|
sensitivity of etag weakness indicator"
|
|||
|
|
|||
|
C.9. Since draft-ietf-httpbis-p4-conditional-07
|
|||
|
|
|||
|
Closed issues:
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/116>: "Weak ETags on
|
|||
|
non-GET requests" (If-Match still was defined to require strong
|
|||
|
matching)
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/198>: "move IANA
|
|||
|
registrations for optional status codes"
|
|||
|
|
|||
|
C.10. Since draft-ietf-httpbis-p4-conditional-08
|
|||
|
|
|||
|
No significant changes.
|
|||
|
|
|||
|
C.11. Since draft-ietf-httpbis-p4-conditional-09
|
|||
|
|
|||
|
No significant changes.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 23]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
C.12. Since draft-ietf-httpbis-p4-conditional-10
|
|||
|
|
|||
|
Closed issues:
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/69>: "Clarify
|
|||
|
'Requested Variant'"
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
|
|||
|
entity / representation / variant terminology"
|
|||
|
|
|||
|
o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
|
|||
|
removing the 'changes from 2068' sections"
|
|||
|
|
|||
|
Index
|
|||
|
|
|||
|
3
|
|||
|
304 Not Modified (status code) 7
|
|||
|
|
|||
|
4
|
|||
|
412 Precondition Failed (status code) 7
|
|||
|
|
|||
|
E
|
|||
|
ETag header 12
|
|||
|
|
|||
|
G
|
|||
|
Grammar
|
|||
|
entity-tag 5
|
|||
|
ETag 12
|
|||
|
ETag-v 12
|
|||
|
If-Match 13
|
|||
|
If-Match-v 13
|
|||
|
If-Modified-Since 14
|
|||
|
If-Modified-Since-v 14
|
|||
|
If-None-Match 16
|
|||
|
If-None-Match-v 16
|
|||
|
If-Unmodified-Since 17
|
|||
|
If-Unmodified-Since-v 17
|
|||
|
Last-Modified 18
|
|||
|
Last-Modified-v 18
|
|||
|
opaque-tag 5
|
|||
|
weak 5
|
|||
|
|
|||
|
H
|
|||
|
Headers
|
|||
|
ETag 12
|
|||
|
If-Match 13
|
|||
|
If-Modified-Since 14
|
|||
|
If-None-Match 16
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 24]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
If-Unmodified-Since 17
|
|||
|
Last-Modified 18
|
|||
|
|
|||
|
I
|
|||
|
If-Match header 13
|
|||
|
If-Modified-Since header 14
|
|||
|
If-None-Match header 16
|
|||
|
If-Unmodified-Since header 17
|
|||
|
|
|||
|
L
|
|||
|
Last-Modified header 18
|
|||
|
|
|||
|
S
|
|||
|
Status Codes
|
|||
|
304 Not Modified 7
|
|||
|
412 Precondition Failed 7
|
|||
|
|
|||
|
Authors' Addresses
|
|||
|
|
|||
|
Roy T. Fielding (editor)
|
|||
|
Day Software
|
|||
|
23 Corporate Plaza DR, Suite 280
|
|||
|
Newport Beach, CA 92660
|
|||
|
USA
|
|||
|
|
|||
|
Phone: +1-949-706-5300
|
|||
|
Fax: +1-949-706-5305
|
|||
|
EMail: fielding@gbiv.com
|
|||
|
URI: http://roy.gbiv.com/
|
|||
|
|
|||
|
|
|||
|
Jim Gettys
|
|||
|
Alcatel-Lucent Bell Labs
|
|||
|
21 Oak Knoll Road
|
|||
|
Carlisle, MA 01741
|
|||
|
USA
|
|||
|
|
|||
|
EMail: jg@freedesktop.org
|
|||
|
URI: http://gettys.wordpress.com/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 25]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
Jeffrey C. Mogul
|
|||
|
Hewlett-Packard Company
|
|||
|
HP Labs, Large Scale Systems Group
|
|||
|
1501 Page Mill Road, MS 1177
|
|||
|
Palo Alto, CA 94304
|
|||
|
USA
|
|||
|
|
|||
|
EMail: JeffMogul@acm.org
|
|||
|
|
|||
|
|
|||
|
Henrik Frystyk Nielsen
|
|||
|
Microsoft Corporation
|
|||
|
1 Microsoft Way
|
|||
|
Redmond, WA 98052
|
|||
|
USA
|
|||
|
|
|||
|
EMail: henrikn@microsoft.com
|
|||
|
|
|||
|
|
|||
|
Larry Masinter
|
|||
|
Adobe Systems, Incorporated
|
|||
|
345 Park Ave
|
|||
|
San Jose, CA 95110
|
|||
|
USA
|
|||
|
|
|||
|
EMail: LMM@acm.org
|
|||
|
URI: http://larry.masinter.net/
|
|||
|
|
|||
|
|
|||
|
Paul J. Leach
|
|||
|
Microsoft Corporation
|
|||
|
1 Microsoft Way
|
|||
|
Redmond, WA 98052
|
|||
|
|
|||
|
EMail: paulle@microsoft.com
|
|||
|
|
|||
|
|
|||
|
Tim Berners-Lee
|
|||
|
World Wide Web Consortium
|
|||
|
MIT Computer Science and Artificial Intelligence Laboratory
|
|||
|
The Stata Center, Building 32
|
|||
|
32 Vassar Street
|
|||
|
Cambridge, MA 02139
|
|||
|
USA
|
|||
|
|
|||
|
EMail: timbl@w3.org
|
|||
|
URI: http://www.w3.org/People/Berners-Lee/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 26]
|
|||
|
|
|||
|
Internet-Draft HTTP/1.1, Part 4 August 2010
|
|||
|
|
|||
|
|
|||
|
Yves Lafon (editor)
|
|||
|
World Wide Web Consortium
|
|||
|
W3C / ERCIM
|
|||
|
2004, rte des Lucioles
|
|||
|
Sophia-Antipolis, AM 06902
|
|||
|
France
|
|||
|
|
|||
|
EMail: ylafon@w3.org
|
|||
|
URI: http://www.raubacapeu.net/people/yves/
|
|||
|
|
|||
|
|
|||
|
Julian F. Reschke (editor)
|
|||
|
greenbytes GmbH
|
|||
|
Hafenweg 16
|
|||
|
Muenster, NW 48155
|
|||
|
Germany
|
|||
|
|
|||
|
Phone: +49 251 2807760
|
|||
|
Fax: +49 251 2807761
|
|||
|
EMail: julian.reschke@greenbytes.de
|
|||
|
URI: http://greenbytes.de/tech/webdav/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Fielding, et al. Expires February 5, 2011 [Page 27]
|
|||
|
|