@@ -1,5 +1,6 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE RankNTypes #-}
2{-# LANGUAGE RankNTypes #-}
3module Network.Wai.Handler.WarpTLS
4module Network.Wai.Handler.WarpTLS
4 ( TLSSettings (..)
5 ( TLSSettings (..)
@@ -38,12 +39,23 @@ runTLSSocket :: TLSSettings -> Settings -> Socket -> Application -> IO ()
38runTLSSocket tset set sock app = do
39runTLSSocket tset set sock app = do
39 certs <- readCertificates $ certFile tset
40 certs <- readCertificates $ certFile tset
40 pk <- readPrivateKey $ keyFile tset
41 pk <- readPrivateKey $ keyFile tset
42+#if MIN_VERSION_tls(1, 0, 0)
44+ TLS.updateServerParams
45+ (\sp -> sp { TLS.serverWantClientCert = False }) $
46+ TLS.defaultParamsServer
47+ { TLS.pAllowedVersions = [TLS.SSL3,TLS.TLS10,TLS.TLS11,TLS.TLS12]
48+ , TLS.pCiphers = ciphers
49+ , TLS.pCertificates = zip certs $ (Just pk):repeat Nothing
41 let params = TLS.defaultParams
52 let params = TLS.defaultParams
42 { TLS.pWantClientCert = False
53 { TLS.pWantClientCert = False
43 , TLS.pAllowedVersions = [TLS.SSL3,TLS.TLS10,TLS.TLS11,TLS.TLS12]
54 , TLS.pAllowedVersions = [TLS.SSL3,TLS.TLS10,TLS.TLS11,TLS.TLS12]
44 , TLS.pCiphers = ciphers
55 , TLS.pCiphers = ciphers
45 , TLS.pCertificates = zip certs $ (Just pk):repeat Nothing
56 , TLS.pCertificates = zip certs $ (Just pk):repeat Nothing
47 runSettingsConnection set (getter params sock) app
59 runSettingsConnection set (getter params sock) app
49 retry :: Socket -> TLS.TLSParams -> Socket -> SomeException -> IO (Connection, SockAddr)
61 retry :: Socket -> TLS.TLSParams -> Socket -> SomeException -> IO (Connection, SockAddr)
@@ -63,6 +75,17 @@ runTLSSocket tset set sock app = do
63 if maybe False ((== 0x16) . fst) (firstBS >>= B.uncons)
75 if maybe False ((== 0x16) . fst) (firstBS >>= B.uncons)
65 gen <- newGenIO
77 gen <- newGenIO
78+#if MIN_VERSION_tls(1, 0, 0)
79+ ctx <- TLS.contextNew
81+ { TLS.backendFlush = return ()
82+ , TLS.backendClose = return ()
83+ , TLS.backendSend = \bs -> C.yield bs C.$$ toClient
84+ , TLS.backendRecv = getNext . takeMost
87+ (gen :: SystemRandom)
66 ctx <- TLS.serverWith
89 ctx <- TLS.serverWith
68 (gen :: SystemRandom)
91 (gen :: SystemRandom)
@@ -70,6 +93,7 @@ runTLSSocket tset set sock app = do
70 (return ()) -- flush
93 (return ()) -- flush
71 (\bs -> C.yield bs C.$$ toClient)
94 (\bs -> C.yield bs C.$$ toClient)
72 (getNext . takeMost)
95 (getNext . takeMost)
73 TLS.handshake ctx
97 TLS.handshake ctx
74 let conn = Connection
98 let conn = Connection
75 { connSendMany = TLS.sendData ctx . L.fromChunks
99 { connSendMany = TLS.sendData ctx . L.fromChunks