packages feed

ghcjs-base-stub-0.3.0.1: ghcjs-base/test/server/Main.hs

{-# LANGUAGE OverloadedStrings #-}

{-
    Server for testing WebSocket and XHR functionality
      GET  requests:
      POST requests:
 -}
module Main where

import Control.Monad

import qualified Control.Exception as E

import qualified Network.WebSockets as WS
import qualified Network.Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.Wai.Handler.WebSockets as WaiWS
import qualified Network.Wai.Application.Static as Static

import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Encoding as TE
import qualified Data.Text.Lazy.Encoding as TLE

main :: IO ()
main = Warp.runSettings Warp.defaultSettings
         { Warp.settingsPort = 3001
         } $ WaiWS.websocketsOr WS.defaultConnectionOptions handleWebSocket handleStatic

handleStatic :: Network.Wai.Application
handleStatic = Static.staticApp (Static.defaultFileServerSettings ".")

handleWebSocket :: WS.ServerApp
handleWebSocket pending = do
  putStrLn "accepting WebSocket request"
  conn <- WS.acceptRequest pending
  let handleMessages = forever $ do
        d <- WS.receiveDataMessage conn
        case d of
          WS.Text t    -> do
            putStrLn "received text message"
            case reads . TL.unpack . TLE.decodeUtf8 $ t of
             [(i, [])] -> case i of
                            0         -> do
                                 putStrLn "closing connection"
                                 WS.sendClose conn (""::T.Text)
                            _ | i < 0 -> replicateM_ (negate i) $
                                 WS.sendDataMessage conn (WS.Text "TestTextMessage")
                            _         -> replicateM_ i $
                                 WS.sendDataMessage conn (WS.Binary "TestBinaryMessage")
             _         -> putStrLn "received non-numeric message"
          WS.Binary bs -> do
            putStrLn "received binary message"
      handleConnectionException :: WS.ConnectionException -> IO ()
      handleConnectionException e = print e
  handleMessages `E.catch` handleConnectionException