为什么在设置If-Modified-Since标题时,OkHttp将Date标题与对待Last-Modified标题相同?

问题描述:

我正在使用一个Jenkins插件,它使用OkHttp库来处理与Github API的集成。为什么在设置If-Modified-Since标题时,OkHttp将Date标题与对待Last-Modified标题相同?

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

看起来好像日期标题是用于计算新鲜度,而不是检查资源何时最后修改。 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标题的另一个来源?

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

考虑说服GitHub在展开范围时使缓存无效。如果在2017-03-01上提供了回复,并且令牌的范围在2017-04-01上展开,则该资源在2017-04-01上进行了有效修改。

您的其他选项是禁用OkHttp的缓存。由于遵守有问题的高速缓存配置指令,它像每个高速缓存一样违反了Postel定律。