From 3adfdf1ae27cd4b6419ce5be14ffb3712339065a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Apr 2017 15:14:03 -0400 Subject: add framing protocol for websockets --- SessionID.hs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'SessionID.hs') diff --git a/SessionID.hs b/SessionID.hs index 8bf8f7d..449f58c 100644 --- a/SessionID.hs +++ b/SessionID.hs @@ -14,9 +14,6 @@ import System.FilePath import System.IO import System.Directory import Network.Wai.Handler.Warp (Port) -import Network.WebSockets hiding (Message) -import qualified Data.Aeson -import Data.Maybe import Data.List import Data.UUID import Data.UUID.V4 @@ -28,17 +25,15 @@ import Control.Exception newtype SessionID = SessionID FilePath deriving (Show, Eq, Ord, Generic) +-- | Custom JSON deserialization so we can check smart constructor +-- to verify it's legal. +instance FromJSON SessionID where + parseJSON v = verify =<< genericParseJSON defaultOptions v + where + verify (SessionID unverified) = + maybe (fail "illegal SessionID") return + (mkSessionID unverified) instance ToJSON SessionID -instance FromJSON SessionID - -instance WebSocketsData SessionID where - -- fromDataMessage = fromLazyByteString . fromDataMessage - fromLazyByteString b = - -- Down't trust a legal SessionID to be deserialized; - -- use smart constructor to verify it's legal. - let SessionID unverified = fromMaybe (error "bad SessionID serialization") (Data.Aeson.decode b) - in fromMaybe (error "illegal SessionID") (mkSessionID unverified) - toLazyByteString = Data.Aeson.encode -- | Smart constructor that enforces legal SessionID contents. -- -- cgit v1.2.3