File: Entry.hs

package info (click to toggle)
haskell-http2 5.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 55,180 kB
  • sloc: haskell: 8,657; makefile: 5
file content (101 lines) | stat: -rw-r--r-- 2,397 bytes parent folder | download
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