| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Network.HTTP2.Client
Description
HTTP/2 client library.
Example:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
module Main where
import qualified Data.ByteString.Char8 as C8
import Network.HTTP.Types
import Network.Run.TCP (runTCPClient) -- network-run
import Control.Concurrent.Async
import qualified Control.Exception as E
import Network.HTTP2.Client
serverName :: String
serverName = "127.0.0.1"
main :: IO ()
main = runTCPClient serverName "80" $ runHTTP2Client serverName
where
cliconf host = defaultClientConfig { authority = host }
runHTTP2Client host s = E.bracket (allocSimpleConfig s 4096)
freeSimpleConfig
(\conf -> run (cliconf host) conf client)
client :: Client ()
client sendRequest _aux = do
let req0 = requestNoBody methodGet "/" []
client0 = sendRequest req0 $ \rsp -> do
print rsp
getResponseBodyChunk rsp >>= C8.putStrLn
req1 = requestNoBody methodGet "/foo" []
client1 = sendRequest req1 $ \rsp -> do
print rsp
getResponseBodyChunk rsp >>= C8.putStrLn
ex <- E.try $ concurrently_ client0 client1
case ex of
Left e -> print (e :: HTTP2Error)
Right () -> putStrLn "OK"Synopsis
- run :: ClientConfig -> Config -> Client a -> IO a
- data ClientConfig
- defaultClientConfig :: ClientConfig
- scheme :: ClientConfig -> Scheme
- authority :: ClientConfig -> Authority
- cacheLimit :: ClientConfig -> Int
- connectionWindowSize :: ClientConfig -> WindowSize
- settings :: ClientConfig -> 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
- defaultConfig :: Config
- confWriteBuffer :: Config -> Buffer
- confBufferSize :: Config -> BufferSize
- confSendAll :: Config -> ByteString -> IO ()
- confReadN :: Config -> Int -> IO ByteString
- confPositionReadMaker :: Config -> PositionReadMaker
- confTimeoutManager :: Config -> Manager
- confMySockAddr :: Config -> SockAddr
- confPeerSockAddr :: Config -> SockAddr
- confReadNTimeout :: Config -> Bool
- confOnInformational :: Config -> StreamId -> TokenHeaderTable -> IO ()
- allocSimpleConfig :: Socket -> BufferSize -> IO Config
- allocSimpleConfig' :: Socket -> BufferSize -> Int -> IO Config
- allocSimpleConfigWith :: Socket -> BufferSize -> Int -> STM a -> IO Config
- freeSimpleConfig :: Config -> IO ()
- module Network.HTTP.Semantics.Client
- data HTTP2Error
- = ConnectionIsClosed
- | ConnectionIsTimeout
- | ConnectionErrorIsReceived ErrorCode StreamId ReasonPhrase
- | ConnectionErrorIsSent ErrorCode StreamId ReasonPhrase
- | StreamErrorIsReceived ErrorCode StreamId
- | StreamResetIsReceived ErrorCode StreamId
- | StreamErrorIsSent ErrorCode StreamId ReasonPhrase
- | BadThingHappen SomeException
- data StreamTerminated
- = StreamPushedFinal
- | StreamCancelled
- | StreamOutOfScope
- | StreamRemoteReset ClosedCode
- type ReasonPhrase = ShortByteString
- newtype ErrorCode where
- ErrorCode Word32
- pattern NoError :: ErrorCode
- pattern ProtocolError :: ErrorCode
- pattern InternalError :: ErrorCode
- pattern FlowControlError :: ErrorCode
- pattern SettingsTimeout :: ErrorCode
- pattern StreamClosed :: ErrorCode
- pattern FrameSizeError :: ErrorCode
- pattern RefusedStream :: ErrorCode
- pattern Cancel :: ErrorCode
- pattern CompressionError :: ErrorCode
- pattern ConnectError :: ErrorCode
- pattern EnhanceYourCalm :: ErrorCode
- pattern InadequateSecurity :: ErrorCode
- pattern HTTP11Required :: ErrorCode
Runner
Client configuration
data ClientConfig Source #
Client configuration
Instances
| Show ClientConfig Source # | |
Defined in Network.HTTP2.Client.Run Methods showsPrec :: Int -> ClientConfig -> ShowS # show :: ClientConfig -> String # showList :: [ClientConfig] -> ShowS # | |
| Eq ClientConfig Source # | |
Defined in Network.HTTP2.Client.Run | |
defaultClientConfig :: ClientConfig Source #
The default client config.
The authority field will be used to set the HTTP2 :authority
pseudo-header. In most cases you will want to override it to be equal to
host.
Further background on authority:
RFC 3986 also
allows host:port, and most servers will accept this too. However, when
using TLS, many servers will expect the TLS SNI server name and the
:authority pseudo-header to be equal, and for TLS SNI the server name
should not include the port. Note that HTTP2 explicitly disallows using
userinfo@ as part of the authority.
>>>defaultClientConfigClientConfig {scheme = "http", authority = "localhost", cacheLimit = 64, 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}}
scheme :: ClientConfig -> Scheme Source #
https or http
authority :: ClientConfig -> Authority Source #
Server name
cacheLimit :: ClientConfig -> Int Source #
The maximum number of incoming streams on the net
connectionWindowSize :: ClientConfig -> WindowSize Source #
The window size of connection.
settings :: ClientConfig -> Settings Source #
Settings
HTTP/2 setting
HTTP/2 settings. See https://datatracker.ietf.org/doc/html/rfc9113#name-defined-settings.
defaultSettings :: Settings Source #
The default settings.
>>>defaultSettingsSettings {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
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
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.
confSendAll :: Config -> ByteString -> IO () Source #
confTimeoutManager :: Config -> Manager Source #
confReadNTimeout :: Config -> Bool Source #
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.
Error
data HTTP2Error Source #
The connection error or the stream error.
A stream error resets that stream and the connection carries on, as
RFC 9113 section 5.4.2 asks. One kind of trouble is a connection error
even though the spec calls it a stream error, because this
implementation cannot carry on through it: a field block abandoned
part-way leaves the HPACK tables disagreeing with the peer's, and
nothing sent afterwards would decode.
ErrorCode in connection errors should be the highest stream identifier
but in this implementation it identifies the stream that
caused this error.
Constructors
Instances
| Exception HTTP2Error Source # | |
Defined in Network.HTTP2.H2.Types Methods toException :: HTTP2Error -> SomeException # fromException :: SomeException -> Maybe HTTP2Error # displayException :: HTTP2Error -> String # | |
| Show HTTP2Error Source # | |
Defined in Network.HTTP2.H2.Types Methods showsPrec :: Int -> HTTP2Error -> ShowS # show :: HTTP2Error -> String # showList :: [HTTP2Error] -> ShowS # | |
data StreamTerminated Source #
Constructors
| StreamPushedFinal | |
| StreamCancelled | |
| StreamOutOfScope | |
| StreamRemoteReset ClosedCode |
Instances
| Exception StreamTerminated Source # | |
Defined in Network.HTTP2.H2.OutBodyIface Methods toException :: StreamTerminated -> SomeException # | |
| Show StreamTerminated Source # | |
Defined in Network.HTTP2.H2.OutBodyIface Methods showsPrec :: Int -> StreamTerminated -> ShowS # show :: StreamTerminated -> String # showList :: [StreamTerminated] -> ShowS # | |
type ReasonPhrase = ShortByteString Source #
The type for raw error code.
Bundled Patterns
| pattern NoError :: ErrorCode | The type for error code. See https://www.rfc-editor.org/rfc/rfc9113#ErrorCodes. |
| pattern ProtocolError :: ErrorCode | |
| pattern InternalError :: ErrorCode | |
| pattern FlowControlError :: ErrorCode | |
| pattern SettingsTimeout :: ErrorCode | |
| pattern StreamClosed :: ErrorCode | |
| pattern FrameSizeError :: ErrorCode | |
| pattern RefusedStream :: ErrorCode | |
| pattern Cancel :: ErrorCode | |
| pattern CompressionError :: ErrorCode | |
| pattern ConnectError :: ErrorCode | |
| pattern EnhanceYourCalm :: ErrorCode | |
| pattern InadequateSecurity :: ErrorCode | |
| pattern HTTP11Required :: ErrorCode |
Instances
| Read ErrorCode Source # | |
| Show ErrorCode Source # | |
| Eq ErrorCode Source # | |
| Ord ErrorCode Source # | |