http2-5.1.0: HTTP/2 library
Safe HaskellSafe-Inferred
LanguageHaskell2010

Network.HPACK

Description

HPACK(https://tools.ietf.org/html/rfc7541) encoding and decoding a header list.

Synopsis

Encoding and decoding

encodeHeader Source #

Arguments

:: EncodeStrategy 
-> Size

The size of a temporary buffer.

-> DynamicTable 
-> HeaderList 
-> IO ByteString

An HPACK format

Converting HeaderList to the HPACK format. This function has overhead of allocating/freeing a temporary buffer. BufferOverrun will be thrown if the temporary buffer is too small.

decodeHeader Source #

Arguments

:: DynamicTable 
-> ByteString

An HPACK format

-> IO HeaderList 

Converting the HPACK format to HeaderList.

  • 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.

Encoding and decoding with token

encodeTokenHeader Source #

Arguments

:: Buffer 
-> BufferSize 
-> EncodeStrategy 
-> Bool

True at the first time, False when continued.

-> DynamicTable 
-> TokenHeaderList 
-> IO (TokenHeaderList, Int)

Leftover, filled length

Converting TokenHeaderList to the HPACK format directly in the buffer.

When calling this function for a new TokenHeaderList, 4th argument must be True.

The return value is a pair of leftover TokenHeaderList and how many bytes are filled in the buffer. If the leftover is empty, the encoding is finished. Otherwise, this function should be called with it again. 4th argument must be False.

4th argument is relating to dynamic table size update. If True and the limit is set by setLimitForEncoding, dynamic table size update is generated at the beginning of the HPACK format.

decodeTokenHeader Source #

Arguments

:: DynamicTable 
-> ByteString

An HPACK format

-> IO HeaderTable 

Converting the HPACK format 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.
  • DecodeError would be thrown if the HPACK format is broken.
  • BufferOverrun will be thrown if the temporary buffer for Huffman decoding is too small.

DynamicTable

data DynamicTable Source #

Type for dynamic table.

defaultDynamicTableSize :: Int Source #

Default dynamic table size. The value is 4,096 bytes: an array has 128 entries.

>>> defaultDynamicTableSize
4096

newDynamicTableForEncoding Source #

Arguments

:: Size

The dynamic table size

-> IO DynamicTable 

Creating DynamicTable for encoding.

newDynamicTableForDecoding Source #

Arguments

:: Size

The dynamic table size

-> Size

The size of temporary buffer for Huffman decoding

-> IO DynamicTable 

Creating DynamicTable for decoding.

withDynamicTableForEncoding Source #

Arguments

:: Size

The dynamic table size

-> (DynamicTable -> IO a) 
-> IO a 

Creating DynamicTable for encoding, performing the action and clearing the DynamicTable.

withDynamicTableForDecoding Source #

Arguments

:: Size

The dynamic table size

-> Size

The size of temporary buffer for Huffman

-> (DynamicTable -> IO a) 
-> IO a 

Creating DynamicTable for decoding, performing the action and clearing the DynamicTable.

setLimitForEncoding :: Size -> DynamicTable -> IO () Source #

When SETTINGS_HEADER_TABLE_SIZE is received from a peer, its value should be set by this function.

Strategy for encoding

data CompressionAlgo Source #

Compression algorithms for HPACK encoding.

Constructors

Naive

No compression

Static

Using indices in the static table only

Linear

Using indices

data EncodeStrategy Source #

Strategy for HPACK encoding.

Constructors

EncodeStrategy 

Fields

Instances

Instances details
Show EncodeStrategy Source # 
Instance details

Defined in Network.HPACK.Types

Eq EncodeStrategy Source # 
Instance details

Defined in Network.HPACK.Types

defaultEncodeStrategy :: EncodeStrategy Source #

Default EncodeStrategy.

>>> defaultEncodeStrategy
EncodeStrategy {compressionAlgo = Linear, useHuffman = False}

Errors

data DecodeError Source #

Errors for decoder.

Constructors

IndexOverrun Index

Index is out of range

EosInTheMiddle

Eos appears in the middle of huffman string

IllegalEos

Non-eos appears in the end of huffman string

TooLongEos

Eos of huffman string is more than 7 bits

TooSmallTableSize

A peer set the dynamic table size less than 32

TooLargeTableSize

A peer tried to change the dynamic table size over the limit

IllegalTableSizeUpdate

Table size update at the non-beginning

HeaderBlockTruncated 
IllegalHeaderName 
TooLargeHeader 

data BufferOverrun #

Buffer overrun exception.

Constructors

BufferOverrun

The buffer size is not enough

Headers

type HeaderList = [Header] Source #

Header list.

type HeaderName = ByteString Source #

Header name.

type HeaderValue = ByteString Source #

Header value.

type TokenHeaderList = [TokenHeader] Source #

TokenBased header list.

type TokenHeader = (Token, HeaderValue) Source #

TokenBased header.

Value table

type ValueTable = Array Int (Maybe HeaderValue) Source #

An array to get HeaderValue quickly. getHeaderValue should be used. Internally, the key is tokenIx.

type HeaderTable = (TokenHeaderList, ValueTable) Source #

A pair of token list and value table.

toHeaderTable :: [(CI HeaderName, HeaderValue)] -> IO HeaderTable Source #

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

Basic types

type Size = Int Source #

Size in bytes.

type Index = Int Source #

Index for table.

type Buffer = Ptr Word8 #

A pointer to Word8.

type BufferSize = Int #

Size of a buffer.

Re-exports

original :: CI s -> s #

Retrieve the original string-like value.

foldedCase :: CI s -> s #

Retrieve the case folded string-like value. (Also see foldCase).

mk :: FoldCase s => s -> CI s #

Make the given string-like value case insensitive.