#http-header #response-headers #http-response #http-cache #request-response #header #request-headers

http-cache-semantics

RFC 7234。解析HTTP头信息以正确计算响应的可缓存性,即使在复杂情况下也是如此

12个版本 (6个稳定版)

2.1.0 2024年3月20日
2.0.1 2023年11月29日
1.0.2 2023年11月13日
1.0.1 2022年4月21日
0.4.0 2020年2月10日

缓存中排名第8

Download history 9007/week @ 2024-04-22 8756/week @ 2024-04-29 9127/week @ 2024-05-06 8294/week @ 2024-05-13 8510/week @ 2024-05-20 8760/week @ 2024-05-27 9403/week @ 2024-06-03 10662/week @ 2024-06-10 9501/week @ 2024-06-17 9335/week @ 2024-06-24 6063/week @ 2024-07-01 7794/week @ 2024-07-08 7989/week @ 2024-07-15 9457/week @ 2024-07-22 10690/week @ 2024-07-29 10123/week @ 2024-08-05

每月下载量38,808
用于51个库(14个直接使用)

BSD-2-Clause

45KB
859

我能缓存这个吗?

CachePolicy 根据用户代理和共享缓存遵循的 HTTP RFC 7234/9111 规则,说明何时可以从缓存中重用响应。它了解许多复杂细节,例如 Vary 头、年龄更新、代理重新验证和经过身份验证的响应。

用法

HTTP响应的可缓存性取决于其请求方式,因此需要同时提供 requestresponse 以创建策略。

可能会令人惊讶,但仅仅因为HTTP响应是 新鲜的 并不能满足请求。它可能需要匹配 Vary 中指定的请求头。即使匹配的新响应仍然可能由于新的请求限制了可缓存性等原因而无法使用。

关键方法是 before_request(new_request),该方法检查 new_request 是否与原始请求兼容以及所有缓存条件是否满足。

选项

如果 options.sharedtrue(默认值),则响应将从一个共享缓存的视角进行评估(即 private 无法缓存,且 s-maxage 被尊重)。如果 options.sharedfalse,则响应将从一个单用户缓存的视角进行评估(即 private 可缓存,且 s-maxage 被忽略)。对于 HTTP 代理,建议使用 shared: true,而对于单用户客户端,则建议使用 false

options.cache_heuristic 是响应年龄的分数,用作后备缓存持续时间。默认值为 0.1(10%),例如,如果一个文件100天未更改,它将被缓存100×0.1=10天。

options.immutable_min_time_to_live 是假设为具有 Cache-Control: immutable 的响应的默认缓存时间的持续时间。注意,根据 RFC,这些可能变得过时,所以 max-age 仍然覆盖默认值。

如果 options.ignore_cargo_cult 为真,则如果存在非标准的 pre-checkpost-check 指令,则将完全忽略常见的反缓存指令。这两个无用的指令最常见于糟糕的 StackOverflow 答案和 PHP 的 "session limiter" 默认设置。

is_storable()

如果响应可以存储在缓存中,则返回 true。如果它是 false,那么你绝对不能存储请求或响应。

before_request(new_request)

这是最重要的方法。使用此方法检查缓存的响应在新请求的上下文中是否仍然新鲜。

如果它返回 Fresh,则给定的 request 与创建此缓存策略时使用的原始响应相匹配,并且可以在不联系服务器的情况下重用响应。这将包含一个更新的、过滤后的响应头集合,用于返回给接收缓存响应的客户端。此处理是必要的,因为代理必须始终删除端到端头(如 TEConnection),并将响应的 Age 更新,以避免加倍缓存时间。

如果它返回 Stale,则响应可能完全不匹配(例如,它是针对不同的 URL 或方法),或者可能需要先刷新。变体会包含用于向服务器发出重新验证请求的 HTTP 头部。

time_to_live()

返回响应变为过时(即不再新鲜)的大致时间。这与 max-age 相当,但已应用适当的时间校正。

在那之后的时间(当 time_to_live() == Duration::ZERO)后,响应可能无法使用,除非重新验证。但是,有一些例外,例如,客户端可以明确允许过时响应,因此始终使用 before_request() 进行检查。

刷新过时的缓存(重新验证)

当缓存的响应过期时,可以通过向原始服务器发送请求来使其再次新鲜。服务器可以不重新发送响应体,而仅以状态码304(未修改)响应,从而节省带宽。

after_response(revalidation_request,revalidation_response)

使用此方法在收到原始服务器的新响应后更新缓存。它返回带有新CachePolicyModified/NotModified对象,其中HTTP头已从revalidation_response更新。您始终可以用新对象替换旧的缓存CachePolicy

-  If `NotModified`, then a valid 304 Not Modified response has been received, and you can reuse the old cached response body.
-  If `Modified`, you should replace the old cached body with the new response's body.

嘿,新鲜!

satisfies_without_revalidation

已实现

  • Cache-Control响应头包含所有怪癖。
  • Expires带有对坏时钟的检查。
  • Pragma响应头。
  • Age响应头。
  • Vary响应头。
  • 状态和方法的默认缓存性。
  • 对过时数据的请求。
  • 过滤端到端头。
  • 基本重新验证请求

未实现

  • 范围请求合并,If-Range(但正确地支持它们为不可缓存)
  • 多个表示形式的重新验证

依赖关系

~2–13MB
~146K SLoC