packages feed

wai-websockets-0.5.0: Network/Wai/Handler/WebSockets.hs

{-# LANGUAGE OverloadedStrings #-}
module Network.Wai.Handler.WebSockets
    ( intercept
    ) where

import Network.Wai (Request, requestHeaders, rawPathInfo, requestHeaders)
import Network.Socket (Socket)
import Data.Char (toLower)
import Data.Enumerator (Iteratee)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as S
import Network.WebSockets (WebSockets, runWebSockets, RequestHttpPart(RequestHttpPart), Protocol)
import qualified Network.WebSockets as WS
import Network.Socket.Enumerator (iterSocket)

intercept :: Protocol p
          => (WS.Request -> WebSockets p ())
          -> Request
          -> Maybe (Socket -> Iteratee ByteString IO ())
intercept app req =
    case lookup "upgrade" $ requestHeaders req of
        Just s | S.map toLower s=="websocket" -> Just $ \socket -> do
            runWebSockets req' app (iterSocket socket)
        _ -> Nothing
  where
    req' = RequestHttpPart (rawPathInfo req) (requestHeaders req)