Network.HPACK.Internal

http2-5.3.9: HTTP/2 library

Safe Haskell | None
Language | Haskell2010

Network.HPACK.Internal

Contents

- Integer encoding/decoding
- String encoding/decoding
- Types

Synopsis

- encodeI :: WriteBuffer -> (Word8 -> Word8) -> Int -> Int -> IO ()
- encodeInteger :: Int -> Int -> IO ByteString
- decodeI :: Int -> Word8 -> ReadBuffer -> IO Int
- decodeInteger :: Int -> Word8 -> ByteString -> IO Int
- encodeString :: Bool -> ByteString -> IO ByteString
- encodeS :: WriteBuffer -> Bool -> (Word8 -> Word8) -> (Word8 -> Word8) -> Int -> ByteString -> IO ()
- decodeString :: ReadBuffer -> IO ByteString
- toTokenHeaderTable :: [Header] -> IO TokenHeaderTable
- decodeS :: (Word8 -> Word8) -> (Word8 -> Bool) -> Int -> HuffmanDecoder -> ReadBuffer -> IO ByteString
- decodeSimple :: (Word8 -> ReadBuffer -> IO TokenHeader) -> ReadBuffer -> IO [Header]
- decodeSophisticated :: (Word8 -> ReadBuffer -> IO TokenHeader) -> ReadBuffer -> IO TokenHeaderTable
- type GCBuffer = ForeignPtr Word8
- encodeH :: WriteBuffer -> ByteString -> IO Int
- encodeHuffman :: ByteString -> IO ByteString
- decodeH :: GCBuffer -> BufferSize -> ReadBuffer -> Int -> IO ByteString
- decodeHuffman :: ByteString -> IO ByteString
- type HuffmanDecoder = ReadBuffer -> Int -> IO ByteString
- decH :: WriteBuffer -> ReadBuffer -> Int -> IO ()
- type Size = Int
- type FieldValue = ByteString
- type Index = Int
- data Entry = Entry Size Token FieldValue
- toEntry :: Header -> Entry
- toEntryToken :: Token -> FieldValue -> Entry
- entrySize :: Entry -> Size
- entryTokenHeader :: Entry -> TokenHeader
- entryToken :: Entry -> Token
- entryHeaderName :: Entry -> HeaderName
- entryFieldValue :: Entry -> FieldValue
- dummyEntry :: Entry
- maxNumbers :: Size -> Int
- data CompressionAlgo
  - = Naive
  - | Static
  - | Linear
- data EncodeStrategy = EncodeStrategy {
  - compressionAlgo :: CompressionAlgo
  - useHuffman :: Bool
  }

# Integer encoding/decoding

encodeI #

Arguments

:: WriteBuffer |
-> (Word8 -> Word8) | Setting prefix
-> Int | N+
-> Int | Target
-> IO () |

Integer encoding with a write buffer.

encodeInteger #

Arguments

:: Int | N+
-> Int | Target
-> IO ByteString |

Encoding integer with a temporary buffer whose size is 4096. No prefix is set.

    >>> BS.unpack <$> encodeInteger 5 10
    [10]
    >>> BS.unpack <$> encodeInteger 5 1337
    [31,154,10]
    >>> BS.unpack <$> encodeInteger 8 42
    [42]

decodeI #

Arguments

:: Int | N+
-> Word8 | The head of encoded integer whose prefix is already dropped
-> ReadBuffer |
-> IO Int |

Integer decoding with a read buffer. The first argument is N of prefix.

decodeInteger #

Arguments

:: Int | N+
-> Word8 | The head of encoded integer whose prefix is already dropped
-> ByteString | The tail of encoded integer
-> IO Int |

Integer decoding. The first argument is N of prefix.

    >>> decodeInteger 5 10 $ BS.empty
    10
    >>> decodeInteger 5 31 $ BS.pack [154,10]
    1337
    >>> decodeInteger 8 42 $ BS.empty
    42

# String encoding/decoding

encodeString #

Arguments

:: Bool | Use Huffman if efficient
-> ByteString | Target
-> IO ByteString |

String encoding (7+) with a temporary buffer whose size is 4096.

encodeS #

Arguments

:: WriteBuffer |
-> Bool | Use Huffman if efficient
-> (Word8 -> Word8) | Setting prefix
-> (Word8 -> Word8) | Setting huffman flag
-> Int | N+
-> ByteString | Target
-> IO () |

String encoding. The algorithm based on copy avoidance and selection of better result of huffman or raw.

decodeString :: ReadBuffer -> IO ByteString #

String decoding (7+) with a temporal Huffman decoder whose buffer is 4096.

toTokenHeaderTable :: [Header] -> IO TokenHeaderTable #

Converting a header list of the http-types style to `TokenHeaderList` and `ValueTable`.

decodeS #

Arguments

