module Network.WebSockets.Handshake
( HandshakeError (..)
, handshake
, responseError
) where
import Data.List (find)
import qualified Data.ByteString as B
import qualified Data.Enumerator as E
import Network.WebSockets.Handshake.Http
import Network.WebSockets.Protocol
handshake :: (Monad m, Protocol p)
=> RequestHttpPart
-> E.Iteratee B.ByteString m (Request, p)
handshake rhp = case find (flip supported rhp) implementations of
Nothing -> E.throwError NotSupported
Just p -> do
rq <- finishRequest p rhp
return (rq, p)
responseError :: forall p. Protocol p => p -> HandshakeError -> ResponseBody
responseError _ err = response400 $ case err of
NotSupported -> versionHeader
_ -> []
where
versionHeader = [("Sec-WebSocket-Version",
B.intercalate ", " $ concatMap headerVersions (implementations :: [p]))]