http2-1.0.4: HTTP/2.0 library including frames and HPACK

Safe HaskellNone
LanguageHaskell2010

Network.HTTP2

Contents

Description

Framing in HTTP/2.

Synopsis

Frame

data Frame Source

The data type for HTTP/2 frames.

Instances

data FrameHeader Source

The data type for HTTP/2 frame headers.

isPaddingDefined :: FramePayload -> Bool Source

Checking if padding is defined in this frame type.

Encoding

encodeFrame :: EncodeInfo -> FramePayload -> ByteString Source

Encoding an HTTP/2 frame to ByteString. This function is not efficient enough for high performace program because of the concatenation of ByteString.

>>> encodeFrame (encodeInfo id 1) (DataFrame "body")
"\NUL\NUL\EOT\NUL\NUL\NUL\NUL\NUL\SOHbody"

encodeFrameChunks :: EncodeInfo -> FramePayload -> [ByteString] Source

Encoding an HTTP/2 frame to [ByteString]. This is suitable for sendMany.

encodeFrameHeader :: FrameTypeId -> FrameHeader -> ByteString Source

Encoding an HTTP/2 frame header. The frame header must be completed.

encodeFrameHeaderBuf :: FrameTypeId -> FrameHeader -> Ptr Word8 -> IO () Source

Writing an encoded HTTP/2 frame header to the buffer. The length of the buffer must be larger than or equal to 9 bytes.

encodeFramePayload :: EncodeInfo -> FramePayload -> (FrameHeader, [ByteString]) Source

Encoding an HTTP/2 frame payload. This returns a complete frame header and chunks of payload.

data EncodeInfo Source

Auxiliary information for frame encoding.

Constructors

EncodeInfo 

Fields

encodeFlags :: FrameFlags

Flags to be set in a frame header

encodeStreamId :: StreamId

Stream id to be set in a frame header

encodePadding :: Maybe Padding

Padding if any. In the case where this value is set but the priority flag is not set, this value gets preference over the priority flag. So, if this value is set, the priority flag is also set.

encodeInfo Source

Arguments

:: (FrameFlags -> FrameFlags) 
-> Int

stream identifier

-> EncodeInfo 

A smart builder of EncodeInfo.

>>> encodeInfo setAck 0
EncodeInfo {encodeFlags = 1, encodeStreamId = 0, encodePadding = Nothing}

Decoding

decodeFrame Source

Arguments

:: Settings

HTTP/2 settings

-> ByteString

Input byte-stream

-> Either HTTP2Error Frame

Decoded frame

Decoding an HTTP/2 frame to ByteString. The second argument must be include the entire of frame. So, this function is not useful for real applications but useful for testing.

decodeFrameHeader :: ByteString -> (FrameTypeId, FrameHeader) Source

Decoding an HTTP/2 frame header. Must supply 9 bytes.

checkFrameHeader :: Settings -> (FrameTypeId, FrameHeader) -> Either HTTP2Error (FrameTypeId, FrameHeader) Source

Checking a frame header and reporting an error if any.

>>> checkFrameHeader defaultSettings (FrameData,(FrameHeader 100 0 0))
Left (ConnectionError ProtocolError "cannot used in control stream")

Decoding payload

decodeFramePayload :: FrameTypeId -> FramePayloadDecoder Source

Decoding an HTTP/2 frame payload.

Frame type ID

framePayloadToFrameTypeId :: FramePayload -> FrameTypeId Source

Getting FrameType from FramePayload.

>>> framePayloadToFrameTypeId (DataFrame "body")
FrameData

Frame type

fromFrameTypeId :: FrameTypeId -> FrameType Source

>>> fromFrameTypeId FrameData
0
>>> fromFrameTypeId FrameContinuation
9
>>> fromFrameTypeId (FrameUnknown 10)
10

toFrameTypeId :: FrameType -> FrameTypeId Source

>>> toFrameTypeId 0
FrameData
>>> toFrameTypeId 9
FrameContinuation
>>> toFrameTypeId 10
FrameUnknown 10

Types

defaultPriority :: Priority Source

Default priority which depends on stream 0.

>>> defaultPriority
Priority {exclusive = False, streamDependency = 0, weight = 16}

highestPriority :: Priority Source

Highest priority which depends on stream 0.

>>> highestPriority
Priority {exclusive = False, streamDependency = 0, weight = 256}

Stream identifier

isControl :: StreamId -> Bool Source

>>> isControl 0
True
>>> isControl 1
False

