2
當HTTP客戶端斷開連接(或其他現實世界發生)時無法弄清楚如何清理。我試圖把我的Source
換成addCleanup
,但它沒有被調用。WAI/Warp ResponseSource清理
這裏是我的infinte來源串流字節串的小例子:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8()
import Control.Monad
import Control.Monad.Trans
import Control.Concurrent (threadDelay)
import Data.Conduit
import Blaze.ByteString.Builder (Builder)
import qualified Blaze.ByteString.Builder.ByteString as BBBB
import qualified Data.ByteString.Char8 as BS
stream :: Source (ResourceT IO) (Flush Builder)
stream = addCleanup (\_ -> liftIO $ putStrLn "cleanup.") $ do
liftIO $ putStrLn "source started."
yield Flush
forever $ do
yield $ bchunk "whatever"
yield Flush
liftIO $ threadDelay 10000
app :: Application
app req = do
liftIO $ putStrLn "in the handler."
return $ ResponseSource status200 [("Content-Type", "text/plain")] stream
main :: IO()
main = run 3000 app
bchunk = Chunk . BBBB.fromByteString . BS.pack
當我與一個http請求打它,「啓動」的告示出現和stream
開始puring數據。但是,我關閉連接後,沒有「清理」。消息出現,並且沒有執行任何操作,從而泄漏實際代碼中的資源