module Network.WebSockets.Handshake
( HandshakeError (..)
, responseError
, tryFinishRequest
) where
import qualified Data.ByteString as B
import Network.WebSockets.Handshake.Http
import Network.WebSockets.Protocol
import Network.WebSockets.Types
tryFinishRequest :: Protocol p
=> RequestHttpPart
-> Decoder p (Either HandshakeError (Request, p))
tryFinishRequest httpReq = tryInOrder implementations
where
tryInOrder [] = return . Left $ NotSupported
tryInOrder (p : ps) = finishRequest p httpReq >>= \res -> case res of
(Left NotSupported) -> tryInOrder ps
(Left e) -> return (Left e)
(Right req) -> return . Right $ (req, p)
responseError :: forall p. Protocol p => p -> HandshakeError -> Response
responseError _ err = response400 $ case err of
NotSupported -> versionHeader
_ -> []
where
versionHeader = [("Sec-WebSocket-Version",
B.intercalate ", " $ concatMap headerVersions (implementations :: [p]))]