1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
{-# LANGUAGE OverloadedStrings #-}
module Network.HPACK.Table.Entry (
-- * Type
Size,
Entry (..),
Header, -- re-exporting
HeaderName, -- re-exporting
HeaderValue, -- re-exporting
Index, -- re-exporting
-- * Header and Entry
toEntry,
toEntryToken,
-- * Getters
entrySize,
entryTokenHeader,
entryToken,
entryHeaderName,
entryHeaderValue,
-- * For initialization
dummyEntry,
maxNumbers,
) where
import qualified Data.ByteString as BS
import Network.HPACK.Token
import Network.HPACK.Types
----------------------------------------------------------------
-- | Size in bytes.
type Size = Int
-- | Type for table entry. Size includes the 32 bytes magic number.
data Entry = Entry Size Token HeaderValue deriving (Show)
----------------------------------------------------------------
headerSizeMagicNumber :: Size
headerSizeMagicNumber = 32
headerSize :: Header -> Size
headerSize (k, v) =
BS.length k
+ BS.length v
+ headerSizeMagicNumber
headerSize' :: Token -> HeaderValue -> Size
headerSize' t v =
BS.length (tokenFoldedKey t)
+ BS.length v
+ headerSizeMagicNumber
----------------------------------------------------------------
-- | From 'Header' to 'Entry'.
toEntry :: Header -> Entry
toEntry kv@(k, v) = Entry siz t v
where
t = toToken k
siz = headerSize kv
toEntryToken :: Token -> HeaderValue -> Entry
toEntryToken t v = Entry siz t v
where
siz = headerSize' t v
----------------------------------------------------------------
-- | Getting the size of 'Entry'.
entrySize :: Entry -> Size
entrySize (Entry siz _ _) = siz
-- | Getting 'TokenHeader'.
entryTokenHeader :: Entry -> TokenHeader
entryTokenHeader (Entry _ t v) = (t, v)
-- | Getting 'Token'.
entryToken :: Entry -> Token
entryToken (Entry _ t _) = t
-- | Getting 'HeaderName'.
entryHeaderName :: Entry -> HeaderName
entryHeaderName (Entry _ t _) = tokenFoldedKey t
-- | Getting 'HeaderValue'.
entryHeaderValue :: Entry -> HeaderValue
entryHeaderValue (Entry _ _ v) = v
----------------------------------------------------------------
-- | Dummy 'Entry' to initialize a dynamic table.
dummyEntry :: Entry
dummyEntry = Entry 0 tokenMax "dummyValue"
-- | How many entries can be stored in a dynamic table?
maxNumbers :: Size -> Int
maxNumbers siz = siz `div` headerSizeMagicNumber
|