http2-tls 0.1.0 → 0.2.0
raw patch · 5 files changed
+183/−41 lines, 5 filesdep +network-controldep +x509-storedep +x509-validationdep ~bytestringdep ~crypton-x509-storedep ~crypton-x509-validationPVP ok
version bump matches the API change (PVP)
Dependencies added: network-control, x509-store, x509-validation
Dependency ranges changed: bytestring, crypton-x509-store, crypton-x509-validation, data-default-class, http2, network, network-run, recv, time-manager, tls, unliftio
API changes (from Hackage documentation)
+ Network.HTTP2.TLS.Client: settingsCacheLimit :: Settings -> Int
+ Network.HTTP2.TLS.Client: settingsConcurrentStreams :: Settings -> Int
+ Network.HTTP2.TLS.Client: settingsConnectionWindowSize :: Settings -> Int
+ Network.HTTP2.TLS.Client: settingsStreamWindowSize :: Settings -> Int
+ Network.HTTP2.TLS.Server: ServerIO :: SockAddr -> SockAddr -> IO (StreamId, Stream, Request) -> (Stream -> Response -> IO ()) -> (ByteString -> IO ()) -> ServerIO
+ Network.HTTP2.TLS.Server: [sioMySockAddr] :: ServerIO -> SockAddr
+ Network.HTTP2.TLS.Server: [sioPeerSockAddr] :: ServerIO -> SockAddr
+ Network.HTTP2.TLS.Server: [sioReadRequest] :: ServerIO -> IO (StreamId, Stream, Request)
+ Network.HTTP2.TLS.Server: [sioWriteBytes] :: ServerIO -> ByteString -> IO ()
+ Network.HTTP2.TLS.Server: [sioWriteResponse] :: ServerIO -> Stream -> Response -> IO ()
+ Network.HTTP2.TLS.Server: data ServerIO
+ Network.HTTP2.TLS.Server: data Stream
+ Network.HTTP2.TLS.Server: runIO :: Settings -> Credentials -> HostName -> PortNumber -> (ServerIO -> IO (IO ())) -> IO ()
+ Network.HTTP2.TLS.Server: settingsConcurrentStreams :: Settings -> Int
+ Network.HTTP2.TLS.Server: settingsConnectionWindowSize :: Settings -> Int
+ Network.HTTP2.TLS.Server: settingsNumberOfWorkers :: Settings -> Int
+ Network.HTTP2.TLS.Server: settingsStreamWindowSize :: Settings -> Int
- Network.HTTP2.TLS.Client: runH2C :: HostName -> PortNumber -> Client a -> IO a
+ Network.HTTP2.TLS.Client: runH2C :: Settings -> HostName -> PortNumber -> Client a -> IO a
- Network.HTTP2.TLS.Client: type Client a = forall b. () => Request -> Response -> IO b -> IO b -> IO a
+ Network.HTTP2.TLS.Client: type Client a = forall b. () => Request -> Response -> IO b -> IO b -> Aux -> IO a
Files
- Network/HTTP2/TLS/Client.hs +23/−8
- Network/HTTP2/TLS/Client/Settings.hs +34/−4
- Network/HTTP2/TLS/Server.hs +59/−4
- Network/HTTP2/TLS/Server/Settings.hs +30/−0
- http2-tls.cabal +37/−25
Network/HTTP2/TLS/Client.hs view
@@ -19,6 +19,10 @@ settingsValidateCert, settingsCAStore, settingsAddrInfoFlags,+ settingsCacheLimit,+ settingsConcurrentStreams,+ settingsConnectionWindowSize,+ settingsStreamWindowSize, ) where import Data.ByteString (ByteString)@@ -28,6 +32,10 @@ import Network.HTTP2.Client ( Client, ClientConfig (..),+ defaultClientConfig,+ initialWindowSize,+ maxConcurrentStreams,+ settings, ) import qualified Network.HTTP2.Client as H2Client import Network.Socket@@ -67,21 +75,22 @@ run :: Settings -> HostName -> PortNumber -> Client a -> IO a run settings serverName port client = runTLS settings serverName port "h2" $ \ctx mysa peersa ->- run' "https" serverName (sendTLS ctx) (recvTLS ctx) mysa peersa client+ run' settings "https" serverName (sendTLS ctx) (recvTLS ctx) mysa peersa client -- | Running an HTTP\/2 client over TCP.-runH2C :: HostName -> PortNumber -> Client a -> IO a-runH2C serverName port client =+runH2C :: Settings -> HostName -> PortNumber -> Client a -> IO a+runH2C settings serverName port client = E.bracket open close $ \sock -> do mysa <- getSocketName sock peersa <- getPeerName sock recv <- mkRecvTCP Server.defaultSettings sock- run' "http" serverName (sendTCP sock) recv mysa peersa client+ run' settings "http" serverName (sendTCP sock) recv mysa peersa client where open = openTCP (settingsAddrInfoFlags defaultSettings) serverName port run'- :: ByteString+ :: Settings+ -> ByteString -> HostName -> (ByteString -> IO ()) -> IO ByteString@@ -89,17 +98,23 @@ -> SockAddr -> Client a -> IO a-run' schm serverName send recv mysa peersa client =+run' Settings{..} schm serverName send recv mysa peersa client = E.bracket (allocConfigForClient send recv mysa peersa) freeConfigForClient (\conf -> H2Client.run cliconf conf client) where cliconf =- ClientConfig+ defaultClientConfig { scheme = schm , authority = C8.pack serverName- , cacheLimit = 20+ , cacheLimit = settingsCacheLimit+ , connectionWindowSize = settingsConnectionWindowSize+ , settings =+ (settings defaultClientConfig)+ { initialWindowSize = settingsStreamWindowSize+ , maxConcurrentStreams = Just settingsConcurrentStreams+ } } openTCP :: [AddrInfoFlag] -> HostName -> PortNumber -> IO Socket
Network/HTTP2/TLS/Client/Settings.hs view
@@ -3,24 +3,50 @@ import Data.X509.CertificateStore (CertificateStore) import Network.Socket +import Network.Control+import Network.HTTP2.Client (+ cacheLimit,+ defaultClientConfig,+ )+ -- Client settings type. data Settings = Settings { settingsKeyLogger :: String -> IO ()- -- ^ Key logger+ -- ^ Key logger (TLS and H2) -- -- Applications may wish to set this depending on the SSLKEYLOGFILE environment variable. Default is do nothing. , settingsValidateCert :: Bool- -- ^ Should we validate TLS certificates?+ -- ^ Should we validate TLS certificates? (TLS and H2) -- -- >>> settingsValidateCert defaultSettings -- True , settingsCAStore :: CertificateStore- -- ^ Certificate store used for validation. The default is 'mempty'.+ -- ^ Certificate store used for validation. The default is 'mempty'. (TLS and H2) , settingsAddrInfoFlags :: [AddrInfoFlag]- -- ^ Flags that control the querying behaviour of @getAddrInfo@.+ -- ^ Flags that control the querying behaviour of @getAddrInfo@. (TLS and H2) -- -- >>> settingsAddrInfoFlags defaultSettings -- []+ , settingsCacheLimit :: Int+ -- ^ How many pushed responses are contained in the cache (H2 and H2c)+ --+ -- >>> settingsCacheLimits defaultSettings+ -- 64+ , settingsConcurrentStreams :: Int+ -- ^ The maximum number of incoming streams on the net (H2 and H2c)+ --+ -- >>> settingsConcurrentStreams defaultSettings+ -- 64+ , settingsStreamWindowSize :: Int+ -- ^ The window size of incoming streams (H2 and H2c)+ --+ -- >>> settingsStreamWindowSize defaultSettings+ -- 262144+ , settingsConnectionWindowSize :: Int+ -- ^ The window size of a connection (H2 and H2c)+ --+ -- >>> settingsConnectionWindowSize defaultSettings+ -- 1048575 } -- | Default settings.@@ -31,4 +57,8 @@ , settingsValidateCert = True , settingsCAStore = mempty , settingsAddrInfoFlags = []+ , settingsCacheLimit = cacheLimit defaultClientConfig+ , settingsConcurrentStreams = defaultMaxStreams+ , settingsStreamWindowSize = defaultMaxStreamData+ , settingsConnectionWindowSize = defaultMaxData }
Network/HTTP2/TLS/Server.hs view
@@ -19,6 +19,10 @@ settingsReadBufferSize, settingsReadBufferLowerLimit, settingsKeyLogger,+ settingsNumberOfWorkers,+ settingsConcurrentStreams,+ settingsConnectionWindowSize,+ settingsStreamWindowSize, -- * IO backend IOBackend,@@ -27,12 +31,27 @@ recv, mySockAddr, peerSockAddr,++ -- * Internal+ runIO,+ Stream,+ ServerIO (..), ) where import Data.ByteString (ByteString) import Data.Default.Class (def)-import Network.HTTP2.Server (Server)+import Network.HTTP2.Server (+ Server,+ connectionWindowSize,+ defaultServerConfig,+ initialWindowSize,+ maxConcurrentStreams,+ numberOfWorkers,+ settings,+ ) import qualified Network.HTTP2.Server as H2Server+import Network.HTTP2.Server.Internal (ServerIO, Stream)+import qualified Network.HTTP2.Server.Internal as H2I import Network.Run.TCP.Timeout import Network.Socket ( HostName,@@ -84,11 +103,47 @@ run' settings server mgr iobackend run' :: Settings -> Server -> T.Manager -> IOBackend -> IO ()-run' settings server mgr IOBackend{..} =+run' settings0@Settings{..} server mgr IOBackend{..} = E.bracket- (allocConfigForServer settings mgr send recv mySockAddr peerSockAddr)+ (allocConfigForServer settings0 mgr send recv mySockAddr peerSockAddr) freeConfigForServer- (\conf -> H2Server.run conf server)+ (\conf -> H2Server.run sconf conf server)+ where+ sconf =+ defaultServerConfig+ { numberOfWorkers = settingsNumberOfWorkers+ , connectionWindowSize = settingsConnectionWindowSize+ , settings =+ (settings defaultServerConfig)+ { initialWindowSize = settingsStreamWindowSize+ , maxConcurrentStreams = Just settingsConcurrentStreams+ }+ }++runIO+ :: Settings+ -> Credentials+ -> HostName+ -> PortNumber+ -> (ServerIO -> IO (IO ()))+ -> IO ()+runIO settings0@Settings{..} creds host port action =+ runTLS settings0 creds host port "h2" $ \mgr IOBackend{..} -> do+ E.bracket+ (allocConfigForServer settings0 mgr send recv mySockAddr peerSockAddr)+ freeConfigForServer+ (\conf -> H2I.runIO sconf conf action)+ where+ sconf =+ defaultServerConfig+ { numberOfWorkers = settingsNumberOfWorkers+ , connectionWindowSize = settingsConnectionWindowSize+ , settings =+ (settings defaultServerConfig)+ { initialWindowSize = settingsStreamWindowSize+ , maxConcurrentStreams = Just settingsConcurrentStreams+ }+ } ----------------------------------------------------------------
Network/HTTP2/TLS/Server/Settings.hs view
@@ -1,5 +1,11 @@ module Network.HTTP2.TLS.Server.Settings where +import Network.Control+import Network.HTTP2.Server (+ defaultServerConfig,+ numberOfWorkers,+ )+ -- Server settings type. data Settings = Settings { settingsTimeout :: Int@@ -33,6 +39,26 @@ -- ^ Key logger (defaults to none) -- -- Applications may wish to set this depending on the SSLKEYLOGFILE environment variable. The default is do nothing.+ , settingsNumberOfWorkers :: Int+ -- ^ The number of workers (H2 and H2c)+ --+ -- >>> settingsNumberOfWorkers defaultSettings+ -- 8+ , settingsConcurrentStreams :: Int+ -- ^ The maximum number of incoming streams on the net (H2 and H2c)+ --+ -- >>> settingsConcurrentStreams defaultSettings+ -- 64+ , settingsStreamWindowSize :: Int+ -- ^ The window size of incoming streams (H2 and H2c)+ --+ -- >>> settingsStreamWindowSize defaultSettings+ -- 262144+ , settingsConnectionWindowSize :: Int+ -- ^ The window size of a connection (H2 and H2c)+ --+ -- >>> settingsConnectionWindowSize defaultSettings+ -- 1048575 } -- | Default settings.@@ -45,4 +71,8 @@ , settingsReadBufferSize = 16384 , settingsReadBufferLowerLimit = 2048 , settingsKeyLogger = \_ -> return ()+ , settingsNumberOfWorkers = numberOfWorkers defaultServerConfig+ , settingsConcurrentStreams = defaultMaxStreams+ , settingsStreamWindowSize = defaultMaxStreamData+ , settingsConnectionWindowSize = defaultMaxData }
http2-tls.cabal view
@@ -1,22 +1,23 @@-cabal-version: >=1.10-name: http2-tls-version: 0.1.0-license: BSD3-license-file: LICENSE-maintainer: Kazu Yamamoto <kazu@iij.ad.jp>-author: Kazu Yamamoto <kazu@iij.ad.jp>-homepage: https://github.com/kazu-yamamoto/http2-tls-synopsis: Library for HTTP/2 over TLS-description:- Using the HTTP/2 library over TLS--category: Network-build-type: Simple+cabal-version: >=1.10+name: http2-tls+version: 0.2.0+license: BSD3+license-file: LICENSE+maintainer: Kazu Yamamoto <kazu@iij.ad.jp>+author: Kazu Yamamoto <kazu@iij.ad.jp>+homepage: https://github.com/kazu-yamamoto/http2-tls+synopsis: Library for HTTP/2 over TLS+description: Using the HTTP/2 library over TLS+category: Network+build-type: Simple source-repository head type: git location: https://github.com/kazu-yamamoto/http2-tls +flag crypton+ description: Use the crypton-x509-* package family instead of x509-*+ library exposed-modules: Network.HTTP2.TLS.Client@@ -35,14 +36,25 @@ ghc-options: -Wall build-depends: base >=4.9 && <5,- bytestring,- crypton-x509-store,- crypton-x509-validation,- data-default-class,- http2 >= 4.2.0,- network,- network-run >=0.2.6,- recv,- time-manager,- tls >=1.7.0,- unliftio+ bytestring >= 0.10 && < 0.12,+ http2 >=5.0 && < 5.1,+ data-default-class >= 0.1 && < 0.2,+ network >= 3.1.4 && < 3.2,+ time-manager >= 0.0.1 && < 0.1,+ unliftio >= 0.2 && < 0.3,+ network-run >= 0.2.6 && < 0.3,+ network-control >= 0.0.2 && < 0.1,+ recv >= 0.1.0 && < 0.2,+ tls >= 1.9 && < 1.10++ if flag(crypton)+ build-depends:+ tls >=1.9,+ crypton-x509-store >= 1.6 && < 1.7,+ crypton-x509-validation >= 1.6 && < 1.7++ else+ build-depends:+ tls <1.7,+ x509-store,+ x509-validation