:: (Word8 -> Word8) | Dropping prefix and Huffman
-> (Word8 -> Bool) | Checking Huffman flag
-> Int | N+
-> HuffmanDecoder |
-> ReadBuffer |
-> IO ByteString |

String decoding with Huffman decoder.

decodeSimple :: (Word8 -> ReadBuffer -> IO TokenHeader) -> ReadBuffer -> IO [Header] #

Converting to '[Header]'.

- Headers are decoded as is.
- `DecodeError` would be thrown if the HPACK format is broken.
- `BufferOverrun` will be thrown if the temporary buffer for Huffman decoding is too small.

decodeSophisticated :: (Word8 -> ReadBuffer -> IO TokenHeader) -> ReadBuffer -> IO TokenHeaderTable #

Converting to `TokenHeaderList` and `ValueTable`.

- Multiple values of Cookie: are concatenated.
- If a pseudo header appears multiple times, `IllegalHeaderName` is thrown.
- If unknown pseudo headers appear, `IllegalHeaderName` is thrown.
- If pseudo headers are found after normal headers, `IllegalHeaderName` is thrown.
- If a header key contains capital letters, `IllegalHeaderName` is thrown.
- If the number of header fields is too large, `TooLargeHeader` is thrown
- `DecodeError` would be thrown if the HPACK format is broken.
- `BufferOverrun` will be thrown if the temporary buffer for Huffman decoding is too small.

type GCBuffer = ForeignPtr Word8 #

encodeH #

Arguments

:: WriteBuffer |
-> ByteString | Target
-> IO Int | The length of the encoded string.

Huffman encoding.

encodeHuffman :: ByteString -> IO ByteString #

Huffman encoding with a temporary buffer whose size is 4096.

decodeH #

Arguments

:: GCBuffer | A working space
-> BufferSize |
-> ReadBuffer | A read buffer which contains the target
-> Int | The target length
-> IO ByteString |

Huffman decoding.

decodeHuffman :: ByteString -> IO ByteString #

Huffman decoding with a temporary buffer whose size is 4096.

type HuffmanDecoder = ReadBuffer -> Int -> IO ByteString #

Huffman decoding.

decH :: WriteBuffer -> ReadBuffer -> Int -> IO () #

Low devel Huffman decoding in a write buffer.

type Size = Int #

Size in bytes.

type FieldValue = ByteString #

Field value.

type Index = Int #

Index for table.

data Entry #

Type for table entry. Size includes the 32 bytes magic number.

Constructors

Entry Size Token FieldValue |

#### Instances

Instances details

Show Entry # |
Instance details Defined in Network.HPACK.Table.Entry Methods showsPrec :: Int -> Entry -> ShowS # show :: Entry -> String # showList :: [Entry] -> ShowS #

toEntry :: Header -> Entry #

From `Header` to `Entry`.

toEntryToken :: Token -> FieldValue -> Entry #

entrySize :: Entry -> Size #

Getting the size of `Entry`.

entryTokenHeader :: Entry -> TokenHeader #

Getting `TokenHeader`.

entryToken :: Entry -> Token #

Getting `Token`.

entryHeaderName :: Entry -> HeaderName #

Getting `HeaderName`.

entryFieldValue :: Entry -> FieldValue #

Getting `FieldValue`.

dummyEntry :: Entry #

Dummy `Entry` to initialize a dynamic table.

maxNumbers :: Size -> Int #

How many entries can be stored in a dynamic table?

# Types

data CompressionAlgo #

Compression algorithms for HPACK encoding.

Constructors

Naive | No compression
Static | Using indices in the static table only
Linear | Using indices

#### Instances

Instances details

Show CompressionAlgo # |
Instance details Defined in Network.HPACK.Types Methods showsPrec :: Int -> CompressionAlgo -> ShowS # show :: CompressionAlgo -> String # showList :: [CompressionAlgo] -> ShowS #
Eq CompressionAlgo # |
Instance details Defined in Network.HPACK.Types Methods (==) :: CompressionAlgo -> CompressionAlgo -> Bool # (/=) :: CompressionAlgo -> CompressionAlgo -> Bool #

data EncodeStrategy #

Strategy for HPACK encoding.

Constructors

EncodeStrategy |
Fields compressionAlgo :: CompressionAlgo Which compression algorithm is used. useHuffman :: Bool Whether or not to use Huffman encoding for strings.

#### Instances

Instances details

Show EncodeStrategy # |
Instance details Defined in Network.HPACK.Types Methods showsPrec :: Int -> EncodeStrategy -> ShowS # show :: EncodeStrategy -> String # showList :: [EncodeStrategy] -> ShowS #
Eq EncodeStrategy # |
Instance details Defined in Network.HPACK.Types Methods (==) :: EncodeStrategy -> EncodeStrategy -> Bool # (/=) :: EncodeStrategy -> EncodeStrategy -> Bool #