http2-0.8.0: 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.

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"

data EncodeInfo Source

Auxiliary information for frame encoding.

Constructors

EncodeInfo 

Fields

encodeFlags :: FrameFlags

Flags to be set in a frame header

encodeStreamId :: StreamIdentifier

Stream id to be set in a frame header

encodePadding :: Maybe Padding

Padding if any

encodeInfo Source

Arguments

:: (FrameFlags -> FrameFlags) 
-> Int

stream identifier

-> EncodeInfo 

A smart builder of EncodeInfo.

>>> encodeInfo setAck 0
EncodeInfo {encodeFlags = 1, encodeStreamId = StreamIdentifier 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.

checkFrameHeader :: Settings -> FrameTypeId -> FrameHeader -> Maybe HTTP2Error Source

Checking a frame header and reporting an error if any.

>>> let stid = toStreamIdentifier 0
>>> checkFrameHeader defaultSettings FrameData (FrameHeader 100 0 stid)
Just (ConnectionError ProtocolError "cannot used in control stream")

Decoding 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

Stream identifier

fromStreamIdentifier :: StreamIdentifier -> Int Source

>>> fromStreamIdentifier (toStreamIdentifier 0)
0

toStreamIdentifier :: Int -> StreamIdentifier Source

>>> toStreamIdentifier 0
StreamIdentifier 0

isControl :: StreamIdentifier -> Bool Source

>>> isControl $ toStreamIdentifier 0
True
>>> isControl $ toStreamIdentifier 1
False

isRequest :: StreamIdentifier -> Bool Source

>>> isRequest $ toStreamIdentifier 0
False
>>> isRequest $ toStreamIdentifier 1
True

isResponse :: StreamIdentifier -> Bool Source

>>> isResponse $ toStreamIdentifier 0
False
>>> isResponse $ toStreamIdentifier 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}

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