Я хотел бы передать stdin через HTTP-соединение, используя text/event-stream
. Вещь Network.Wai.EventSource выглядит как хороший кандидат.Поток stdin к 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
Which (я думаю) делает:
- читает стандартный ввод как Ленивые потокового
- расщепляет потоковый в линию
- производящей один ServerEvent для всех строк (это кажется неправильным - должно быть, должно быть, несколько событий?)
- Builds Заявка на WAI из
IO ServerEvent
- Персонального приложение к порту 1337
При запуске этого (например, используя ping -c 5 example.com | stack exec test-exe
), он не отвечает, пока не будет прочитан весь stdin.
Как создать приложение Wai, которое очищает HTTP-соединение каждый раз, когда он читает строку от stdin?