http - 如何使用 Compojure 生成修改后的 http header ?

标签 http clojure http-headers compojure

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

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

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

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

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

最佳答案

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

我基本上不得不编写一份 resources 的副本,它返回一个 File;当包裹在满足我需要的 wrap-file-info 中时。仍然不介意不涉及从 Compojure 复制一大块代码的稍微更好的解决方案。

关于http - 如何使用 Compojure 生成修改后的 http header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119490/

相关文章:

azure - 检查 Azure API 管理中的 Traceparent http header 的正确性

HTTP If-Modified-Since 以毫秒为单位

constructor - 使用 defrecord 构造函数调用 apply?

clojure - 创建 HashMap Clojure

clojure - 解决 Clojure 循环依赖

jquery - 将自定义 http header 添加到所有 jQuery AJAX 请求

java - 在 SOAP 消息处理程序内的 HTTP header 中设置自定义 cookie

json - 使用 go 发送 JSON

http - RESTfully 实现包含元的多对​​多关系的最佳方式是什么?

http - 拆分http请求头在golang http包中有意义吗?