【问题标题】:Stream stdin to a Wai.EventSource将标准输入流式传输到 Wai.EventSource
【发布时间】:2016-05-07 19:28:34
【问题描述】:

我想使用text/event-stream 通过 HTTP 连接流式传输标准输入。 Network.Wai.EventSource 看起来是个不错的候选对象。

我尝试使用此代码:

import Network.Wai
import Network.Wai.EventSource
import Network.Wai.Middleware.AddHeaders
import Network.Wai.Handler.Warp (run)
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as C
import Blaze.ByteString.Builder.ByteString

toEvent :: [L.ByteString] -> ServerEvent
toEvent s = ServerEvent {
    eventName = Nothing,
    eventId = Nothing,
    eventData = map fromLazyByteString s
}

createWaiApp :: IO L.ByteString -> Application
createWaiApp input = eventSourceAppIO $ fmap (toEvent . C.lines) input

main :: IO ()
main = run 1337 $ createWaiApp L.getContents

哪个(我认为)可以:

  • 将标准输入读取为惰性字节流
  • 将 ByteStream 拆分为行
  • 为所有行生成一个 ServerEvent(这感觉不对 - 大概应该有多个事件?)
  • IO ServerEvent 构建一个 WAI 应用程序
  • 将应用程序绑定到端口 1337

当我运行它时(例如使用ping -c 5 example.com | stack exec test-exe),它在读取整个标准输入之前不会响应。

如何构建一个每次从标准输入读取 时刷新 HTTP 连接的 Wai 应用程序?

【问题讨论】:

    标签: haskell haskell-wai haskell-warp


    【解决方案1】:

    L.getContents 是单个 IO 操作,因此只会创建一个事件。

    这是一个创建多个事件的 eventSourcEventAppIO 示例:

    import Blaze.ByteString.Builder.Char8 (fromString)
    ...same imports as above...
    
    nextEvent :: IO ServerEvent
    nextEvent = do
      s <- getLine
      let event = if s == ""
                    then CloseEvent
                    else ServerEvent
                         { eventName = Nothing
                         , eventId = Nothing
                         , eventData = [ fromString s ]
                         }
      case event of
        CloseEvent ->     putStrLn "<close event>"
        ServerEvent _ _ _ -> putStrLn "<server event>"
      return event
    
    main :: IO ()
    main = run 1337 $ eventSourceAppIO nextEvent
    

    为了测试,在一个窗口中启动服务器,在另一个窗口中运行命令curl -v http://localhost:1337。对于您在服务器窗口中输入的每一行,您将从 curl 获得一个数据框。输入空行将关闭 HTTP 连接,但服务器将继续运行,允许您再次连接。

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2019-10-03
      • 2014-07-13
      • 2010-12-13
      • 2020-11-25
      • 1970-01-01
      相关资源
      最近更新 更多