我想使用text/event-stream在HTTP连接上流stdin。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(我认为):
IO ServerEvent构建WAI应用程序当我运行这个程序(例如使用ping -c 5 example.com | stack exec test-exe)时,它在读取完stdin之后才会做出响应。
如何构建一个Wai应用程序,每当HTTP连接从stdin读取一行时就会刷新它?
发布于 2016-05-07 20:15:27
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连接,但服务器将保持运行状态,允许您再次连接到它。
https://stackoverflow.com/questions/37092810
复制相似问题