| 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 UnliftIO.Async -- unliftio
import qualified UnliftIO.Exception as E -- unliftio
import Network.HTTP2.Client
serverName :: String
serverName = "127.0.0.1"
main :: IO ()
main = runTCPClient serverName "80" $ runHTTP2Client serverName
where
cliconf host = defaultClientConfig { authority = C8.pack 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
- data Config = Config {}
- allocSimpleConfig :: Socket -> BufferSize -> IO Config
- freeSimpleConfig :: Config -> IO ()
- module Network.HTTP.Semantics.Client
- data HTTP2Error
- 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 #
Client configuration
Instances
| Show ClientConfig # | |
Defined in Network.HTTP2.Client.Run Methods showsPrec :: Int -> ClientConfig -> ShowS # show :: ClientConfig -> String # showList :: [ClientConfig] -> ShowS # | |
| Eq ClientConfig # | |
Defined in Network.HTTP2.Client.Run | |
defaultClientConfig :: ClientConfig #
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 = 1048576, settings = Settings {headerTableSize = 4096, enablePush = True, maxConcurrentStreams = Just 64, initialWindowSize = 262144, maxFrameSize = 16384, maxHeaderListSize = Nothing, pingRateLimit = 10}}
scheme :: ClientConfig -> Scheme #
https or http
authority :: ClientConfig -> Authority #
Server name
cacheLimit :: ClientConfig -> Int #
The maximum number of incoming streams on the net
connectionWindowSize :: ClientConfig -> WindowSize #
The window size of connection.
settings :: ClientConfig -> Settings #
Settings
HTTP/2 setting
HTTP/2 settings. See https://datatracker.ietf.org/doc/html/rfc9113#name-defined-settings.
Instances
The default settings.
>>>defaultSettingsSettings {headerTableSize = 4096, enablePush = True, maxConcurrentStreams = Just 64, initialWindowSize = 262144, maxFrameSize = 16384, maxHeaderListSize = Nothing, pingRateLimit = 10}
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
pingRateLimit :: Settings -> Int #
Maximum number of pings allowed per second (CVE-2019-9512)
Common configuration
HTTP/2 configuration.
Constructors
| Config | |
Fields
| |
allocSimpleConfig :: Socket -> BufferSize -> IO Config #
Making simple configuration whose IO is not efficient. A write buffer is allocated internally.
freeSimpleConfig :: Config -> IO () #
Deallocating the resource of the simple configuration.
Error
data HTTP2Error #
The connection error or the stream error.
Stream errors are treated as connection errors since
there are no good recovery ways.
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 # | |
Defined in Network.HTTP2.H2.Types Methods toException :: HTTP2Error -> SomeException # fromException :: SomeException -> Maybe HTTP2Error # displayException :: HTTP2Error -> String # | |
| Show HTTP2Error # | |
Defined in Network.HTTP2.H2.Types Methods showsPrec :: Int -> HTTP2Error -> ShowS # show :: HTTP2Error -> String # showList :: [HTTP2Error] -> ShowS # | |
type ReasonPhrase = ShortByteString #
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 # | |
| Show ErrorCode # | |
| Eq ErrorCode # | |
| Ord ErrorCode # | |