【问题标题】:Why does OkHttp treat the Date header the same as it treats the Last-Modified header when setting the If-Modified-Since header?为什么 OkHttp 在设置 If-Modified-Since 标头时将 Date 标头视为与 Last-Modified 标头相同?
【发布时间】:2017-09-06 03:02:16
【问题描述】:

我正在使用一个 Jenkins 插件,该插件使用 OkHttp 库来处理与 Github API 的集成。

当 OkHttp 尝试使用不允许访问资源的令牌请求资源时,Github 的 /repos/:owner/:repo 端点返回错误 404。当令牌的范围扩大到允许它访问资源时,OkHttp 使用 If-Modified-Since 标头发出请求。标头的值设置为 404 响应中的 Date 标头的值。第二个请求的响应是 HTTP 304。根据 Github 的支持团队的说法,这种行为是正确的行为,因为资源(/repos/:owner/:repo 端点后面的数据)自第一个请求被修改后没有被修改制成。但是,这意味着 OkHttp 客户端现在使用缓存的 404 响应。

似乎 Date 标头用于计算新鲜度,而不是检查资源上次修改的时间。 RFC 7232 section 3.3 说客户端可以使用 Date 标头的值作为 If-Modified-Since 值,但我没有在网络上看到其他文献表明这种行为是可以接受的。我在Mozilla's documentation on the If-Modified-Since header 中没有看到对日期标头的任何引用。

难道 Postel 定律不会建议 OkHttp 尽量不要滥用 Date 标头,将其用作 If-Modified-Since 标头的另一个来源?

【问题讨论】:

    标签: http github okhttp okhttp3


    【解决方案1】:

    RFC 对什么行为是合适的有明确的规定。如果 RFC 说 Date 标头可以与 If-Modified-Since 一起使用,那么可以。

    考虑在扩大范围时说服 GitHub 使缓存无效。如果在 2017 年 3 月 1 日提供了响应,并且在 2017 年 4 月 1 日扩大了令牌的范围,则在 2017 年 4 月 1 日有效地修改了资源。

    您的另一个选择是禁用 OkHttp 的缓存。就像每个缓存一样,由于遵守了有缺陷的缓存配置的指令,它违反了 Postel 定律。

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 1970-01-01
      • 2015-03-28
      • 2016-12-10
      • 2016-04-02
      • 2011-07-02
      • 1970-01-01
      • 2019-09-21
      • 2018-10-23
      相关资源
      最近更新 更多