@@ -31,6 +31,7 @@ module Network.Wai.Handler.WarpTLS (
31 , tlsWantClientCert
31 , tlsWantClientCert
32 , tlsServerHooks
32 , tlsServerHooks
33 , tlsServerDHEParams
33 , tlsServerDHEParams
34+ , tlsSessionManagerConfig
34 , onInsecure
35 , onInsecure
35 , OnInsecure (..)
36 , OnInsecure (..)
36 -- * Runner
37 -- * Runner
@@ -60,6 +61,7 @@ import Network.Socket.ByteString (sendAll)
60import qualified Network.TLS as TLS
61import qualified Network.TLS as TLS
61import qualified Crypto.PubKey.DH as DH
62import qualified Crypto.PubKey.DH as DH
62import qualified Network.TLS.Extra as TLSExtra
63import qualified Network.TLS.Extra as TLSExtra
64+import qualified Network.TLS.SessionManager as SM
63import Network.Wai (Application)
65import Network.Wai (Application)
64import Network.Wai.Handler.Warp
66import Network.Wai.Handler.Warp
65import Network.Wai.Handler.Warp.Internal
67import Network.Wai.Handler.Warp.Internal
@@ -129,6 +131,15 @@ data TLSSettings = TLSSettings {
129 -- Default: Nothing
131 -- Default: Nothing
131 -- Since 3.2.2
133 -- Since 3.2.2
134+ , tlsSessionManagerConfig :: Maybe SM.Config
135+ -- ^ Configuration for in-memory TLS session manager.
136+ -- If Nothing, 'TLS.noSessionManager' is used.
137+ -- Otherwise, an in-memory TLS session manager is created
138+ -- according to 'Config'.
134-- | Default 'TLSSettings'. Use this to create 'TLSSettings' with the field record name (aka accessors).
145-- | Default 'TLSSettings'. Use this to create 'TLSSettings' with the field record name (aka accessors).
@@ -147,6 +158,7 @@ defaultTlsSettings = TLSSettings {
147 , tlsWantClientCert = False
158 , tlsWantClientCert = False
148 , tlsServerHooks = def
159 , tlsServerHooks = def
149 , tlsServerDHEParams = Nothing
160 , tlsServerDHEParams = Nothing
161+ , tlsSessionManagerConfig = Nothing
152-- taken from stunnel example in tls-extra
164-- taken from stunnel example in tls-extra
@@ -239,10 +251,13 @@ runTLSSocket tlsset@TLSSettings{..} set sock app = do
239 key <- maybe (S.readFile keyFile) return mkey
251 key <- maybe (S.readFile keyFile) return mkey
240 either error return $
252 either error return $
241 TLS.credentialLoadX509ChainFromMemory cert chainCertsMemory key
253 TLS.credentialLoadX509ChainFromMemory cert chainCertsMemory key
254+ mgr <- case tlsSessionManagerConfig of
255+ Nothing -> return TLS.noSessionManager
256+ Just config -> SM.newSessionManager config
242− runTLSSocket' tlsset set credential sock app
257+ runTLSSocket' tlsset set credential mgr sock app
244−runTLSSocket' :: TLSSettings -> Settings -> TLS.Credential -> Socket -> Application -> IO ()
259+runTLSSocket' :: TLSSettings -> Settings -> TLS.Credential -> TLS.SessionManager -> Socket -> Application -> IO ()
245−runTLSSocket' tlsset@TLSSettings{..} set credential sock app =
260+runTLSSocket' tlsset@TLSSettings{..} set credential mgr sock app =
246 runSettingsConnectionMakerSecure set get app
261 runSettingsConnectionMakerSecure set get app
248 get = getter tlsset sock params
263 get = getter tlsset sock params
@@ -260,7 +275,8 @@ runTLSSocket' tlsset@TLSSettings{..} set credential sock app =
260 (if settingsHTTP2Enabled set then Just alpn else Nothing)
275 (if settingsHTTP2Enabled set then Just alpn else Nothing)
262 shared = def {
277 shared = def {
263− TLS.sharedCredentials = TLS.Credentials [credential]
278+ TLS.sharedCredentials = TLS.Credentials [credential]
279+ , TLS.sharedSessionManager = mgr
265 supported = def { -- TLS.Supported
281 supported = def { -- TLS.Supported
266 TLS.supportedVersions = tlsAllowedVersions
282 TLS.supportedVersions = tlsAllowedVersions