为什么OkHttp将Date标头与设置If-Modified-Since标头时处理Last-Modified标头的方式相同?

时间:2017-04-10 22:24:56

标签: http github okhttp okhttp3

我使用的Jenkins插件使用OkHttp库来处理与Github API的集成。

当OkHttp尝试使用不允许访问资源的令牌请求资源时,Github的&repos /:owner /:repo端点返回错误404。当扩展令牌的范围以允许它访问资源时,OkHttp使用If-Modified-Since标头发出请求。标题的值设置为404响应中的日期标题值。第二个请求的响应是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中没有看到对Date标头的任何引用。

不是Postel的法律建议OkHttp应该尽量不使用Date标头作为If-Modified-Since标头的另一个来源吗?

1 个答案:

答案 0 :(得分:1)

RFC对于适当的行为是明确的。如果RFC说Date标题可以与If-Modified-Since一起使用,那么它可以是。

考虑说服GitHub在扩展范围时使缓存无效。如果在2017-03-01上提供了响应,并且在2017-04-01上扩展了令牌的范围,那么该资源在2017-04-01上被有效修改。

您的另一个选择是禁用OkHttp的缓存。与每个缓存一样,它违反了Postel定律,因为它遵循了错误缓存配置的指令。