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
-> TLS.ClientParams
-> IO RawHttp2Connection
newRawHttp2Connection host port params = 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
overwrittenALPNHook = (TLS.clientHooks params) {
TLS.onSuggestALPN = return $ Just [ "h2", "h2-17" ]
}
modifiedParams = params { TLS.clientHooks = overwrittenALPNHook }
connParams = ConnectionParams host port (Just . TLSSettings $ modifiedParams) Nothing