首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流stdin到Wai.EventSource

流stdin到Wai.EventSource
EN

Stack Overflow用户
提问于 2016-05-07 19:28:34
回答 1查看 147关注 0票数 0

我想使用text/event-stream在HTTP连接上流stdin。Network.Wai.EventSource这件事看起来是个不错的候选人。

我试过使用以下代码:

代码语言:javascript
复制
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

(我认为):

  • 将stdin读入为延迟的ByteStream
  • 将ByteStream拆分成行
  • 为所有行生成一个ServerEvent (这感觉不对--应该有多个事件?)
  • IO ServerEvent构建WAI应用程序
  • 将应用程序绑定到端口1337

当我运行这个程序(例如使用ping -c 5 example.com | stack exec test-exe)时,它在读取完stdin之后才会做出响应。

如何构建一个Wai应用程序,每当HTTP连接从stdin读取一行时就会刷新它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-07 20:15:27

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

下面是创建多个事件的eventSourcEventAppIO示例:

代码语言:javascript
复制
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连接,但服务器将保持运行状态,允许您再次连接到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37092810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档