1{-# LANGUAGE DeriveDataTypeable #-}
2
3module Network.HPACK.Types (
4  -- * Header
5    HeaderName
6  , HeaderValue
7  , HeaderStuff
8  , Header
9  , HeaderList
10  , TokenHeader
11  , TokenHeaderList
12  -- * Misc
13  , Index
14  , HIndex(..)
15  -- * Encoding and decoding
16  , CompressionAlgo(..)
17  , EncodeStrategy(..)
18  , defaultEncodeStrategy
19  , DecodeError(..)
20  -- * Buffer
21  , Buffer
22  , BufferSize
23  , BufferOverrun(..)
24  ) where
25
26import Control.Exception as E
27import Data.Typeable
28import Network.ByteOrder (Buffer, BufferSize, BufferOverrun(..))
29
30import Imports
31import Network.HPACK.Token (Token)
32
33----------------------------------------------------------------
34
35-- | Header name.
36type HeaderName = ByteString
37
38-- | Header value.
39type HeaderValue = ByteString
40
41-- | Header.
42type Header = (HeaderName, HeaderValue)
43
44-- | Header list.
45type HeaderList = [Header]
46
47-- | To be a 'HeaderName' or 'HeaderValue'.
48type HeaderStuff = ByteString
49
50-- | TokenBased header.
51type TokenHeader = (Token, HeaderValue)
52
53-- | TokenBased header list.
54type TokenHeaderList = [TokenHeader]
55
56----------------------------------------------------------------
57
58-- | Index for table.
59type Index = Int
60
61data HIndex = SIndex Int | DIndex Int deriving (Eq, Ord, Show)
62
63----------------------------------------------------------------
64
65-- | Compression algorithms for HPACK encoding.
66data CompressionAlgo = Naive  -- ^ No compression
67                     | Static -- ^ Using indices in the static table only
68                     | Linear -- ^ Using indices
69                     deriving (Eq, Show)
70
71-- | Strategy for HPACK encoding.
72data EncodeStrategy = EncodeStrategy {
73  -- | Which compression algorithm is used.
74    compressionAlgo :: !CompressionAlgo
75  -- | Whether or not to use Huffman encoding for strings.
76  , useHuffman :: !Bool
77  } deriving (Eq, Show)
78
79-- | Default 'EncodeStrategy'.
80--
81-- >>> defaultEncodeStrategy
82-- EncodeStrategy {compressionAlgo = Linear, useHuffman = False}
83defaultEncodeStrategy :: EncodeStrategy
84defaultEncodeStrategy = EncodeStrategy {
85    compressionAlgo = Linear
86  , useHuffman = False
87  }
88
89----------------------------------------------------------------
90
91-- | Errors for decoder.
92data DecodeError = IndexOverrun Index -- ^ Index is out of range
93                 | EosInTheMiddle -- ^ Eos appears in the middle of huffman string
94                 | IllegalEos -- ^ Non-eos appears in the end of huffman string
95                 | TooLongEos -- ^ Eos of huffman string is more than 7 bits
96                 | EmptyEncodedString -- ^ Encoded string has no length
97                 | TooSmallTableSize -- ^ A peer set the dynamic table size less than 32
98                 | TooLargeTableSize -- ^ A peer tried to change the dynamic table size over the limit
99                 | IllegalTableSizeUpdate -- ^ Table size update at the non-beginning
100                 | HeaderBlockTruncated
101                 | IllegalHeaderName
102                 deriving (Eq,Show,Typeable)
103
104instance Exception DecodeError
105