1

依赖版本

  • 围:3.2.2.1

概要

我很不清楚getRequestBodyChunkhttps://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.Requestvia Web.Scotty.Trans.request;其中也有与身体相关的流媒体助手。

这也可以记录在案吗?我相信getRequestBodyChunk这些信息可以改进 etc. 的文档。

4

0 回答 0