{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Network.QUIC.Info where import qualified Data.ByteString.Char8 as C8 import qualified Network.Socket as NS import Network.TLS hiding (Version, HandshakeFailed) import Network.QUIC.Connection import Network.QUIC.Connector import Network.QUIC.Imports import Network.QUIC.Types ---------------------------------------------------------------- -- | Information about a connection. data ConnectionInfo = ConnectionInfo { version :: Version , cipher :: Cipher , alpn :: Maybe ByteString , handshakeMode :: HandshakeMode13 , retry :: Bool , localSockAddr :: NS.SockAddr , remoteSockAddr :: NS.SockAddr , localCID :: CID , remoteCID :: CID } -- | Getting information about a connection. getConnectionInfo :: Connection -> IO ConnectionInfo getConnectionInfo conn = do s:_ <- getSockets conn mysa <- NS.getSocketName s peersa <- if isClient conn then do msa <- getServerAddr conn case msa of Nothing -> NS.getPeerName s Just sa -> return sa else NS.getPeerName s mycid <- getMyCID conn peercid <- getPeerCID conn c <- getCipher conn RTT1Level mproto <- getApplicationProtocol conn mode <- getTLSMode conn r <- getRetried conn v <- getVersion conn return ConnectionInfo { version = v , cipher = c , alpn = mproto , handshakeMode = mode , retry = r , localSockAddr = mysa , remoteSockAddr = peersa , localCID = mycid , remoteCID = peercid } instance Show ConnectionInfo where show ConnectionInfo{..} = "Version: " ++ show version ++ "\n" ++ "Cipher: " ++ show cipher ++ "\n" ++ "ALPN: " ++ maybe "none" C8.unpack alpn ++ "\n" ++ "Mode: " ++ show handshakeMode ++ "\n" ++ "Local CID: " ++ show localCID ++ "\n" ++ "Remote CID: " ++ show remoteCID ++ "\n" ++ "Local SockAddr: " ++ show localSockAddr ++ "\n" ++ "Remote SockAddr: " ++ show remoteSockAddr ++ if retry then "\nQUIC retry" else "" ---------------------------------------------------------------- -- | Statistics of a connection. data ConnectionStats = ConnectionStats { txBytes :: Int , rxBytes :: Int } deriving (Eq, Show) -- | Getting statistics of a connection. getConnectionStats :: Connection -> IO ConnectionStats getConnectionStats conn = do tx <- getTxBytes conn rx <- getRxBytes conn return $ ConnectionStats { txBytes = tx , rxBytes = rx }