http2-5.3.9: HTTP/2 library

Safe Haskell | None
Language | Haskell2010

Network.HTTP2.Server

Contents

- Runner
- Server configuration
- HTTP/2 setting
  - Rate limits
- Common configuration

Description

HTTP/2 server library.

Example:

    {-# LANGUAGE OverloadedStrings #-}
    module Main (main) where

    import qualified Control.Exception as E
    import Data.ByteString.Builder (byteString)
    import Network.HTTP.Types (ok200)
    import Network.Run.TCP (runTCPServer) -- network-run

    import Network.HTTP2.Server

    main :: IO ()
    main = runTCPServer Nothing "80" runHTTP2Server
      where
        runHTTP2Server s = E.bracket (allocSimpleConfig s 4096)
                                     freeSimpleConfig
                                     (\config -> run defaultServerConfig config server)
        server _req _aux sendResponse = sendResponse response []
          where
            response = responseBuilder ok200 header body
            header = [("Content-Type", "text/plain")]
            body = byteString "Hello, world!\n"

Synopsis

- run :: ServerConfig -> Config -> Server -> IO ()
- data ServerConfig
- defaultServerConfig :: ServerConfig
- numberOfWorkers :: ServerConfig -> Int
- connectionWindowSize :: ServerConfig -> WindowSize
- settings :: ServerConfig -> Settings
- data Settings
- defaultSettings :: Settings
- headerTableSize :: Settings -> Int
- enablePush :: Settings -> Bool
- maxConcurrentStreams :: Settings -> Maybe Int
- initialWindowSize :: Settings -> WindowSize
- maxFrameSize :: Settings -> Int
- maxHeaderListSize :: Settings -> Maybe Int
- pingRateLimit :: Settings -> Int
- settingsRateLimit :: Settings -> Int
- emptyFrameRateLimit :: Settings -> Int
- rstRateLimit :: Settings -> Int
- data Config = Config {
  - confWriteBuffer :: Buffer
  - confBufferSize :: BufferSize
  - confSendAll :: ByteString -> IO ()
  - confReadN :: Int -> IO ByteString
  - confPositionReadMaker :: PositionReadMaker
  - confTimeoutManager :: Manager
  - confMySockAddr :: SockAddr
  - confPeerSockAddr :: SockAddr
  }
- allocSimpleConfig :: Socket -> BufferSize -> IO Config
- allocSimpleConfig' :: Socket -> BufferSize -> Int -> IO Config
- freeSimpleConfig :: Config -> IO ()
- module Network.HTTP.Semantics.Server

# Runner

run :: ServerConfig -> Config -> Server -> IO () #

Running HTTP/2 server.

# Server configuration

data ServerConfig #

Server configuration

#### Instances

Instances details

Show ServerConfig # |
Instance details Defined in Network.HTTP2.Server.Run Methods showsPrec :: Int -> ServerConfig -> ShowS # show :: ServerConfig -> String # showList :: [ServerConfig] -> ShowS #
Eq ServerConfig # |
Instance details Defined in Network.HTTP2.Server.Run Methods (==) :: ServerConfig -> ServerConfig -> Bool # (/=) :: ServerConfig -> ServerConfig -> Bool #

defaultServerConfig :: ServerConfig #

The default server config.

    >>> defaultServerConfig
    ServerConfig {numberOfWorkers = 8, connectionWindowSize = 16777216, settings = Settings {headerTableSize = 4096, enablePush = True, maxConcurrentStreams = Just 64, initialWindowSize = 262144, maxFrameSize = 16384, maxHeaderListSize = Nothing, pingRateLimit = 10, emptyFrameRateLimit = 4, settingsRateLimit = 4, rstRateLimit = 4}}

numberOfWorkers :: ServerConfig -> Int #

Deprecated: No effect anymore

Deprecated field.

connectionWindowSize :: ServerConfig -> WindowSize #

The window size of incoming streams

settings :: ServerConfig -> Settings #

Settings

# HTTP/2 setting

data Settings #

HTTP/2 settings. See https://datatracker.ietf.org/doc/html/rfc9113#name-defined-settings.

#### Instances

Instances details

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

defaultSettings :: Settings #

The default settings.

    >>> defaultSettings
    Settings {headerTableSize = 4096, enablePush = True, maxConcurrentStreams = Just 64, initialWindowSize = 262144, maxFrameSize = 16384, maxHeaderListSize = Nothing, pingRateLimit = 10, emptyFrameRateLimit = 4, settingsRateLimit = 4, rstRateLimit = 4}

headerTableSize :: Settings -> Int #

SETTINGS_HEADER_TABLE_SIZE

enablePush :: Settings -> Bool #

SETTINGS_ENABLE_PUSH

maxConcurrentStreams :: Settings -> Maybe Int #

SETTINGS_MAX_CONCURRENT_STREAMS

initialWindowSize :: Settings -> WindowSize #

SETTINGS_INITIAL_WINDOW_SIZE

maxFrameSize :: Settings -> Int #

SETTINGS_MAX_FRAME_SIZE

maxHeaderListSize :: Settings -> Maybe Int #

SETTINGS_MAX_HEADER_LIST_SIZE

## Rate limits

pingRateLimit :: Settings -> Int #

Maximum number of pings allowed per second (CVE-2019-9512)

settingsRateLimit :: Settings -> Int #

Maximum number of settings frames allowed per second (CVE-2019-9515)

emptyFrameRateLimit :: Settings -> Int #

Maximum number of empty data frames allowed per second (CVE-2019-9518)

rstRateLimit :: Settings -> Int #

Maximum number of reset frames allowed per second (CVE-2023-44487)

# Common configuration

data Config #

HTTP/2 configuration.

Constructors

Config |
Fields confWriteBuffer :: Buffer This is used only by frameSender. This MUST be freed after frameSender is terminated. confBufferSize :: BufferSize The size of the write buffer. We assume that the read buffer is the same size. So, this value is announced via SETTINGS_MAX_FRAME_SIZE to the peer. confSendAll :: ByteString -> IO () confReadN :: Int -> IO ByteString confPositionReadMaker :: PositionReadMaker confTimeoutManager :: Manager confMySockAddr :: SockAddr This is copied into `Aux`, if exist, on server. confPeerSockAddr :: SockAddr This is copied into `Aux`, if exist, on server.

allocSimpleConfig :: Socket -> BufferSize -> IO Config #

Making simple configuration whose IO is not efficient. A write buffer is allocated internally. WAI timeout manger is initialized with 30_000_000 microseconds.

allocSimpleConfig' :: Socket -> BufferSize -> Int -> IO Config #

Making simple configuration whose IO is not efficient. A write buffer is allocated internally. The third argument is microseconds to initialize WAI timeout manager.

freeSimpleConfig :: Config -> IO () #

Deallocating the resource of the simple configuration.

module Network.HTTP.Semantics.Server