gpt4 book ai didi

haskell - 如何使用 Snap 框架实现数据流?

转载 作者:行者123 更新时间:2023-12-01 00:56:56 25 4
gpt4 key购买 nike

我想使用 Snap 服务器实现大数据流(双向)。为了探索可能性,我创建了一个示例程序,它有两个端点——读和写。有一个非常简单的内部缓冲区,其中包含一个 ByteString写入端点的任何内容都会出现在读取端点中。 (目前没有办法终止流,但这对于这个目的很好。)

{-# LANGUAGE OverloadedStrings #-}                                           
import Control.Applicative
import Control.Concurrent.MVar.Lifted
import Control.Monad
import Data.ByteString (ByteString)
import Blaze.ByteString.Builder (Builder, fromByteString)
import Data.Enumerator
import qualified Data.Enumerator.List as E
import Data.Enumerator.Binary (enumFile, iterHandle)
import Snap.Core
import Snap.Http.Server

main :: IO ()
main = do
buf <- newEmptyMVar
quickHttpServe (site buf)

site :: MVar ByteString -> Snap ()
site buf =
route [ ("read", modifyResponse (setBufferingMode False
. setResponseBody (fromBuf buf)))
, ("write", runRequestBody (toBuf buf))
]

fromBuf :: MVar ByteString -> Enumerator Builder IO a
fromBuf buf = E.repeatM (liftM fromByteString $ takeMVar buf)

toBuf :: MVar ByteString -> Iteratee ByteString IO ()
toBuf buf = E.mapM_ (putMVar buf)

然后我在不同的终端运行

curl http://localhost:8000/read >/dev/nul



dd if=/dev/zero bs=1M count=100 | \
curl --data-binary @- http://localhost:8000/write

但写入部分失败,并出现转义到顶层的异常:读取的字节数太多。这显然是 TooManyBytesReadException 的一个实例,但我找不到它扔在哪里。写入少量数据(如 1MB)按预期工作。

我的问题是:
  • 在哪里/如何解决阅读限制?
  • 这个流数据会不会在内存中加载整个 POST 请求?如果不是,如何解决?
  • 最佳答案

    如果您添加任何不是 "application/x-www-form-urlencoded" 的内容类型,它将起作用给您的 /write ,例如:

    dd if=/dev/zero bs=1M count=100 | \
    curl -H "Content-Type: application/json" --data-binary @- http://localhost:8000/write

    This bit在 Snap 中执行类似的操作
    if contentType == Just "application/x-www-form-urlencoded" then readData maximumPOSTBodySize
    where
    maximumPOSTBodySize = 10*1024*1024

    x-www-form-urlencoded是 curl 的默认值。

    关于haskell - 如何使用 Snap 框架实现数据流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990975/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com