warp-quic-0.0.0: Network/Wai/Handler/WarpQUIC.hs
{-# LANGUAGE OverloadedStrings #-}
-- | WAI handler for HTTP/3 based on QUIC.
module Network.Wai.Handler.WarpQUIC where
import qualified Data.ByteString as BS
import qualified Network.HQ.Server as HQ
import qualified Network.HTTP3.Server as H3
import Network.QUIC
import Network.QUIC.Server as Q
import Network.TLS (cipherID)
import Network.Wai
import Network.Wai.Handler.Warp hiding (run)
import Network.Wai.Handler.Warp.Internal
-- | QUIC server settings.
type QUICSettings = ServerConfig
-- | Running warp with HTTP/3 on QUIC.
runQUIC :: QUICSettings -> Settings -> Application -> IO ()
runQUIC quicsettings settings app = do
withII settings $ \ii ->
Q.run quicsettings $ \conn -> do
info <- getConnectionInfo conn
mccc <- clientCertificateChain conn
let addr = remoteSockAddr info
malpn = alpn info
transport = QUIC {
quicNegotiatedProtocol = malpn
, quicChiperID = cipherID $ cipher info
, quicClientCertificate = mccc
}
pread = pReadMaker ii
timmgr = timeoutManager ii
conf = H3.Config H3.defaultHooks pread timmgr
case malpn of
Nothing -> return ()
Just appProto -> do
let runX | "h3" `BS.isPrefixOf` appProto = H3.run
| otherwise = HQ.run
runX conn conf $ http2server settings ii transport addr app