haskellnet-ssl/src/Network/HaskellNet/SSL.hs
Daniel P. Wright f910cef262 Create Settings structure to make maxLineLength configurable
This commit simply adds the structure without actually exposing it in
the interface.
2014-01-17 15:24:48 +09:00

58 lines
1.7 KiB
Haskell

module Network.HaskellNet.SSL
( Settings (..)
, defaultSettingsWithPort
, 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 ()
data Settings = Settings
{ sslPort :: PortNumber
, sslMaxLineLength :: Int
}
defaultSettingsWithPort :: PortNumber -> Settings
defaultSettingsWithPort p = Settings
{ sslPort = p
, sslMaxLineLength = 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 -> Settings -> BSStream
connectionToStream c cfg = BSStream
{ bsGet = connectionGetBytes c
, bsPut = connectionPut c
, bsFlush = return ()
, bsClose = connectionClose c
, bsIsOpen = return True
, bsGetLine = connectionGetLine maxl c
} where maxl = sslMaxLineLength cfg
connectSSL :: String -> Settings -> IO BSStream
connectSSL hostname cfg = do
c <- initConnectionContext >>= flip connectTo params
return $ connectionToStream c cfg
where params = ConnectionParams hostname port (Just def) Nothing
port = sslPort cfg
connectPlain :: String -> Settings -> IO (BSStream, STARTTLS)
connectPlain hostname cfg = do
ctx <- initConnectionContext
c <- connectTo ctx params
return (connectionToStream c cfg, connectionSetSecure ctx c def)
where params = ConnectionParams hostname port Nothing Nothing
port = sslPort cfg