依赖版本
- 围:
3.2.2.1
概要
我很不清楚getRequestBodyChunk
(https://hackage.haskell.org/package/wai-3.2.2.1/docs/Network-Wai.html#v:getRequestBodyChunk )的工作。我知道它会读取请求中可用的下一个字节块;最后产生一个Data.ByteString.empty
指示没有更多可用字节。
因此,给定一个req :: Request
; 我正在尝试Conduit
从请求正文创建一个:
streamBody :: Wai.Request -> ConduitM () ByteString IO ()
streamBody req = repeatWhileMC (Wai.getRequestBodyChunk) (Data.ByteString.empty /=)
但是,这似乎立即终止,因为我已经看到跟踪输出:
repeatWhileMC (traceShowId <$> Wai.getRequestBodyChunk req) (traceShowId . (Data.ByteString.empty /=))
输出是
""
False
因此流终止。
但是我可以通过其他方式验证请求正文不为空。
所以我对此有点困惑,我有几个问题:
这是否意味着请求正文已经被消费了?
或者这是否意味着请求正文没有被分块?
或者这是否意味着对于较小的请求?分块字节总是空的?
Scotty 是否覆盖了这一点,特别是对于较小的请求(我似乎无法在其代码/文档中的任何地方找到它。)
如果我做这样的事情:
streamBody req =
let req' = req { requestBody = pure "foobar" }
in repeatWhileMC (Wai.getRequestBodyChunk req') (Data.ByteString.empty /=)
我确实得到了一个非终止的字节流;这使我怀疑这部分代码之前的某些内容消耗了请求正文:或者该函数返回一个空正文开始。
需要注意的一点是,这似乎只发生在较小的请求中。
另一点需要注意的是,我得到了Wai.Request
via Web.Scotty.Trans.request
;其中也有与身体相关的流媒体助手。
这也可以记录在案吗?我相信getRequestBodyChunk
这些信息可以改进 etc. 的文档。