module Network.HaskellNet.SSL ( connectSSL
, connectPlain
) where
import Network.Connection
import Network.HaskellNet.BSStream
import Network.Socket.Internal (PortNumber)
import qualified Data.ByteString.Char8 as B
import Data.Default
type STARTTLS = IO ()
maxLineLength :: Int
maxLineLength = 10000
connectionGetBytes :: Connection -> Int -> IO B.ByteString
connectionGetBytes = loop B.empty where
loop buf _ 0 = return buf
loop buf c l = connectionGet c l >>= nextIteration
where nextIteration b = loop (buf `B.append` b) c $ l B.length b
connectionToStream :: Connection -> BSStream
connectionToStream c = BSStream
{ bsGet = connectionGetBytes c
, bsPut = connectionPut c
, bsFlush = return ()
, bsClose = connectionClose c
, bsIsOpen = return True
, bsGetLine = connectionGetLine maxLineLength c
}
connectSSL :: String -> PortNumber -> IO BSStream
connectSSL hostname port = do
c <- initConnectionContext >>= flip connectTo params
return $ connectionToStream c
where params = ConnectionParams hostname port (Just def) Nothing
connectPlain :: String -> PortNumber -> IO (BSStream, STARTTLS)
connectPlain hostname port = do
ctx <- initConnectionContext
c <- connectTo ctx params
return (connectionToStream c, connectionSetSecure ctx c def)
where params = ConnectionParams hostname port Nothing Nothing