isRequest :: StreamId -> Bool Source

>>> isRequest 0
False
>>> isRequest 1
True

isResponse :: StreamId -> Bool Source

>>> isResponse 0
False
>>> isResponse 2
True

Stream identifier related

Flags

defaultFlags :: FrameFlags Source

>>> defaultFlags
0

testEndStream :: FrameFlags -> Bool Source

>>> testEndStream 0x1
True

testAck :: FrameFlags -> Bool Source

>>> testAck 0x1
True

testEndHeader :: FrameFlags -> Bool Source

>>> testEndHeader 0x4
True

testPadded :: FrameFlags -> Bool Source

>>> testPadded 0x8
True

testPriority :: FrameFlags -> Bool Source

>>> testPriority 0x20
True

setEndStream :: FrameFlags -> FrameFlags Source

>>> setEndStream 0
1

setAck :: FrameFlags -> FrameFlags Source

>>> setAck 0
1

setEndHeader :: FrameFlags -> FrameFlags Source

>>> setEndHeader 0
4

setPadded :: FrameFlags -> FrameFlags Source

>>> setPadded 0
8

setPriority :: FrameFlags -> FrameFlags Source

>>> setPriority 0
32

SettingsList

type SettingsList = [(SettingsKeyId, SettingsValue)] Source

Settings containing raw values.

fromSettingsKeyId :: SettingsKeyId -> Word16 Source

>>> fromSettingsKeyId SettingsHeaderTableSize
1
>>> fromSettingsKeyId SettingsMaxHeaderBlockSize
6

toSettingsKeyId :: Word16 -> Maybe SettingsKeyId Source

>>> toSettingsKeyId 0
Nothing
>>> toSettingsKeyId 1
Just SettingsHeaderTableSize
>>> toSettingsKeyId 6
Just SettingsMaxHeaderBlockSize
>>> toSettingsKeyId 7
Nothing

checkSettingsList :: SettingsList -> Maybe HTTP2Error Source

Checking SettingsList and reporting an error if any.

>>> checkSettingsList [(SettingsEnablePush,2)]
Just (ConnectionError ProtocolError "enable push must be 0 or 1")

Settings

data Settings Source

Cooked version of settings. This is suitable to be stored in a HTTP/2 context.

Instances

defaultSettings :: Settings Source

The default settings.

>>> defaultSettings
Settings {headerTableSize = 4096, enablePush = True, maxConcurrentStreams = Nothing, initialWindowSize = 65535, maxFrameSize = 16384, maxHeaderBlockSize = Nothing}

updateSettings :: Settings -> SettingsList -> Settings Source

Updating settings.

>>> updateSettings defaultSettings [(SettingsEnablePush,0),(SettingsMaxHeaderBlockSize,200)]
Settings {headerTableSize = 4096, enablePush = False, maxConcurrentStreams = Nothing, initialWindowSize = 65535, maxFrameSize = 16384, maxHeaderBlockSize = Just 200}

Window

defaultInitialWindowSize :: WindowSize Source

The default initial window size.

>>> defaultInitialWindowSize
65535

maxWindowSize :: WindowSize Source

The maximum window size.

>>> maxWindowSize
2147483647

isWindowOverflow :: WindowSize -> Bool Source

Checking if a window size exceeds the maximum window size.

>>> isWindowOverflow 10
False
>>> isWindowOverflow maxWindowSize
False
>>> isWindowOverflow (maxWindowSize + 1)
True

Misc

recommendedConcurrency :: Int Source

Default concurrency.

>>> recommendedConcurrency
100

Error code

fromErrorCodeId :: ErrorCodeId -> ErrorCode Source

>>> fromErrorCodeId NoError
0
>>> fromErrorCodeId InadequateSecurity
12

toErrorCodeId :: ErrorCode -> ErrorCodeId Source

>>> toErrorCodeId 0
NoError
>>> toErrorCodeId 0xc
InadequateSecurity
>>> toErrorCodeId 0xe
UnknownErrorCode 14

Error

Magic

connectionPreface :: ByteString Source

The preface of HTTP/2.

>>> connectionPreface
"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"

connectionPrefaceLength :: Int Source

Length of the preface.

>>> connectionPrefaceLength
24

frameHeaderLength :: Int Source

The length of HTTP/2 frame header.

>>> frameHeaderLength
9

maxPayloadLength :: Int Source

The maximum length of HTTP/2 payload.

>>> maxPayloadLength
16384