4.3. 验证 (Validation)
当 cache 对 requested URI 拥有一个或多个 stored response, 但无法提供其中任何一个时, 例如因为它们不 fresh, 或者 request directive 禁止这样做, cache 可以在 forwarded request 中使用 conditional request mechanism [RFC7232], 让 origin server 有机会选择一个可用的 valid stored response, 在此过程中更新 stored metadata, 或者用新的 response 替换 stored response. 这个过程称为对 stored response 进行 "validating" 或 "revalidating".
4.3.1. 发送验证请求 (Sending a Validation Request)
生成用于 validation 的 conditional request 时, cache 要么从它正尝试满足的 request 开始, 要么在独立发起 request 时, 通过复制 method, target URI 和相关 request header field, 使用 stored response 合成一个 request.
然后, cache 会使用一个或多个 precondition header field 更新该 request. 这些 field 包含从正在 validation 的 stored response 中取得的 validator metadata ([RFC7232] Section 2.3). 通常, 这会包括 stored response 的 Last-Modified 和/或 ETag field value.
随后, cache 可以将 conditional request 发送给 origin server, 或者可能发送给 Via header field 中列出的 downstream cache.
4.3.2. 处理收到的验证请求 (Handling a Received Validation Request)
request chain 中的每个 client 都可能拥有自己的 cache, 因此 intermediary 上的 cache 经常会收到来自其他 outbound cache 的 conditional request. 同样, 某些 client 可能存在 clock skew 或其他问题, 导致它们在不理解 conditional request 的情况下生成它们, 或者此类 request 可能由使用底层 HTTP library 的 implementation 生成.
这意味着, 对 conditional request 提供 304 (Not Modified) 或 412 (Precondition Failed) response, 不能假定 client 理解此类 response, 也不能假定它拥有 cached copy, 即使它确实曾经拥有, 该 copy 也可能已经被移除.
当 cache 收到包含 validator field 的 request, 例如 If-None-Match header field, 除非它确信作为 conditional request 目标的 stored response 是从 upstream 收到的最新 validation response, 否则 MUST NOT 返回 304 (Not Modified) response. 特别是, intermediary 需要验证 stored response 的 validator, 即 ETag 和 Last-Modified field value 如果存在, 与 conditional request 中给出的 validator 按 byte-for-byte 完全相同.
注意, 当 cache 没有 stored response 时, 即它正在执行 "on-demand" caching, 不要求执行此类检查.
如果 request 包含 If-None-Match 或 If-Modified-Since precondition header field, 且其条件求值为 false, cache MUST NOT 发送 304 (Not Modified) response 作为回复, 因为 client 将无法从 cache 的 stored response 构造 valid response.
相反, 收到 conditional request 且拥有适合用于回复的 stored response 的 cache, 将执行以下二者之一:
- 如果 stored response 是 fresh (Section 4.2), 或者已经成功 validation (Section 4.3), 则发送 304 (Not Modified) response, 或
- 使用自己的 conditional request 将 request 转发到 origin server, 尝试 validation 该 stored response.
在后一种情况下, cache 会在 forwarded request 中包含 validator. forwarded request MUST 使用与 stored response 关联的最新 validator 集合.