http2-5.4.12: HTTP/2 library
Safe HaskellNone
LanguageHaskell2010

Network.HTTP2.Server

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

Runner

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

Running HTTP/2 server.

Server configuration

data ServerConfig Source #

Server configuration

Instances

Instances details
Show ServerConfig Source # 
Instance details

Defined in Network.HTTP2.Server.Run

Eq ServerConfig Source # 
Instance details

Defined in Network.HTTP2.Server.Run

defaultServerConfig :: ServerConfig Source #

The default server config.

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

numberOfWorkers :: ServerConfig -> Int Source #

Deprecated: No effect anymore

Deprecated field.

connectionWindowSize :: ServerConfig -> WindowSize Source #

The window size of incoming streams

HTTP/2 setting

data Settings Source #

Instances

Instances details
Show Settings Source # 
Instance details

Defined in Network.HTTP2.H2.Settings

Eq Settings Source # 
Instance details

Defined in Network.HTTP2.H2.Settings

defaultSettings :: Settings Source #

The default settings.

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

headerTableSize :: Settings -> Int Source #

SETTINGS_HEADER_TABLE_SIZE

enablePush :: Settings -> Bool Source #

SETTINGS_ENABLE_PUSH

maxConcurrentStreams :: Settings -> Maybe Int Source #

SETTINGS_MAX_CONCURRENT_STREAMS

initialWindowSize :: Settings -> WindowSize Source #

SETTINGS_INITIAL_WINDOW_SIZE

maxFrameSize :: Settings -> Int Source #

SETTINGS_MAX_FRAME_SIZE

maxHeaderListSize :: Settings -> Maybe Int Source #

SETTINGS_MAX_HEADER_LIST_SIZE. Our own value is also enforced: a field block whose decoded size (RFC 9113 section 6.5.2: the length of each field's name plus its value plus 32) exceeds it resets the stream. With Nothing, nothing is advertised but a limit of 64 KiB is enforced all the same (CVE-2026-49975).

Rate limits

pingRateLimit :: Settings -> Int Source #

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

settingsRateLimit :: Settings -> Int Source #

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

emptyFrameRateLimit :: Settings -> Int Source #

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

rstRateLimit :: Settings -> Int Source #

Maximum number of streams reset per second, whether by the peer's RST_STREAM (CVE-2023-44487) or by ours in answer to a stream error the peer caused (CVE-2025-8671)

Common configuration

data Config Source #

HTTP/2 configuration.

defaultConfig :: Config Source #

Default config. This is just a template to modify via field names. Don't use this without modifications.

confWriteBuffer :: Config -> Buffer Source #

This is used only by frameSender. This MUST be freed after frameSender is terminated.

confBufferSize :: Config -> BufferSize Source #

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.

confMySockAddr :: Config -> SockAddr Source #

This is copied into Aux, if exist, on server.

confPeerSockAddr :: Config -> SockAddr Source #

This is copied into Aux, if exist, on server.

confOnInformational :: Config -> StreamId -> TokenHeaderTable -> IO () Source #

Client only: called when a 1xx informational response (e.g. 103 Early Hints) is received on the given stream, ahead of the final response. No-op by default.

Since: 5.4.2

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

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 Source #

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

allocSimpleConfigWith :: Socket -> BufferSize -> Int -> STM a -> IO Config Source #

allocSimpleConfig' whose receive the caller can give up on. The STM action is waited for beside each receive; when it fires, the reader ends as it does at end of input. Nothing is closed and no thread is interrupted to make it return.

Since: 5.4.11

freeSimpleConfig :: Config -> IO () Source #

Deallocating the resource of the simple configuration.

This does not cancel timeout actions registered with confTimeoutManager. Since time-manager 0.3, a manager holds no registrations, so there is nothing to kill: an action registered with register runs even after this returns unless it is cancelled with cancel. Use withHandle, which cancels it when the scope ends.