已阅读时读取环请求正文

Jef*_*.D. 11 clojure ring

我的问题是,如果已经读取了Ring请求,我怎么能惯用它?

这是背景.我正在为Ring应用程序编写错误处理程序.发生错误时,我想记录错误,包括我可能需要重现的所有相关信息并修复错误.一个重要的信息是请求的主体.但是,:body值的有状态(因为它是一种java.io.InputStream对象)会导致问题.

具体来说,会发生一些中间件(ring.middleware.json/wrap-json-body在我的情况下是中间件)slurp在body InputStream对象上执行a ,这会更改对象的内部状态,以便将来调用slurp返回空字符串.因此,从请求图中有效地丢失了[内容].

我能想到的唯一解决方案是InputStream在可以读取正文之前抢先复制正文对象,以防我以后可能需要它.我不喜欢这种方法,因为在以后可能出现错误的情况下,对每个请求做一些工作似乎很笨拙.有更好的方法吗?

noi*_*ith 5

我有一个吸收身体的库,用相同内容的流替换它,并存储原件,以便以后可以放气.

土拨鼠

这对于无限期打开的流是不够的,如果正文是上传某个大对象,那么这是一个坏主意.但它有助于测试和重新创建错误条件作为调试过程的一部分.

如果您只需要流的副本,则可以使用groundhog中的tee-stream函数作为您自己的中间件的基础.