如何使用 Compojure 生成修改后的 http 标头?

ama*_*loy 6 http clojure compojure http-headers

我正在尝试提高客户端从我的 Compojure 网络服务器获取页面的性能。我们使用 提供了一堆静态文件(JS、CSS)(compojure.route/resources "/"),它在文件系统上查找文件,将它们转换为 URL,然后将它们作为流提供给 Ring。通过转换为流,它似乎丢失了所有文件元数据,例如 mod 时间。

我可以包装静态资源处理程序并添加一个ExpiresorCache-Control: max-age标头,但这会阻止客户端发送任何请求。很有用,但这些文件有时会更改(当我们发布版本时)。

理想情况下,我希望客户端信任其自己的缓存版本,例如一个小时,并If-Modified-Since在该小时过去后使用标头发出请求。然后我们可以返回304 Not Modified,客户端避免下载几百公斤的 javascript。

看起来我可以Last-Modified在提供响应时设置标头,这会导致客户端使用If-Modified-Since标头限定后续请求。很好,除了我必须重写大部分代码compojure.route/resources才能添加Last-Modified- 不难,但很乏味 - 并发明更多代码来识别和响应If-Modified-Since标头。不是一项艰巨的任务,但也不是一项简单的任务。

这是否已经存在于某处?我找不到它,但它似乎是一项足够常见且足够大的任务,以至于现在有人会为它编写一个库。

ama*_*loy 5

FWIW,我通过使用 Ring 的 wrap-file-info 中间件让它工作;我有点尴尬,因为我在 Compojure 而不是 Ring 中寻找这个。但是,compojure.route'sfilesresources处理程序都提供流而不是文件或 URL,当然 Ring 无法从中找出元数据。

我不得不写一个基本上resources返回一个的副本File;当包裹在里面时,wrap-file-info它满足了我的需求。仍然不介意稍微好一点的解决方案,即不涉及从 Compojure 复制大量代码。