quic-0.2.13: Network/QUIC/Types/Resumption.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RecordWildCards #-}
module Network.QUIC.Types.Resumption where
import Codec.Serialise
import GHC.Generics
import Network.TLS hiding (Version)
import Network.TLS.QUIC
import Network.QUIC.Types.Frame
import Network.QUIC.Types.Packet
type SessionEstablish = SessionID -> SessionData -> IO (Maybe Ticket)
-- | Information about resumption
data ResumptionInfo = ResumptionInfo
{ resumptionVersion :: Version
, resumptionSession :: [(SessionID, SessionData)]
, resumptionToken :: Token
, resumptionRetry :: Bool
, resumptionActiveConnectionIdLimit :: Int
, resumptionInitialMaxData :: Int
, resumptionInitialMaxStreamDataBidiLocal :: Int
, resumptionInitialMaxStreamDataBidiRemote :: Int
, resumptionInitialMaxStreamDataUni :: Int
, resumptionInitialMaxStreamsBidi :: Int
, resumptionInitialMaxStreamsUni :: Int
}
deriving (Eq, Show, Generic)
instance Serialise ResumptionInfo
defaultResumptionInfo :: ResumptionInfo
defaultResumptionInfo =
ResumptionInfo
{ resumptionVersion = Version1
, resumptionSession = []
, resumptionToken = emptyToken
, resumptionRetry = False
, resumptionActiveConnectionIdLimit = 2 -- see baseParameters
, resumptionInitialMaxData = 0
, resumptionInitialMaxStreamDataBidiLocal = 0
, resumptionInitialMaxStreamDataBidiRemote = 0
, resumptionInitialMaxStreamDataUni = 0
, resumptionInitialMaxStreamsBidi = 0
, resumptionInitialMaxStreamsUni = 0
}
-- | Is 0RTT possible?
is0RTTPossible :: ResumptionInfo -> Bool
is0RTTPossible ResumptionInfo{..} =
rtt0OK && (not resumptionRetry || resumptionToken /= emptyToken)
where
rtt0OK =
any
(\(_, sd) -> sessionMaxEarlyDataSize sd == quicMaxEarlyDataSize)
resumptionSession
-- | Is resumption possible?
isResumptionPossible :: ResumptionInfo -> Bool
isResumptionPossible ResumptionInfo{..} = not $ null resumptionSession