{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Network.QUIC.Types.Info where

import qualified Data.ByteString.Char8 as C8
import qualified Network.Socket as NS
import Network.TLS hiding (HandshakeFailed, Version)

import Network.QUIC.Imports
import Network.QUIC.Types.CID
import Network.QUIC.Types.Packet

----------------------------------------------------------------

-- | Information about a connection.
data ConnectionInfo = ConnectionInfo
    { ConnectionInfo -> Version
version :: Version
    , ConnectionInfo -> Cipher
cipher :: Cipher
    , ConnectionInfo -> Maybe ByteString
alpn :: Maybe ByteString
    , ConnectionInfo -> HandshakeMode13
handshakeMode :: HandshakeMode13
    , ConnectionInfo -> Bool
retry :: Bool
    , ConnectionInfo -> SockAddr
localSockAddr :: NS.SockAddr
    , ConnectionInfo -> SockAddr
remoteSockAddr :: NS.SockAddr
    , ConnectionInfo -> CID
localCID :: CID
    , ConnectionInfo -> CID
remoteCID :: CID
    }

instance Show ConnectionInfo where
    show :: ConnectionInfo -> String
show ConnectionInfo{Bool
Maybe ByteString
SockAddr
Cipher
HandshakeMode13
CID
Version
version :: ConnectionInfo -> Version
cipher :: ConnectionInfo -> Cipher
alpn :: ConnectionInfo -> Maybe ByteString
handshakeMode :: ConnectionInfo -> HandshakeMode13
retry :: ConnectionInfo -> Bool
localSockAddr :: ConnectionInfo -> SockAddr
remoteSockAddr :: ConnectionInfo -> SockAddr
localCID :: ConnectionInfo -> CID
remoteCID :: ConnectionInfo -> CID
version :: Version
cipher :: Cipher
alpn :: Maybe ByteString
handshakeMode :: HandshakeMode13
retry :: Bool
localSockAddr :: SockAddr
remoteSockAddr :: SockAddr
localCID :: CID
remoteCID :: CID
..} =
        String
"Version: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
forall a. Show a => a -> String
show Version
version
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"Cipher: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ Cipher -> String
forall a. Show a => a -> String
show Cipher
cipher
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"ALPN: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> (ByteString -> String) -> Maybe ByteString -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
"none" ByteString -> String
C8.unpack Maybe ByteString
alpn
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"Mode: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ HandshakeMode13 -> String
forall a. Show a => a -> String
show HandshakeMode13
handshakeMode
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"Local CID: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ CID -> String
forall a. Show a => a -> String
show CID
localCID
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"Remote CID: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ CID -> String
forall a. Show a => a -> String
show CID
remoteCID
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"Local SockAddr: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ SockAddr -> String
forall a. Show a => a -> String
show SockAddr
localSockAddr
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\n"
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"Remote SockAddr: "
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ SockAddr -> String
forall a. Show a => a -> String
show SockAddr
remoteSockAddr
            String -> ShowS
forall a. [a] -> [a] -> [a]
++ if Bool
retry then String
"\nQUIC retry" else String
""