{-# LANGUAGE PatternSynonyms #-} module Network.HTTP3.Settings where import Network.ByteOrder import Network.QUIC.Internal type H3Settings = [(H3SettingsKey,Int)] newtype H3SettingsKey = H3SettingsKey Int deriving (H3SettingsKey -> H3SettingsKey -> Bool (H3SettingsKey -> H3SettingsKey -> Bool) -> (H3SettingsKey -> H3SettingsKey -> Bool) -> Eq H3SettingsKey forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: H3SettingsKey -> H3SettingsKey -> Bool $c/= :: H3SettingsKey -> H3SettingsKey -> Bool == :: H3SettingsKey -> H3SettingsKey -> Bool $c== :: H3SettingsKey -> H3SettingsKey -> Bool Eq, Int -> H3SettingsKey -> ShowS [H3SettingsKey] -> ShowS H3SettingsKey -> String (Int -> H3SettingsKey -> ShowS) -> (H3SettingsKey -> String) -> ([H3SettingsKey] -> ShowS) -> Show H3SettingsKey forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [H3SettingsKey] -> ShowS $cshowList :: [H3SettingsKey] -> ShowS show :: H3SettingsKey -> String $cshow :: H3SettingsKey -> String showsPrec :: Int -> H3SettingsKey -> ShowS $cshowsPrec :: Int -> H3SettingsKey -> ShowS Show) pattern SettingsQpackMaxTableCapacity :: H3SettingsKey pattern $bSettingsQpackMaxTableCapacity :: H3SettingsKey $mSettingsQpackMaxTableCapacity :: forall r. H3SettingsKey -> (Void# -> r) -> (Void# -> r) -> r SettingsQpackMaxTableCapacity = H3SettingsKey 0x1 pattern SettingsMaxFieldSectionSize :: H3SettingsKey pattern $bSettingsMaxFieldSectionSize :: H3SettingsKey $mSettingsMaxFieldSectionSize :: forall r. H3SettingsKey -> (Void# -> r) -> (Void# -> r) -> r SettingsMaxFieldSectionSize = H3SettingsKey 0x6 pattern SettingsQpackBlockedStreams :: H3SettingsKey pattern $bSettingsQpackBlockedStreams :: H3SettingsKey $mSettingsQpackBlockedStreams :: forall r. H3SettingsKey -> (Void# -> r) -> (Void# -> r) -> r SettingsQpackBlockedStreams = H3SettingsKey 0x7 encodeH3Settings :: H3Settings -> IO ByteString encodeH3Settings :: H3Settings -> IO ByteString encodeH3Settings H3Settings kvs = Int -> (WriteBuffer -> IO ()) -> IO ByteString withWriteBuffer Int 128 ((WriteBuffer -> IO ()) -> IO ByteString) -> (WriteBuffer -> IO ()) -> IO ByteString forall a b. (a -> b) -> a -> b $ \WriteBuffer wbuf -> do ((H3SettingsKey, Int) -> IO ()) -> H3Settings -> IO () forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => (a -> m b) -> t a -> m () mapM_ (WriteBuffer -> (H3SettingsKey, Int) -> IO () forall a. Integral a => WriteBuffer -> (H3SettingsKey, a) -> IO () enc WriteBuffer wbuf) H3Settings kvs where enc :: WriteBuffer -> (H3SettingsKey, a) -> IO () enc WriteBuffer wbuf (H3SettingsKey Int k,a v) = do WriteBuffer -> Int64 -> IO () encodeInt' WriteBuffer wbuf (Int64 -> IO ()) -> Int64 -> IO () forall a b. (a -> b) -> a -> b $ Int -> Int64 forall a b. (Integral a, Num b) => a -> b fromIntegral Int k WriteBuffer -> Int64 -> IO () encodeInt' WriteBuffer wbuf (Int64 -> IO ()) -> Int64 -> IO () forall a b. (a -> b) -> a -> b $ a -> Int64 forall a b. (Integral a, Num b) => a -> b fromIntegral a v decodeH3Settings :: ByteString -> IO H3Settings decodeH3Settings :: ByteString -> IO H3Settings decodeH3Settings ByteString bs = ByteString -> (ReadBuffer -> IO H3Settings) -> IO H3Settings forall a. ByteString -> (ReadBuffer -> IO a) -> IO a withReadBuffer ByteString bs ((ReadBuffer -> IO H3Settings) -> IO H3Settings) -> (ReadBuffer -> IO H3Settings) -> IO H3Settings forall a b. (a -> b) -> a -> b $ \ReadBuffer rbuf -> ReadBuffer -> (H3Settings -> H3Settings) -> IO H3Settings forall b c. Num b => ReadBuffer -> ([(H3SettingsKey, b)] -> c) -> IO c loop ReadBuffer rbuf H3Settings -> H3Settings forall a. a -> a id where dec :: ReadBuffer -> IO (H3SettingsKey, b) dec ReadBuffer rbuf = do H3SettingsKey k <- Int -> H3SettingsKey H3SettingsKey (Int -> H3SettingsKey) -> (Int64 -> Int) -> Int64 -> H3SettingsKey forall b c a. (b -> c) -> (a -> b) -> a -> c . Int64 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral (Int64 -> H3SettingsKey) -> IO Int64 -> IO H3SettingsKey forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ReadBuffer -> IO Int64 decodeInt' ReadBuffer rbuf b v <- Int64 -> b forall a b. (Integral a, Num b) => a -> b fromIntegral (Int64 -> b) -> IO Int64 -> IO b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ReadBuffer -> IO Int64 decodeInt' ReadBuffer rbuf (H3SettingsKey, b) -> IO (H3SettingsKey, b) forall (m :: * -> *) a. Monad m => a -> m a return (H3SettingsKey k,b v) loop :: ReadBuffer -> ([(H3SettingsKey, b)] -> c) -> IO c loop ReadBuffer rbuf [(H3SettingsKey, b)] -> c build = do Int r <- ReadBuffer -> IO Int forall a. Readable a => a -> IO Int remainingSize ReadBuffer rbuf if Int r Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Int 0 then c -> IO c forall (m :: * -> *) a. Monad m => a -> m a return (c -> IO c) -> c -> IO c forall a b. (a -> b) -> a -> b $ [(H3SettingsKey, b)] -> c build [] else do (H3SettingsKey, b) kv <- ReadBuffer -> IO (H3SettingsKey, b) forall b. Num b => ReadBuffer -> IO (H3SettingsKey, b) dec ReadBuffer rbuf ReadBuffer -> ([(H3SettingsKey, b)] -> c) -> IO c loop ReadBuffer rbuf ([(H3SettingsKey, b)] -> c build ([(H3SettingsKey, b)] -> c) -> ([(H3SettingsKey, b)] -> [(H3SettingsKey, b)]) -> [(H3SettingsKey, b)] -> c forall b c a. (b -> c) -> (a -> b) -> a -> c . ((H3SettingsKey, b) kv (H3SettingsKey, b) -> [(H3SettingsKey, b)] -> [(H3SettingsKey, b)] forall a. a -> [a] -> [a] :))