无法使用`requestBody`(或`getRequestBodyChunk`)

时间:2020-07-01 09:24:53

标签: haskell scotty wai

依赖版本

  • Wai: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.Request获得了Web.Scotty.Trans.request;还有与身体相关的流媒体助手。

这也可以记录吗?我相信getRequestBodyChunk等文档可以通过此信息得到改进。

0 个答案:

没有答案