module Network.HTTP2.Client.RawConnection (
RawHttp2Connection (..)
, newRawHttp2Connection
) where
import Data.ByteString (ByteString)
import Network.Connection (connectTo, initConnectionContext, ConnectionParams(..), TLSSettings(..), connectionPut, connectionGetExact, connectionClose)
import qualified Network.HTTP2 as HTTP2
import Network.Socket (HostName, PortNumber)
import qualified Network.TLS as TLS
data RawHttp2Connection = RawHttp2Connection {
_sendRaw :: ByteString -> IO ()
, _nextRaw :: Int -> IO ByteString
, _close :: IO ()
}
newRawHttp2Connection :: HostName
-> PortNumber
-> Maybe TLS.ClientParams
-> IO RawHttp2Connection
newRawHttp2Connection host port mparams = do
ctx <- initConnectionContext
conn <- connectTo ctx connParams
let putRaw dat = connectionPut conn dat
let getRaw amount = connectionGetExact conn amount
let doClose = connectionClose conn
putRaw HTTP2.connectionPreface
return $ RawHttp2Connection putRaw getRaw doClose
where
overwriteALPNHook params = (TLS.clientHooks params) {
TLS.onSuggestALPN = return $ Just [ "h2", "h2-17" ]
}
modifyParams params = params { TLS.clientHooks = overwriteALPNHook params }
connParams = ConnectionParams host port (TLSSettings . modifyParams <$> mparams) Nothing