module Happstack.Server.SimpleTLS
     ( TLSConf(..)
     , nullTLSConf
     , simpleHTTPS
     , simpleHTTPS'
     ) where

import Data.Maybe                    (fromMaybe)
import Happstack.Server              (ToMessage(..), UnWebT, ServerPartT, simpleHTTP'', mapServerPartT, runValidator)
import Happstack.Server.Internal.Cryptonite.TLS (TLSConf(..), nullTLSConf, listenTLS)

-- |start the https:\/\/ server, and handle requests using the supplied
-- 'ServerPart'.
--
-- This function will not return, though it may throw an exception.
--
simpleHTTPS :: (ToMessage a) =>
               TLSConf           -- ^ tls server configuration
            -> ServerPartT IO a  -- ^ server part to run
            -> IO ()
simpleHTTPS = simpleHTTPS' id

-- | similar 'simpleHTTPS' but allows you to supply a function to convert 'm' to 'IO'.
simpleHTTPS' :: (ToMessage b, Monad m, Functor m) =>
                (UnWebT m a -> UnWebT IO b)
            -> TLSConf
            -> ServerPartT m a
            -> IO ()
simpleHTTPS' toIO tlsConf hs =
    listenTLS tlsConf (\req -> runValidator (fromMaybe return (tlsValidator tlsConf)) =<< (simpleHTTP'' (mapServerPartT toIO hs) req))