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
获得了Web.Scotty.Trans.request
;还有与身体相关的流媒体助手。
这也可以记录吗?我相信getRequestBodyChunk
等文档可以通过此信息得到改进。